¿Cómo puedo imprimir todo el contenido de Wordnet (preferiblemente con NLTK)?

NLTK proporciona funciones para imprimir todas las palabras en el cuerpo de Brown (o Gutenberg). Pero la función equivalente no parece funcionar en Wordnet.

¿Hay una manera de hacer esto a través de NLTK? Si no hay, ¿cómo podría uno hacerlo?

Esto funciona:

from nltk.corpus import brown as b print b.words() 

Esto causa un AttributeError:

 from nltk.corpus import wordnet as wn print wn.words() 

Para wordnet, es un recurso de sentido de la palabra por lo que los elementos del recurso son indexados por los sentidos (también conocidos como synsets ).

Para iterar a través de synsets :

 >>> from nltk.corpus import wordnet as wn >>> for ss in wn.all_synsets(): ... print ss ... print ss.definition() ... break ... Synset('able.a.01') (usually followed by `to') having the necessary means or skill or know-how or authority to do something 

Para cada sincronismo (sentido / concepto), hay una lista de palabras adjuntas, llamadas lemmas : lemas son la forma canónica (“raíz”) de las palabras que utilizamos cuando revisamos un diccionario.

Para obtener una lista completa de los lemas en wordnet usando una sola línea:

 >>> lemmas_in_wordnet = set(chain(*[ss.lemma_names() for ss in wn.all_synsets()])) 

Curiosamente, wn.words() también devolverá todos los lemma_names :

 >>> lemmas_in_words = set(i for i in wn.words()) >>> len(lemmas_in_wordnet) 148730 >>> len(lemmas_in_words) 147306 

Pero, extrañamente, hay algunas discrepancias en cuanto al número total de palabras recostackdas con wn.words() .

“Imprimir el contenido completo” de wordnet en el texto parece ser algo demasiado ambicioso, porque wordnet está estructurado como un gráfico jerárquico, con synsets interconectados entre sí y cada synset tiene sus propias propiedades / atributos. Es por eso que los archivos wordnet no se guardan simplemente como un único archivo de texto.

Para ver lo que contiene un synset:

 >>> first_synset = next(wn.all_synsets()) >>> dir(first_synset) ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_hypernyms', '_definition', '_examples', '_frame_ids', '_hypernyms', '_instance_hypernyms', '_iter_hypernym_lists', '_lemma_names', '_lemma_pointers', '_lemmas', '_lexname', '_max_depth', '_min_depth', '_name', '_needs_root', '_offset', '_pointers', '_pos', '_related', '_shortest_hypernym_paths', '_wordnet_corpus_reader', 'also_sees', 'attributes', 'causes', 'closure', 'common_hypernyms', 'definition', 'entailments', 'examples', 'frame_ids', 'hypernym_distances', 'hypernym_paths', 'hypernyms', 'hyponyms', 'instance_hypernyms', 'instance_hyponyms', 'jcn_similarity', 'lch_similarity', 'lemma_names', 'lemmas', 'lexname', 'lin_similarity', 'lowest_common_hypernyms', 'max_depth', 'member_holonyms', 'member_meronyms', 'min_depth', 'name', 'offset', 'part_holonyms', 'part_meronyms', 'path_similarity', 'pos', 'region_domains', 'res_similarity', 'root_hypernyms', 'shortest_path_distance', 'similar_tos', 'substance_holonyms', 'substance_meronyms', 'topic_domains', 'tree', 'unicode_repr', 'usage_domains', 'verb_groups', 'wup_similarity'] 

Pasar a través de este howto sería útil para saber cómo acceder a la información que necesita en wordnet: http://www.nltk.org/howto/wordnet.html

Por favor intenta lo siguiente:

 for word in wn.words(): print word 

Esto debería funcionar porque wn.words() es en realidad un iterador que genera una secuencia de cadenas, en lugar de una lista de cadenas como b.words . El bucle for hace que el iterador genere las palabras una a la vez.

 from nltk.corpus import wordnet as wn synonyms=[] for word in wn.words(): print (word,end=":") for syn in wn.synsets(word): for l in syn.lemmas(): synonyms.append(l.name()) print(set(synonyms),end="\n") synonyms.clear()