Extract Word from Synset using Wordnet in NLTK 3.0

26,718

Solution 1

WordNet works fine in NLTK 3.0. You are just accessing the lemmas (and names) in the wrong way. Try this instead:

>>> 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 is a method and does not have a __getitem__() method (and so is not subscriptable).

Solution 2

You can also go directly to the lemma names with lemma_names():

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

And it works for multiple languages

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

Solution 3

Use:

wn.synset('dog.n.1').name() 

instead of:

wn.synset('dog.n.1').name 

because NLTK changed Synset properties to get functions instead. see https://github.com/nltk/nltk/commit/ba8ab7e23ea2b8d61029484098fd62d5986acd9c

This is a good list of changes to NLTK's API to suit py3.x: https://github.com/nltk/nltk/wiki/Porting-your-code-to-NLTK-3.0

Share:
26,718
duhaime
Author by

duhaime

I'm helping startups build the future at Y Combinator 🚀

Updated on July 10, 2022

Comments

  • duhaime
    duhaime almost 2 years

    Some time ago, someone on SO asked how to retrieve a list of words for a given synset using NLTK's wordnet wrapper. Here is one of the suggested responses:

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

    Running this code with NLTK 3.0 yields TypeError: 'instancemethod' object is not subscriptable.

    I tried each of the previously-proposed solutions (each of the solutions described on the page linked above), but each throws an error. I therefore wanted to ask: Is it possible to print the words for a list of synsets with NLTK 3.0? I would be thankful for any advice others can offer on this question.

  • Rajesh Mappu
    Rajesh Mappu about 8 years
    I am getting error at this syntax : nltk.__version__'3.0.0' My NLTK version is 3.2.1, I tried nltk.__version__ '3.2.1'. But getting error.