Извлечение Word из Synset с использованием Wordnet в NLTK 3.0

Некоторое время назад кто-то из SO спросил как получить список слов для данного синхронизма, используя обертку NLTK wordnet. Вот один из предложенных ответов:

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

Запуск этого кода с помощью NLTK 3.0 дает TypeError: 'instancemethod' object is not subscriptable.

Я попробовал каждое из ранее предложенных решений (каждое из решений, описанных на странице, приведенной выше), но каждый из них вызывает ошибку. Поэтому я хотел спросить: возможно ли напечатать слова для списка синтезаторов с NLTK 3.0? Я был бы благодарен за любые советы, которые другие могут предложить по этому вопросу.

Ответ 1

WordNet отлично работает в NLTK 3.0. Вы просто обращаетесь к леммам (и именам) неправильно. Вместо этого попробуйте:

>>> 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 - метод и не имеет метода __getitem__() (и, следовательно, не подлежит расшифровке).

Ответ 2

Вы также можете перейти непосредственно к именам лемм с помощью lemma_names():

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

И он работает для нескольких языков

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