WordNet Python的单词相似度

时间:2017-01-22 17:14:47

标签: python nlp nltk semantics

我正试图找到一种可靠的方法来衡量2个术语的语义相似性。 第一个指标可能是下位/上位图上的路径距离(最终,2-3个指标的线性组合可能更好......)。

from nltk.corpus import wordnet as wn
dog = wn.synset('dog.n.01')
cat = wn.synset('cat.n.01')
print(dog.path_similarity(cat))
  • 我仍然没有得到n.01的含义以及为什么有必要。
  • 有一种方法可以直观地显示两个术语之间的计算路径吗?
  • 我可以使用哪种其他nltk语义指标?

1 个答案:

答案 0 :(得分:6)

<强> 1。我仍然不知道n.01的含义以及为什么有必要。

来自here

source of nltk显示结果为import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.contains; import java.util.Collection; import java.util.List; import org.junit.Before; import org.junit.Test; public class ABCImplTest { private ABCImpl abcImpl; @Before public void setup() { abcImpl = new ABCImpl(); } @Test public void testGetSrc() throws Exception { List<String> result = abcImpl.getSrc(new DEF(), new XYZ()); assertThat((Collection<String>) result, is(not(empty()))); assertThat(result, contains("default", "another-default")); } @Test public void testABCImplGetSrc() throws Exception { List<String> result = abcImpl.getSrcImpl(new DEF(), new XYZ()); assertThat((Collection<String>) result, is(not(empty()))); assertThat(result, contains("default", "another-default", "implementation")); } }

引用消息来源:

"WORD.PART-OF-SPEECH.SENSE-NUMBER"

n 意味着名词,我还建议阅读wordnet dataset

<强> 2。有一种方法可以直观地显示两个术语之间的计算路径吗?

请查看相似性部分的nltk wordnet docs。那里你有几种路径算法选择(你可以尝试混合几种)。

来自nltk docs的几个例子:

Create a Lemma from a "<word>.<pos>.<number>.<lemma>" string where:
<word> is the morphological stem identifying the synset
<pos> is one of the module attributes ADJ, ADJ_SAT, ADV, NOUN or VERB
<number> is the sense number, counting from 0.
<lemma> is the morphological form of interest

对于可视化,您可以构建距离矩阵from nltk.corpus import wordnet as wn dog = wn.synset('dog.n.01') cat = wn.synset('cat.n.01') print(dog.path_similarity(cat)) print(dog.lch_similarity(cat)) print(dog.wup_similarity(cat)) ,其中:

M[i,j]

并使用以下stackoverflow answer绘制可视化效果。

第3。我可以使用哪种其他nltk语义指标?

如上所述,有几种方法可以计算单词的相似性。我还建议调查gensim。我将word2vec实现用于单词相似性,它对我来说效果很好。

如果您需要任何帮助选择算法,请提供有关您所面临问题的更多信息。

更新

有关单词M[i,j] = word_similarity(i, j)的更多信息,可以找到here

  

WordNet中的感官通常从最常用到最少使用,最常见的编号为1 ......

问题在于&#34;狗&#34;是模棱两可的,你必须为它选择正确的含义。

您可能会选择第一种感觉作为天真的方法,或根据您的应用或研究找到您自己的算法来选择正确的含义。

要获取wordnet中单词的所有可用定义(在wordnet docs上称为 synsets ),您只需调用sense number

我鼓励您深入研究每个定义中这些synset中包含的元数据。

下面的代码显示了一个获取此元数据并将其打印得很好的简单示例。

wn.synsets(word)

代码输出:

from nltk.corpus import wordnet as wn

dog_synsets = wn.synsets('dog')

for i, syn in enumerate(dog_synsets):
    print('%d. %s' % (i, syn.name()))
    print('alternative names (lemmas): "%s"' % '", "'.join(syn.lemma_names()))
    print('definition: "%s"' % syn.definition())
    if syn.examples():
        print('example usage: "%s"' % '", "'.join(syn.examples()))
    print('\n')