web-dev-qa-db-fra.com

Extraire Word de Synset à l'aide de Wordnet dans NLTK 3.0

Il y a quelque temps, quelqu'un sur SO a demandé comment récupérer une liste de mots pour un synset donné en utilisant le wrapper wordnet de NLTK. Voici l'une des réponses suggérées:

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

L'exécution de ce code avec NLTK 3.0 donne TypeError: 'instancemethod' object is not subscriptable.

J'ai essayé chacune des solutions proposées précédemment (chacune des solutions décrites sur la page liée ci-dessus), mais chacune génère une erreur. Je voulais donc demander: est-il possible d'imprimer les mots pour une liste de synsets avec NLTK 3.0? Je serais reconnaissant pour tout conseil que d'autres pourraient offrir sur cette question.

14
duhaime

WordNet fonctionne correctement dans NLTK 3.0. Vous accédez simplement aux lemmes (et aux noms) de la mauvaise façon. Essayez plutôt ceci:

>>> 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 Est une méthode et n'a pas de méthode __getitem__() (et n'est donc pas indexable).

15

Vous pouvez également accéder directement aux noms des lemmes avec lemma_names():

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

Et cela fonctionne pour plusieurs langues

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

Utilisation:

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

au lieu de:

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

car NLTK a modifié les propriétés de Synset pour obtenir des fonctions à la place. voir https://github.com/nltk/nltk/commit/ba8ab7e23ea2b8d61029484098fd62d5986acd9c

Ceci est une bonne liste de modifications apportées à l'API de NLTK pour l'adapter à py3.x: https://github.com/nltk/nltk/wiki/Porting-your-code-to-NLTK-3.

7
alvas