【发布时间】:2014-01-27 06:31:40
【问题描述】:
我想找到两个同义词集之间的相关性,我遇到了许多算法,如 resnik、lin、wu palmer、path algorithm、leacock chodorow 等。有人能告诉我这些算法中哪一个最有效吗?
【问题讨论】:
-
我为github.com/alvations/pywsd添加了最大化相似性功能
我想找到两个同义词集之间的相关性,我遇到了许多算法,如 resnik、lin、wu palmer、path algorithm、leacock chodorow 等。有人能告诉我这些算法中哪一个最有效吗?
【问题讨论】:
首先,OP 有点混淆了相关性和相似性,区别很好但值得注意。
语义相关性衡量两个概念的相关程度,使用任何类型的关系;算法:
语义相似度只考虑 IS-A 关系(即上位/下位);算法:
Resnik、Jiang-Conrath 和 Lin 测量基于信息内容。同义词集的信息内容是 -log 该同义词集中所有单词的所有概率(根据语料库频率计算)的总和(Resnik,1995)。
Wu-Palmer 和 Leacock-Chodorow 基于路径长度;两个概念/synsets之间的相似性取决于它们之间最短路径上的节点数。
上面给出的列表并不详尽,但从历史上看,我们可以看到使用相似性度量有点过时了,因为相关性算法考虑了更多的关系,理论上应该提供更多的消除歧义的能力来比较概念。
接下来,效率定义不明确。是速度还是准确性?语义相关性/相似性将应用于哪个任务?
如果任务是词义消歧 (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 年。作为上下文表示的词汇链,用于检测和纠正畸形,第 13 章, 第 305-332 页。麻省理工学院出版社,马萨诸塞州剑桥市。
席达斯·帕特瓦丹。 2003. 结合字典和语料库信息 化为语义相关性的上下文向量度量。硕士论文,大学 明尼苏达州。
(懒得列出所有引用,请适当搜索并附加到此答案)
【讨论】:
从“给我看一个例子”的角度来看,这里有一个例子来展示如何使用语义相似性来执行 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 并且偶然发现一些流氓词与歧义词的同义词之一具有相关同义词,那么最大化是否合乎逻辑?【讨论】: