De vérifier la similarité entre deux mots avec NLTK avec Python
J'ai deux listes et je veux vérifier la similitude entre chaque mots dans les deux liste et de trouver le maximum de similitude.Voici mon code,
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))
Mais il en résultera une erreur:
wordFromList2 = wordnet.synsets(word2)[0]
IndexError: list index out of range
Merci de m'aider à résoudre ce problème.
En vous remerciant
- FWIW, voici un lien vers la doc pour
.synsets
: nltk.org/api/... - jetez un oeil à github.com/alvations/pywsd/blob/master/pywsd/similarity.py#L76
Vous devez vous connecter pour publier un commentaire.
Vous obtenez une erreur si un synset liste est vide, et vous essayez d'obtenir l'élément (inexistant) indice zéro. Mais pourquoi seulement vérifier le zéro-ième élément? Si vous voulez tout vérifier, essayer toutes les paires d'éléments retournés synsets. Vous pouvez utiliser
itertools.product()
pour vous sauver deux pour-boucles:C'est inefficace parce que le même synsets sont regarda de nouveau et de nouveau, mais il est le plus proche de la logique de votre code. Si vous avez assez de données pour faire de la vitesse d'un problème, vous pouvez l'accélérer en recueillant les synsets pour tous les mots de la
list1
etlist2
une fois, et de prendre le produit de la synsets.Essayez de vérifier si ces listes sont vides avant de les utiliser ensuite:
if len...
ligne sera une erreur de syntaxe. Pouvez également tester laif len(blah1) and len(blah2):
depuis, il a juste besoin de savoir qu'ils ne sont pas vides. Si un retour à vide à partir de .synsets sont rares, d'autres suggèrent sans doute juste attraper les IndexError.blah
de ne pas avoir de synonymes à l'intérieur d'une deuxième liste est très commun, donc j'ai utilisé si le blocif wordFromList2 and wordFromList2: ...
. Vide listes sont considérés comme False.