2010-09-13 14 views
21

Ich bin neu zu NLTK Python und ich bin auf der Suche nach einer Beispielanwendung, die Wort Sinn Disambiguierung tun kann. Ich habe viele Algorithmen in den Suchergebnissen, aber keine Beispielanwendung. Ich möchte nur einen Satz übergeben und will den Sinn jedes Wortes durch Bezugnahme auf die Wordnet-Bibliothek wissen. DankeWort Sinn Disambiguation in NLTK Python

Ich habe ein ähnliches Modul in PERL gefunden. http://marimba.d.umn.edu/allwords/allwords.html Gibt es ein solches Modul in NLTK Python?

+1

hier ist eine Python-Implementierung: https: // github .com/alvations/pywsd – alvas

Antwort

-1

Ja ist es mit dem Wordnet-Modul in NLTK möglich. Die Ähnlichkeitsmessungen, die in dem Tool verwendet werden, das in Ihrem Beitrag erwähnt wird, gibt es auch im NLTK-Wordnet-Modul.

0

NLTK apis Wordnet zuzugreifen. Wordnet platziert Wörter als Synsets. Dies würde Ihnen einige Informationen über das Wort, seine Hypernyme, Hyponyme, Wurzelwort usw. geben.

"Python Textverarbeitung mit NLTK 2.0 Kochbuch" ist ein gutes Buch, um Sie zu verschiedenen Funktionen von NLTK zu beginnen. Es ist leicht zu lesen, zu verstehen und zu implementieren.

Sie können auch auf andere Papiere (außerhalb des Bereichs von NLTK) schauen, die über die Verwendung von Wikipedia für Wort Sinn Disambiguierung spricht.

7

Ja, tatsächlich gibt es a book, dass das NLTK-Team schrieb, das mehrere Kapitel über die Klassifizierung hat und sie explizit abdecken how to use WordNet. Sie können auch eine physische Version des Buches von Safari kaufen.

FYI: NLTK wird von natürlichsprachiger Programmierung Akademiker für den Einsatz in ihren einführenden Programmierkursen geschrieben.

+4

Soweit ich verstehe, ist dieses Kapitel der Klassifikation gewidmet, aber es ist nicht sehr in Wort Sinn Disambiguierung. – geekazoid

3

Als eine praktische Antwort auf die Anfrage des OP, hier ist eine Python-Implementierung mehrerer WSD Methoden, die Sinne in Form von NLTK des Synset (s) liefert, https://github.com/alvations/pywsd

Es enthält

  • Lesk Algorithmen (schließt original Lesk, angepasst Lesk und einfache Lesk)
  • Basis Algorithmen (Random Sinn, erste Sinn, Most Frequent Sense)

Es kann als solche verwendet werden:

#!/usr/bin/env python -*- coding: utf-8 -*- 

bank_sents = ['I went to the bank to deposit my money', 
'The river bank was full of dead fishes'] 

plant_sents = ['The workers at the industrial plant were overworked', 
'The plant was no longer bearing flowers'] 

print "======== TESTING simple_lesk ===========\n" 
from lesk import simple_lesk 
print "#TESTING simple_lesk() ..." 
print "Context:", bank_sents[0] 
answer = simple_lesk(bank_sents[0],'bank') 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

print "#TESTING simple_lesk() with POS ..." 
print "Context:", bank_sents[1] 
answer = simple_lesk(bank_sents[1],'bank','n') 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

print "#TESTING simple_lesk() with POS and stems ..." 
print "Context:", plant_sents[0] 
answer = simple_lesk(plant_sents[0],'plant','n', True) 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

print "======== TESTING baseline ===========\n" 
from baseline import random_sense, first_sense 
from baseline import max_lemma_count as most_frequent_sense 

print "#TESTING random_sense() ..." 
print "Context:", bank_sents[0] 
answer = random_sense('bank') 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

print "#TESTING first_sense() ..." 
print "Context:", bank_sents[0] 
answer = first_sense('bank') 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

print "#TESTING most_frequent_sense() ..." 
print "Context:", bank_sents[0] 
answer = most_frequent_sense('bank') 
print "Sense:", answer 
print "Definition:",answer.definition 
print 

[out]:

======== TESTING simple_lesk =========== 

