2014-12-17 10 views
11

Vor einiger Zeit fragte jemand auf SO how to retrieve a list of words for a given synset mit NLTK's Wordnet Wrapper. Hier ist eine der vorgeschlagenen Antworten:Extrahiere Word von Synset mit Wordnet in NLTK 3.0

for synset in wn.synsets('dog'): 
    print synset.lemmas[0].name 

diesen Code Laufen mit NLTK 3,0 Ausbeuten TypeError: 'instancemethod' object is not subscriptable.

Ich habe jede der zuvor vorgeschlagenen Lösungen (jede der auf der oben verlinkten Seite beschriebenen Lösungen) versucht, aber jeder wirft einen Fehler. Ich wollte deshalb fragen: Ist es möglich, die Wörter für eine Liste von Synsets mit NLTK 3.0 zu drucken? Ich wäre dankbar für jeden Rat, den andere zu dieser Frage anbieten können.

+0

Gibt es einen Grund für die Verwendung der neuesten NLTK gegenüber stabileren (wenn auch früheren) Version ? – user3898238

+0

Ich arbeite in mehrsprachigen Kontexten, und ich dachte, das Open Multilingual Wordnet wurde nur in 3.0 implementiert. Wenn es in früheren Iterationen verfügbar war, bin ich ganz Ohr! – duhaime

+0

Es sieht so aus, als ob OMW seit einiger Zeit über NLTK verfügbar ist. Ich werde versuchen, zu einer früheren und stabileren Version zurückzukehren ... – duhaime

Antwort

14

WordNet funktioniert gut in NLTK 3.0. Sie greifen nur falsch auf die Lemmas (und Namen) zu. Versuchen Sie stattdessen:

>>> import nltk 
>>> nltk.__version__ 
'3.0.0' 
>>> from nltk.corpus import wordnet as wn 
>>> for synset in wn.synsets('dog'): 
    for lemma in synset.lemmas(): 
     print lemma.name() 


dog 
domestic_dog 
Canis_familiaris 
frump 
dog 
dog 
cad 
bounder 
blackguard 
... 

synset.lemmas ein Verfahren ist, und nicht eine __getitem__() Methode hat (und so ist nicht subscriptable).

+0

ausgezeichnet - danke, ihr! – duhaime

+1

@duhaime Froh, dass es funktioniert hat! –

+0

Ich erhalte Fehler bei dieser Syntax: nltk .__ Version __ '3.0.0' Meine NLTK-Version ist 3.2.1, ich versuchte nltk .__ version__ '3.2.1'. Aber Fehler bekommen. –

9

Sie auch direkt an den Lemma-Namen mit lemma_names() gehen:

>>> wordnet.synset('dog.n.1').lemma_names() 
['dog', 'domestic_dog', 'Canis_familiaris'] 

Und es funktioniert für mehrere Sprachen

>>>> wordnet.synset('dog.n.1').lemma_names(lang='jpn') 
['イヌ', 'ドッグ', '洋犬', '犬', '飼犬', '飼い犬'] 
Verwandte Themen