4

我需要从事一个需要 NLTK 的项目,所以我两周前开始学习 Python,但很难理解 Python 和 NLTK。

从 NLTK 文档中,我可以理解以下代码,如果我在下面的代码中手动添加单词 apple 和 pear,它们可以很好地工作。

from nltk.corpus import wordnet as wn

apple = wn.synset('apple.n.01')
pear = wn.synset('pear.n.01')

print apple.lch_similarity(pear)

Output: 2.53897387106

但是,我需要使用 NLTK 来处理项目列表。例如,我有一个下面的项目列表,我想将 list1 中的项目与 list2 进行比较 - 例如:将 list1 中的 word1 与列表 2 中的每个单词进行比较,然后将 list1 中的 word2 与 list2 中的每个单词进行比较,直到所有单词list1 进行比较。

list1 = ["apple", "honey", "drinks", "flowers", "paper"]
list2 = ["pear", "shell", "movie", "fire", "tree", "candle"]

wordFromList1 = list1[0]
wordFromList2 = list2[0]

wordFromList1 = wn.synset(wordFromList1)
wordFromList2 = wn.synset(wordFromList2)    

print wordFromList1.lch_similarity(wordFromList2)

上面的代码当然会出错。谁能告诉我如何将变量传递给synset 方法 [wn.synset(*pass_variable_in_here*)] 以便我可以使用双循环来获取它们的 lch_similarity 值。谢谢你。

4

1 回答 1

5

wordnet.synset需要一个由3 部分组成的名称字符串,格式为: word.pos.nn.

您没有为和 pos.nn中的每个单词指定部分。list1list2

假设所有单词都是名词似乎是合理的,因此我们可以尝试将字符串附加到and'.n.01'中的每个字符串:list1list2

for word1, word2 in IT.product(list1, list2):
    wordFromList1 = wordnet.synset(word1+'.n.01')
    wordFromList2 = wordnet.synset(word2+'.n.02')

但是,这不起作用。wordnet.synset('drinks.n.01')提出一个WordNetError

另一方面,同一个文档页面显示您可以使用以下方法查找相似的单词synsets

例如,wordnet.synsets('drinks')返回列表:

[Synset('drink.n.01'),
 Synset('drink.n.02'),
 Synset('beverage.n.01'),
 Synset('drink.n.04'),
 Synset('swallow.n.02'),
 Synset('drink.v.01'),
 Synset('drink.v.02'),
 Synset('toast.v.02'),
 Synset('drink_in.v.01'),
 Synset('drink.v.05')]

所以在这一点上,你需要考虑一下你想让程序做什么。如果您可以选择此列表中的第一项作为 的代理drinks,那么您可以使用

for word1, word2 in IT.product(list1, list2):
    wordFromList1 = wordnet.synsets(word1)[0]
    wordFromList2 = wordnet.synsets(word2)[0]

这将导致一个看起来像这样的程序:

import nltk.corpus as corpus
import itertools as IT

wordnet = corpus.wordnet
list1 = ["apple", "honey", "drinks", "flowers", "paper"]
list2 = ["pear", "shell", "movie", "fire", "tree", "candle"]

for word1, word2 in IT.product(list1, list2):
    # print(word1, word2)
    wordFromList1 = wordnet.synsets(word1)[0]
    wordFromList2 = wordnet.synsets(word2)[0]
    print('{w1}, {w2}: {s}'.format(
        w1 = wordFromList1.name,
        w2 = wordFromList2.name,
        s = wordFromList1.lch_similarity(wordFromList2)))

产生

apple.n.01, pear.n.01: 2.53897387106
apple.n.01, shell.n.01: 1.07263680226
apple.n.01, movie.n.01: 1.15267950994
apple.n.01, fire.n.01: 1.07263680226
...
于 2013-01-15T12:51:55.503 回答