4

NLTK を必要とするプロジェクトに取り組む必要があるため、2 週間前に 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 を list 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ます。

一方、同じ doc ページ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 に答える