2014-12-17 30 views
11

Jakiś czas temu ktoś na SO zapytał how to retrieve a list of words for a given synset używając opakowania wordnet NLTK. Oto jeden z sugerowanych odpowiedzi:Wyodrębnij słowo z Synsetu za pomocą Wordnet w NLTK 3.0

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

Uruchomienie tego kodu z NLTK 3,0 rentowności TypeError: 'instancemethod' object is not subscriptable.

Próbowałem każdego z wcześniej proponowanych rozwiązań (każde z rozwiązań opisanych na stronie powyżej), ale każdy zgłasza błąd. Dlatego chciałem zapytać: czy możliwe jest wydrukowanie słów na listę zestawów synchronizacyjnych za pomocą NLTK 3.0? Byłbym wdzięczny za rady, które inni mogą zaoferować w tej sprawie.

+0

Czy istnieje powód użycia najnowszej wersji NLTK w porównaniu do bardziej stabilnej (choć wcześniejszej) wersji ? – user3898238

+0

Pracuję w kontekstach wielojęzycznych i myślałem, że Open Multilingual Wordnet został zaimplementowany tylko w wersji 3.0. Jeśli był dostępny we wcześniejszych iteracjach, to jednak jestem w uszach! – duhaime

+0

Wygląda na to, że OMW jest już dostępny przez NLTK od jakiegoś czasu. Spróbuję wrócić do wcześniejszego i stabilniejszego wydania ... – duhaime

Odpowiedz

14

WordNet działa poprawnie w wersji NLTK 3.0. Po prostu uzyskujesz dostęp do lematów (i nazw) w niewłaściwy sposób. Spróbuj to zamiast:

>>> 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 to metoda i nie ma sposobu __getitem__() (a więc nie jest subscriptable).

+0

doskonały - dziękuję! – duhaime

+1

@duhaime Cieszę się, że to działa! –

+0

Otrzymuję błąd w tej składni: nltk .__ wersja __ '3.0.0' Moja wersja NLTK jest 3.2.1, próbowałem nltk .__ wersja__ "3.2.1". Ale dostaję błąd. –

9

Można także przejść bezpośrednio do nazw lematu z lemma_names():

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

I to działa dla wielu języków:

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