python - 使用 NLTK 和 Python 检查两个单词之间的相似性

标签 python nltk similarity

我有两个列表,我想检查两个列表中每个单词之间的相似度并找出最大相似度。这是我的代码,

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

请帮我解决这个问题。
谢谢你

最佳答案

如果同义词集列表为空,您将收到错误消息,并且您尝试获取(不存在的)索引为零的元素。但是为什么只检查第零个元素呢?如果您想检查所有内容,请尝试返回的同义词集中的所有元素对。您可以使用 itertools.product() 为自己节省两个 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))

这是低效的,因为会一次又一次地查找相同的同义词集,但它最接近您的代码逻辑。如果您有足够的数据来解决速度问题,您可以通过收集 list1list2 中所有单词的同义词集 一次 来加快速度,并获取同义词集的乘积。

>>> 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'))

关于python - 使用 NLTK 和 Python 检查两个单词之间的相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30829382/

相关文章:

python - matplotlib 中的随机向量图

python - 如何在 OS X 10.9 上使用 Python 2.7.8 和 Sublime Text 3 访问 MySQL Python Connector

python - 如何使用箭头获取两个日期之间的秒数?

python - 如何使用 Python NLTK 将字符串中的数字转换为单词?

python - 使用 Wordnet 生成最高级、比较级和形容词

python - 如何告诉Python调试器完成程序?

nlp - 什么是 UIMA CAS(公共(public)注释结构)的 NLTK 等价物?

Java:平等器? (从对象集合中删除重复项)

c++ - 在 C++ 中,您将如何对字符串进行排序以使字谜彼此接近?

lucene - 如何在 Lucene 中对类似文档进行评分?