关于 nlp:语义相关性算法 – python

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)

小心使用上面的代码,因为你需要考虑:

  • 当我们试图最大化上下文句子中所有标记的所有可能同义词集与歧义词的可能同义词集之间的路径相似性时,真正发生了什么?
  • 如果大多数路径相似性产生 None 并且您偶然得到一些与歧义词的同义词集有相关同义词集的流氓词,那么最大化是否合乎逻辑?