2014-07-09 10 views
5

Gibt es einen Weg in Python 2.7 mit NLTK, um nur das Wort zu bekommen und nicht die zusätzliche Formatierung, die "synset" und die Klammern und die "n.01" usw. enthält?Wie drucke ich nur das Wort selbst in einem WordNet-Synset mit Python NLTK?

Zum Beispiel, wenn ich

 wn.synsets('dog') 

Meine Ergebnisse wie folgt aussehen:

[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')] 

Wie kann ich stattdessen eine Liste wie diese erhalten?

dog 
frump 
cad 
frank 
pawl 
andiron 
chase 

Gibt es eine Möglichkeit, dies NLTK mit tun oder muss ich regular expressions benutzen? Kann ich regular expressions in einem Python-Skript verwenden?

+0

gemäß Regel 'enthält„Synset“und die Klammern und die„n.01“' '' frank' und chase' nicht Teil sein sollte die gewünschte Ausgabe? – Braj

+0

nicht verwandt mit der Frage, aber "frank" ist ein Synonym für "frankfurter", das ein Synonym für "Hot Dog" oder "Hund" ist. In ähnlicher Weise bedeutet "Hund" wie ein Verb "jagen". – aelfric5578

+0

Ich sehe einen leicht ironischen Fehler, um ironische Farbtöne zu treffen ... – JonathanHayward

Antwort

3

Wenn Sie dies ohne reguläre Ausdrücke tun möchten, können Sie ein Listenverständnis verwenden.

Was Sie hier tun, sagt, dass für jedes Synset das erste Wort vor dem Punkt zurückgeben.

+0

Stellen Sie sicher, dass Sie name() anstelle von name verwenden, NLTK hat diese Funktion leicht geändert. – frogbandit

3

Try this:

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

Sie wollen über jede Synset für Hund iterieren und dann das Stichwort des Synset ausdrucken. Beachten Sie, dass mehrere Wörter auf den gleichen Synset befestigen könnte, wenn Sie also alle Wörter mit allen Synsets für Hunde verbunden bekommen möchten, können Sie tun:

for synset in wn.synsets('dog'): 
    for lemma in synset.lemmas: 
     print lemma.name 
+0

Leider ist das erste Snipped-Throw-Objekt 'instancemethod' nicht subscriptfähig' und das zweite Snippet löst 'TypeError:' instancemethod '-Objekt ist nicht iterable' mit NLTK 3.0 – duhaime

+2

@duhaime Aus was früher Attribute wurden, sind Methoden geworden. Sie müssen tun 'synset.lemmas() [0] .name()' – rlms

+0

Vielen Dank für das Nachschlagen! – duhaime

1

Lemma Namen verwenden könnte funktionieren, aber es ist ein kanonische Variable für den Synset Namen für das Synset Objekt, versuchen:

>>> from nltk.corpus import wordnet as wn 
>>> wn.synset('dog.n.1') 
Synset('dog.n.01') 
>>> wn.synset('dog.n.1').name 
'dog.n.01' 
>>> wn.synset('dog.n.1').name.partition('.')[0] 
'dog' 
>>> for ss in wn.synsets('dog'): 
...  print ss.name.partition('.')[0] 
... 
dog 
frump 
dog 
cad 
frank 
pawl 
andiron 
chase 
+0

Wissen Sie, ob eine ähnliche Methode in NLTK 3.0 verfügbar ist? Ich bekomme einen Fehler beim Ausführen der Partition Linie "'Funktion' Objekt hat kein Attribut 'Partition'" – duhaime

+3

@ Duhaime, verwenden Sie 'wn.synset ('dog.n.1'). Name()' weil NLTK Synset Eigenschaften geändert um stattdessen Funktionen zu erhalten. siehe https://github.com/alvations/pywsd/issues/6 – alvas

+0

Ausgezeichnet! Das hilft ein bisschen - danke! – duhaime

Verwandte Themen