Nlp 排序关键字识别的度量

Nlp 排序关键字识别的度量,nlp,information-retrieval,Nlp,Information Retrieval,我正试图确定使用哪个指标来评估从两个不同文本集合中提取的重要关键词的排名列表中的词汇(单词列表)的“覆盖率”。这两个列表没有任何共同术语。重要的是,只有排名前n的单词被视为“正确”,而排名后m的单词被视为“不正确” 下面是一个虚拟示例,其中有一个排名的关键字列表和4个不同的词典,每个词典都包含列表中的一些单词 rank keyword lexicon_1 lexicon_2 lexicon_3 lexicon_4 1 apple False True

我正试图确定使用哪个指标来评估从两个不同文本集合中提取的重要关键词的排名列表中的词汇(单词列表)的“覆盖率”。这两个列表没有任何共同术语。重要的是,只有排名前n的单词被视为“正确”,而排名后m的单词被视为“不正确”

下面是一个虚拟示例,其中有一个排名的关键字列表和4个不同的词典,每个词典都包含列表中的一些单词

rank  keyword    lexicon_1  lexicon_2  lexicon_3  lexicon_4
1     apple      False      True       True       False
2     orange     False      True       True       False
3     banana     False      False      True       False
4     pear       False      False      True       False
5     kiwifruit  True       False      True       False
6     watermelon True       False      True       False
-----------------------------------------------------------
7     car        False      False      False      True
8     bus        False      False      False      True
9     truck      True       False      False      True
10    bike       False      True       False      True
因此直觉是,词典中包含的高排名关键词(1-6)越多越好,而包含的低排名关键词(7-10)越少越好

计算精确度(p)、召回率(R)和F分数(F)是量化和比较覆盖率的一种方法。因此,真阳性(TP)是指词典包含正确的单词时,假阳性(FP)是指词典包含错误的单词时,真阴性(TN)是指词典排除错误的单词时,假阴性(FN)是指词典排除正确的单词时。考虑到这一点,例如,对于
词典1
,它给出:

TP=2, FP=1, TN=3, FN=4
P = 2 / (2 + 1)    R = 2 / (2 + 4)    F = 2 * 0.67 * 0.33 / (0.67 + 0.33)
  = 0.67             = 0.33             = 0.44
对于
lexicon_2
我们还得到
F=0.44
。对于
lexicon\u 3
我们得到
F=1.00
,对于
lexicon\u 4
我们得到
F=0
(未定义)。因此,我们可以看到词典
1
2
位于
3
(最佳)和
4
(最差)之间,但这并没有考虑到
lexicon\u 2
lexicon\u 1
具有更高等级的单词这一事实,因此应该得到更有利的评价

在这些情况下,是否有任何衡量标准会考虑单词的排名?我知道
平均精度
平均精度
,这是检索结果排名的原因,但我不确定这些指标是否适合这种情况

编辑1:

我已经实现了我对这种情况的理解:

def avep(df,词典名称):
"""
从中计算每个词典的平均精度
存储预先计算的精确度和召回分数
在数据帧中。
"""
aveps={}
对于词典名称中的l:
ap=0.0
对于范围内的i(len(df)):
p_i=df.iloc[i]['p_'+l]
如果i>0:
dr_i=df.iloc[i]['r_'+l]-df.iloc[i-1]['r_'+l]
其他:
dr_i=0.0
ap+=p_i*dr_i
aveps[l]=ap
返回aveps
这给了我以下结果:

Lexicon     p                   r                   f                   AP                  
-------     -                   -                   -                   --                  
lexicon_1 : 0.6666666666666666  0.2857142857142857  0.4                 0.2857142857142857  
lexicon_2 : 0.6666666666666666  0.2857142857142857  0.4                 0.14285714285714285 
lexicon_3 : 1.0                 1.0                 1.0                 0.8571428571428571  
lexicon_4 : 0.0                 0.0                 0.0                 0.0     
但是对于
lexicon_1
来说,这比
lexicon_2
的结果要好,这与我想要的正好相反(而且AP可疑地等于
lexicon_1
的召回和
lexicon_2
2x召回)。此外,不确定如何处理未定义召回差异的第一行(使用0)。对于“完美的”
词典3
,这会产生一个小于1.0的值

任何更好的建议都将不胜感激

编辑2:

下面是我对RobertBaron提供的解决方案的Python实现:

def覆盖率度量(df、词典名称):
分数={}
max_score=int(“”.join([str(x)表示df.index中的x]))
对于词典名称中的l:
正确的分数=int(“”.join([str(x)代表df.loc[df[l]==True].index]))
不正确的分数=int(“”.join([str(x)代表df.loc[df[l]==False].index]))
分数[l]=(正确分数-错误分数)/最高分数
分数=排序(scores.items(),key=lambda x:x[1],reverse=True)
返回分数
这是RobertBaron解决方案所需的数字转换的实现(据我所知):

def int2base(n,b):
"""
算法的实现;在http://www.cs.trincoll.edu/~ram/cpsc110/inclass/conversions.html
"""
x=''
当n>0时:
d=整数(不适用)
r=n%b
x+=str(r)
n=d
返回整数(x)

这是一个度量标准。有n+m个等级。因此,从基数n+m+1的数字中为每个关键字分配一个数字,使排名最高的关键字具有最大的数字。在您的示例中,我们有10个关键字,因此数字从基数11开始,从A到1(使用十六进制数字),如下所示

rank  digit  keyword    lexicon_1  lexicon_2  lexicon_3  lexicon_4
1     A      apple      False      True       True       False
2     9      orange     False      True       True       False
3     8      banana     False      False      True       False
4     7      pear       False      False      True       False
5     6      kiwifruit  True       False      True       False
6     5      watermelon True       False      True       False
------------------------------------------------------------------
7     4      car        False      False      False      True
8     3      bus        False      False      False      True
9     2      truck      True       False      False      True
10    1      bike       False      True       False      True
对于每个词典,覆盖率指标的计算如下。对于正确的关键字,从最高等级开始,通过连接词典中关键字的数字来建立一个数字。例如,对于我们的4个词汇,我们分别有
65
A9
A98765
、和
0
。对不正确的关键字执行相同的操作。这为我们提供了
2
1
0
4321
。最后的度量是通过减去为每个词典构建的两个数字来获得的,即,
65
-
1
=
64
A9
-
1
=
A8
A98765
-
0
=
A98765
,以及
0
-
4321

如果需要范围
[0 1]
中的度量,可以除以
A98765
,这是本例中词典可以具有的最大值

为方便起见,可以将基数n+m+1转换为基数10进行计算。看

在我们的示例中,即基数11,对于词典1,我们需要将
65
1
A98765
转换为基数10。我们有:

6x111+5x110=71

1 x 110=1

10x115+9x114+8x113+7x112+6x111+5x110=1753845

词汇1的度量是(71-1)/1753845=0.000039912307

示例中有一个小错误。因为我们可以有负值,所以可能值的范围从
-4321