Semantic Relatedness Algorithms - python
我想找到两个同义词集之间的相关性,我遇到了许多算法,如 resnik、lin、wu palmer、path 算法、leacock chodorow 等。有人能告诉我这些算法中哪一种最有效吗?
首先,OP 在相关性和相似性之间有点混淆,区别很好,但值得注意。
语义相关性衡量两个概念的相关程度,使用任何类型的关系;算法:
- 词汇链(Hirst 和 St-Onge,1998 年)
- 适应/扩展感知重叠算法(Banerjee 和 Pedersen,2002/2003)
- 矢量化感知重叠(Patwardhan,2003 年)
语义相似度只考虑IS-A关系(即hypernymy/hyponymy);算法:
- Wu-Palmer 测度(Wu 和 Palmer 1994)
- Resnik 测量 (Resnik 1995)
- Jiang-Conrath 测度(Jiang 和 Conrath 1997)
- Leacock-Chodorow 测量(Leacock 和 Chodorow 1998)
- 林测(Lin 1998)
Resn??ik、Jiang-Conrath 和 Lin 度量基于信息内容。同义词集的信息内容是 -log 该同义词集中所有单词的所有概率(从语料库频率计算)的总和(Resnik,1995)。
Wu-Palmer 和 Leacock-Chodorow 基于路径长度;两个概念/同义词集之间的相似度分别是它们之间最短路径上的节点数。
上面给出的列表并不详尽,但从历史上看,我们可以看到使用相似性度量有点过时,因为相关性算法考虑更多的关系,理论上应该提供更多的消歧能力来比较概念。
接下来,效率定义不明确。是速度还是准确性?语义相关性/相似性将应用于哪个任务?
如果任务是词义消歧 (WSD),那么最好参考 Warin\\'s (2004) 的论文:http://goo.gl/6wWums。或者更新的调查是 Navigli\\'s (2009) http://dl.acm.org/citation.cfm?id=1459355
如果就 WSD 而言,还有更复杂的工具/技术,请参阅有人知道一些好的词义消歧软件吗?
参考文献
Satanjeev Banerjee 和 Ted Pedersen。 2002. 使用 WordNet 进行词义消歧的自适应 Lesk 算法。在第三届计算语言学和智能文本处理国际会议论文集 (CICLing \\'02) 中,Alexander F. Gelbukh(主编)。 Springer-Verlag, London, UK, UK, 136-145.
Satanjeev Banerjee 和 Ted Pedersen。 2003. 扩展光泽重叠作为语义相关性的度量。在第十八届国际人工智能联合会议论文集,第 805-810 页,阿卡普尔科。
Graeme Hirst 和 David St-Onge,1998 年。作为上下文表示的词汇链,用于检测和纠正不当行为,第 13 章,
第 305-332 页。麻省理工学院出版社,马萨诸塞state剑桥。
悉达斯·帕瓦丹。 2003. 结合字典和语料库信息
转换为语义相关性的上下文向量度量。硕士论文,大学
明尼苏达state。
(懒得列出所有引文,请适当搜索并附加到此答案)
从"给我看一个例子"的angular来看,这里有一个例子来展示如何使用语义相似性来执行 WSD:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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)
小心使用上面的代码,因为你需要考虑: