Gibt es eine Möglichkeit, richtige Substantive mit NLTK WordNet zu finden? Dh, kann ich Possessive Substantive mit nltk Wordnet Tag?Suche nach richtigen Nomen mit NLTK WordNet
Antwort
Ich glaube nicht, dass Sie WordNet brauchen, um richtige Substantive zu finden, ich empfehle die Verwendung der Wortart-Tagger pos_tag
.
from nltk.tag import pos_tag
sentence = "Michael Jackson likes to eat at McDonalds"
tagged_sent = pos_tag(sentence.split())
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('likes', 'VBZ'), ('to', 'TO'), ('eat', 'VB'), ('at', 'IN'), ('McDonalds', 'NNP')]
propernouns = [word for word,pos in tagged_sent if pos == 'NNP']
# ['Michael','Jackson', 'McDonalds']
Sie möglicherweise nicht sehr zufrieden, da Michael
und Jackson
ist aufgeteilt in 2-Token, dann könnten Sie etwas komplexere wie Name:
Um Eigennamen, suchen Sie nach dem NNP
Tag zu finden Entitäts-Tagger
Von rechts, wie durch die penntreebank
Tagset für Possessiv Substantive dokumentiert, können Sie einfach nach der POS
Tag, http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html. Aber oft markiert der Tagger nicht POS
, wenn es ein NNP
ist.
Um Possessivpronomen, suchen Sie nach str.endswith (" 's ") oder str.endswith (" s'") zu finden:
from nltk.tag import pos_tag
sentence = "Michael Jackson took Daniel Jackson's hamburger and Agnes' fries"
tagged_sent = pos_tag(sentence.split())
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('took', 'VBD'), ('Daniel', 'NNP'), ("Jackson's", 'NNP'), ('hamburger', 'NN'), ('and', 'CC'), ("Agnes'", 'NNP'), ('fries', 'NNS')]
possessives = [word for word in sentence if word.endswith("'s") or word.endswith("s'")]
# ["Jackson's", "Agnes'"]
Alternativ können Sie ne_chunk
NLTK verwenden, aber es doesn ‚t scheinen viel andere zu tun, es sei denn, Sie sind besorgt über welche Art von Proper Noun Sie aus dem Satz erhalten:
>>> from nltk.tree import Tree; from nltk.chunk import ne_chunk
>>> [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]
[Tree('PERSON', [('Michael', 'NNP')]), Tree('PERSON', [('Jackson', 'NNP')]), Tree('PERSON', [('Daniel', 'NNP')])]
>>> [i[0] for i in list(chain(*[chunk.leaves() for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]))]
['Michael', 'Jackson', 'Daniel']
Mit ne_chunk
ist ein wenig ausführlich und es macht Sie nicht die Possessivpronomen bekommen.
Ich denke, was Sie brauchen, ist ein Tagger, ein Wortbestandteil Tagger. Dieses Werkzeug ordnet jedem Wort in einem Satz einen Wortart-Tag zu (z. B. Eigenname, possives Pronomen usw.).
NLTK enthält einige Tagger: http://nltk.org/book/ch05.html
Es gibt auch die Stanford Part-Of-Speech Tagger (Open Source auch bessere Leistung).
Vielen Dank für diese Lösung, ich habe es als ein Konsolen-Skript letzten November implementiert - https://github.com/dereckson/extract-proper-nouns - und erfolgreich die Liste der Eigennamen aus einem Roman importiert. – Dereckson
Froh, dass die Antwort hilft, es ist toll zu sehen, dass Sie eine fertige Lösung für andere Leute haben, die versuchen, die gleiche Aufgabe auszuführen =) – alvas
Ist es möglich, nltk zum Extrahieren von Eigennamen aus einigen _unstructured_ Text wie eine Protokolldatei, wo richtig Substantive sind mit ** gemischter Fall ** und Text ist ** nicht vollständig grammatikalisch korrekt **? Danke – user2436428