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