2013-07-16 12 views

Antwort

37

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.

+0

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

+0

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

+1

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

1

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).