2017-07-24 3 views
1

Wenn ich eine Liste von Wörtern in Python haben, wie:Finden kleinsten gemeinsamen hypernym mehrere Wörter in WordsNet (Python) gegeben

words = ["blue", "red", "ball"] 

Gibt es eine Möglichkeit, um programmatisch die Hypernyme für diese Gruppe von Wörtern zu produzieren mit WordNet ?

+0

Die kurze Antwort ist ja, die genaue Antwort hängt von Ihren Parametern ab. Sagen Sie für zwei Wörter, es gibt die Funktion [lowest_common_hypernyms] (http://www.nltk.org/howto/wordnet_lch.html), aber [es hatte in der Vergangenheit einige Probleme] (https://github.com/nltk/nltk/issues/395). Für eine Liste von Wörtern [wird es komplizierter] (https://stackoverflow.com/questions/30605807/nltk-wordnet-synset-for-word-phrase). Also las ich diese, probierte sie aus und fügte den Code ein, um zu zeigen, was Sie wirklich tun und wo Sie stecken bleiben. – JGreenwell

Antwort

1

Zuerst, siehe https://stackoverflow.com/a/29478711/610569, um den Unterschied zwischen "Sense" (Synset/Konzept) vs "Wörter" (im Zusammenhang mit Wordnet, Lemmas) zu beachten.

Gegeben zwei Synsets (NICHT Worte) ist es möglich, den kleinsten gemeinsamen hypernym zwischen ihnen zu finden:

>>> from nltk.corpus import wordnet as wn 

# A word can represent multiple meaning (aka synsets) 
>>> wn.synsets('dog') 
[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')] 

>>> wn.synsets('cat') 
[Synset('cat.n.01'), Synset('guy.n.01'), Synset('cat.n.03'), Synset('kat.n.01'), Synset('cat-o'-nine-tails.n.01'), Synset('caterpillar.n.02'), Synset('big_cat.n.01'), Synset('computerized_tomography.n.01'), Synset('cat.v.01'), Synset('vomit.v.01')] 

>>> wn.synsets('dog')[0].definition() 
u'a member of the genus Canis (probably descended from the common wolf) that has been domesticated by man since prehistoric times; occurs in many breeds' 

>>> wn.synsets('cat')[0].definition() 
u'feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats' 

>>> dog = wn.synsets('dog')[0] 
>>> cat = wn.synsets('cat')[0] 


>>> cat.lowest_common_hypernyms(dog) 
[Synset('carnivore.n.01')] 

http://www.nltk.org/howto/wordnet_lch.html Siehe

Ist kleinsten gemeinsamen Hypernyme zuverlässig?

Wordnet ist eine handgefertigte Ressource, so wie zuverlässig es hängt davon ab, wie und warum die Synset unter der ganzen WordNet Ontologie

erstellt wurden

Kann ich diese Informationen für meine NLP Aufgabe verwenden?

Vielleicht ... Aber am wahrscheinlichsten ist es nicht nützlich.

Kann es mehr als 2 Synsets vergleichen?

Nicht genau. Sie müssen mehrere paarweise Suchvorgänge durchführen, z.

>>> mouse = wn.synsets('mouse')[0] 
>>> cat = wn.synsets('cat')[0] 
>>> dog = wn.synsets('dog')[0] 

>>> dog.lowest_common_hypernyms(cat) 
[Synset('carnivore.n.01')] 
>>> cat.lowest_common_hypernyms(mouse) 
[Synset('placental.n.01')] 
>>> dog.lowest_common_hypernyms(mouse) 
[Synset('placental.n.01')] 

>>> placental = dog.lowest_common_hypernyms(mouse)[0] 
>>> carnivore = dog.lowest_common_hypernyms(cat)[0] 
>>> placental.lowest_common_hypernyms(carnivore) 
[Synset('placental.n.01')] 

Aber Sie können sehen, wie ineffizient es ist. So ist es einfacher, wenn Sie Ihren eigenen Code umschreiben, um die WordNet-Ontologie zu durchlaufen und den niedrigsten gemeinsamen Hypernym zu finden, der N no gegeben wird. von Synsets, anstatt es paarweise zu tun.

Verwandte Themen