web-dev-qa-db-ja.com

Python

2つのリストがあり、2つのリストの各単語間の類似性をチェックして、最大の類似性を見つけたいと思います。これが私のコードです。

from nltk.corpus import wordnet

list1 = ['Compare', 'require']
list2 = ['choose', 'copy', 'define', 'duplicate', 'find', 'how', 'identify', 'label', 'list', 'listen', 'locate', 'match', 'memorise', 'name', 'observe', 'omit', 'quote', 'read', 'recall', 'recite', 'recognise', 'record', 'relate', 'remember', 'repeat', 'reproduce', 'retell', 'select', 'show', 'spell', 'state', 'tell', 'trace', 'write']
list = []

for Word1 in list1:
    for Word2 in list2:
        wordFromList1 = wordnet.synsets(Word1)[0]
        wordFromList2 = wordnet.synsets(Word2)[0]
        s = wordFromList1.wup_similarity(wordFromList2)
        list.append(s)

print(max(list)) 

しかし、これはエラーになります:

wordFromList2 = wordnet.synsets(Word2)[0]
        IndexError: list index out of range

これを修正するのを手伝ってください。
ありがとう

8
Punuth

シンセットリストが空の場合、エラーが発生し、(存在しない)インデックス0の要素を取得しようとします。しかし、なぜ0番目の要素のみをチェックするのでしょうか。すべてをチェックしたい場合は、返されたシンセットの要素のすべてのペアを試してください。 itertools.product()を使用すると、2つのforループを節約できます。

from itertools import product
sims = []

for Word1, Word2 in product(list1, list2):
    syns1 = wordnet.synsets(Word1)
    syns2 = wordnet.synsets(Word2)
    for sense1, sense2 in product(syns1, syns2):
        d = wordnet.wup_similarity(sense1, sense2)
        sims.append((d, syns1, syns2))

同じsynsetが何度も検索されるため、これは非効率的ですが、コードのロジックに最も近いものです。速度を問題にするのに十分なデータがある場合は、list1およびlist2once、およびsynsetの積を取ります。

>>> allsyns1 = set(ss for Word in list1 for ss in wordnet.synsets(Word))
>>> allsyns2 = set(ss for Word in list2 for ss in wordnet.synsets(Word))
>>> best = max((wordnet.wup_similarity(s1, s2) or 0, s1, s2) for s1, s2 in 
        product(allsyns1, allsyns2))
>>> print(best)
(0.9411764705882353, Synset('command.v.02'), Synset('order.v.01'))
11
alexis

使用する前に、これらのリストが空かどうかを確認してください。

from nltk.corpus import wordnet

list1 = ['Compare', 'require']
list2 = ['choose', 'copy', 'define', 'duplicate', 'find', 'how', 'identify', 'label', 'list', 'listen', 'locate', 'match', 'memorise', 'name', 'observe', 'omit', 'quote', 'read', 'recall', 'recite', 'recognise', 'record', 'relate', 'remember', 'repeat', 'reproduce', 'retell', 'select', 'show', 'spell', 'state', 'tell', 'trace', 'write']
list = []

for Word1 in list1:
    for Word2 in list2:
        wordFromList1 = wordnet.synsets(Word1)
        wordFromList2 = wordnet.synsets(Word2)
        if wordFromList1 and wordFromList2: #Thanks to @alexis' note
            s = wordFromList1[0].wup_similarity(wordFromList2[0])
            list.append(s)

print(max(list))
8
omerbp