我想找到两个synset之间的相关性,我遇到了许多算法,如resnik,lin,wu palmer,路径算法,leacock chodorow等。有人可以告诉我哪些算法最有效吗?
答案 0 :(得分:5)
首先,OP在相关性和相似性之间有点混淆,区别很好,但值得注意。
语义相关性使用任何一种关系来衡量两个概念的相关性;算法:
语义相似性仅考虑IS-A关系(即上位词/下位词);算法:
Resnik,Jiang-Conrath和Lin的措施基于信息内容。 synset的信息内容是-log,即该synset中所有单词的所有概率(从语料库频率计算)的总和(Resnik,1995)。
Wu-Palmer和Leacock-Chodorow基于路径长度;两个概念/同义词之间的相似性分别是沿着它们之间最短路径的节点数。
上面给出的列表是无穷无尽的,但从历史上看,我们可以看到使用相似性度量有点过时,因为相关性算法考虑了更多关系,理论上应该给出更多消除比较概念的能力。
下一步,效率定义不明确。有关速度或准确性?对于哪个任务,应用语义相关性/相似性?
如果任务是Word Sense Disambiguation(WSD),那么可以参考Warin(2004)的论文:http://goo.gl/6wWums。或者更新的调查是Navigli(2009)http://dl.acm.org/citation.cfm?id=1459355
如果涉及WSD,有更复杂的工具/技术,请参阅Anyone know of some good Word Sense Disambiguation software?
<强>参考强>
Satanjeev Banerjee和Ted Pedersen。 2002.使用WordNet进行词义消歧的改进Lesk算法。在第三届计算语言学和智能文本处理国际会议论文集(CICLing '02),Alexander F. Gelbukh(编辑)。 Springer-Verlag,伦敦,英国,英国,136-145。
Satanjeev Banerjee和Ted Pedersen。 2003.扩展光泽重叠作为语义相关性的衡量标准。 “第十八届国际人工智能联合会议论文集”,第805-810页,阿卡普尔科。
Graeme Hirst和David St-Onge,1998年。词汇链作为检测和纠正Malapropisms的语境表示,第13章, 第305-332页。麻省理工学院出版社,马萨诸塞州剑桥。
Siddarth Patwardhan。 2003.结合字典和语料库信息 - 将信息转化为语义相关性的上下文向量度量。硕士论文,大学 明尼苏达州。
(懒得列出所有引文,请搜索并适当地附加到这个答案)
答案 1 :(得分:1)
从“给我看一个例子”的角度来看,这是一个展示如何使用语义相似性来执行WSD的例子:
from nltk.corpus import wordnet as wn
from nltk.tokenize import word_tokenize
def max_wupa(context_sentence, ambiguous_word):
"""
WSD by Maximizing Wu-Palmer Similarity.
Perform WSD by maximizing the sum of maximum Wu-Palmer score between possible
synsets of all words in the context sentence and the possible synsets of the
ambiguous words (see http://goo.gl/XMq2BI):
{argmax}_{synset(a)}(\sum_{i}^{n}{{max}_{synset(i)}(Wu-Palmer(i,a))}
Wu-Palmer (1994) similarity is based on path length; the similarity between
two synsets accounts for the number of nodes along the shortest path between
them. (see http://acl.ldc.upenn.edu/P/P94/P94-1019.pdf)
"""
result = {}
for i in wn.synsets(ambiguous_word):
result[i] = sum(max([i.wup_similarity(k) for k in wn.synsets(j)]+[0]) \
for j in word_tokenize(context_sentence))
result = sorted([(v,k) for k,v in result.items()],reverse=True)
return result
bank_sents = ['I went to the bank to deposit my money',
'The river bank was full of dead fishes']
ans = max_wupa(bank_sents[0], 'bank')
print ans
print ans[0][1].definition
(来源:pyWSD @ github)
请谨慎使用上述代码,因为您需要考虑:
None
,那么