#TESTING simple_lesk() ... 
Context: I went to the bank to deposit my money 
Sense: Synset('depository_financial_institution.n.01') 
Definition: a financial institution that accepts deposits and channels the money into lending activities 

#TESTING simple_lesk() with POS ... 
Context: The river bank was full of dead fishes 
Sense: Synset('bank.n.01') 
Definition: sloping land (especially the slope beside a body of water) 

#TESTING simple_lesk() with POS and stems ... 
Context: The workers at the industrial plant were overworked 
Sense: Synset('plant.n.01') 
Definition: buildings for carrying on industrial labor 

======== TESTING baseline =========== 
#TESTING random_sense() ... 
Context: I went to the bank to deposit my money 
Sense: Synset('deposit.v.02') 
Definition: put into a bank account 

#TESTING first_sense() ... 
Context: I went to the bank to deposit my money 
Sense: Synset('bank.n.01') 
Definition: sloping land (especially the slope beside a body of water) 

#TESTING most_frequent_sense() ... 
Context: I went to the bank to deposit my money 
Sense: Synset('bank.n.01') 
Definition: sloping land (especially the slope beside a body of water) 
11

Kürzlich , Teil des Codes pywsd wurde in die neueste Version von NLTK 'in derportiertModul, versuchen:

>>> from nltk.wsd import lesk 
>>> sent = 'I went to the bank to deposit my money' 
>>> ambiguous = 'bank' 
>>> lesk(sent, ambiguous) 
Synset('bank.v.04') 
>>> lesk(sent, ambiguous).definition() 
u'act as the banker in a game or in gambling' 

Für eine bessere WSD Leistung, verwenden Sie die pywsd Bibliothek anstelle des NLTK Modul.Im Allgemeinen ist simple_lesk() von pywsd besser als lesk von NLTK. Ich werde versuchen, das NLTK Modul so viel wie möglich zu aktualisieren, wenn ich frei bin.


In Antwort auf Chris Spencer Kommentar Sie bitte die Einschränkungen Lesk Algorithmen beachten. Ich gebe einfach eine genaue Implementierung der Algorithmen. Es ist kein Allheilmittel, http://en.wikipedia.org/wiki/Lesk_algorithm

Geben Sie bitte auch zur Kenntnis, dass obwohl:

lesk("My cat likes to eat mice.", "cat", "n") 

nicht wahr, die richtige Antwort geben, können Sie pywsd Implementierung von max_similarity() verwenden:

>>> from pywsd.similarity import max_similiarity 
>>> max_similarity('my cat likes to eat mice', 'cat', 'wup', pos='n').definition 
'feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats' 
>>> max_similarity('my cat likes to eat mice', 'cat', 'lin', pos='n').definition 
'feline mammal usually having thick soft fur and no ability to roar: domestic cats; wildcats' 

@ Chris, wenn du ein Python setup.py willst, mache einfach eine höfliche Anfrage, ich schreibe es ...

+1

Leider ist die Genauigkeit ziemlich gottverdammt. 'lesk (" Meine Katze isst gerne Mäuse. "," Katze "," n ")' => 'Synset ('computerized_tomography.n.01')'. Und pywsd hat noch nicht einmal ein Installationsskript ... – Cerin

+1

Lieber Chris, hast du andere Varianten von Lesk ausprobiert? Esp. 'simple_lesk()' oder 'adapted_lesk'? Es ist bekannt, dass der ursprüngliche Lesekopf Probleme hat, daher die anderen Lösungen, die im Paket verfügbar sind. http://en.wikipedia.org/wiki/Lesk_algorithm. Außerdem behalte ich in meiner Freizeit und es ist nicht das, was ich für einen Lebensunterhalt ... – alvas

+1

Ja, ich probierte jede Variante von Lesk in Ihrem Paket, und keiner arbeitete an meinem Beispielkorpus. Ich musste eine Variante erstellen, die auch Glossen aus allen Hyponymen und Meronymen benutzte, die mit dem Wort verbunden waren, nur um eine Handvoll positiver Ergebnisse zu erhalten, aber selbst dann war es nur 15% genau. Es ist nicht dein Code, sondern Lesk ist das Problem. Es ist einfach keine zuverlässige Heuristik. – Cerin

Verwandte Themen