Python: pasar variables a los métodos de Wordnet Synsets en NLTK

Necesito trabajar en un proyecto que requiera NLTK, así que comencé a aprender Python hace dos semanas pero luchando por entender Python y NLTK.

De la documentación de NLTK, puedo entender los siguientes códigos y funcionan bien si agrego manualmente la palabra manzana y pera en los códigos a continuación.

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 

Sin embargo, necesito usar el NLTK para trabajar con una lista de elementos. Por ejemplo, tengo una lista de elementos a continuación y me gustaría comparar los elementos de list1 con list2; por ejemplo: comparar word1 de list1 con cada palabra en la lista 2, luego word2 de list1 con cada palabra de list2 hasta todas las palabras en Se compara la lista1.

 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) 

Los códigos de arriba, por supuesto, da un error. ¿Alguien me puede mostrar cómo puedo pasar una variable al método de sincronización [wn.synset (* pass_variable_in_here *)] para que pueda usar un bucle doble para obtener los valores de lch_similarity para ellos? Gracias.

wordnet.synset espera una cadena de nombre de 3 partes de la forma: word.pos.nn

No especificó la parte pos.nn para cada palabra en list1 y list2 .

Parece razonable suponer que todas las palabras son sustantivos, por lo que podríamos intentar '.n.01' la cadena '.n.01' a cada cadena en list1 y list2 :

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

Eso no funciona, sin embargo. wordnet.synset('drinks.n.01') genera un WordNetError .

Por otro lado, la misma página de documentos muestra que puede buscar palabras similares utilizando el método de synsets :

Por ejemplo, wordnet.synsets('drinks') devuelve la lista:

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

Entonces, en este punto, debe reflexionar sobre lo que quiere que haga el progtwig. Si está de acuerdo con elegir el primer artículo de esta lista como un proxy para las drinks , entonces puede usar

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

lo que resultaría en un progtwig que se parece a esto:

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

cuyos rendimientos

 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 ...