2013-07-16 86 views

回答

37

我不认为你需要的WordNet找到专有名词,我建议使用部分的词性恶搞pos_tag

为了找到专有名词,寻找NNP标签:

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'] 

你可能不是因为MichaelJackson非常满意被分成2个令牌,则可能需要更复杂的东西,如姓名实体标记器。

正如penntreebank标记集记录的所有格名词所示,您可以简单地查找POS标记http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html。但是,当标记为NNP时,标记不会标记POS

为了找到物主名词,寻找str.endswith( “的 ”)或str.endswith(“ S”“):

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'"] 

或者,您可以使用NLTK ne_chunk但它不“T似乎除非你是担心你这句话得到了什么样的专有名词做很多其他:

>>> 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'] 

使用ne_chunk有点冗长,它不会让你的所有格。

+0

感谢您对这个解决方案,我实现了它作为控制台脚本去年十一月 - https://github.com/dereckson/extract-proper-nouns - 并成功导入正确的名称列表,从一本小说。 – Dereckson

+0

高兴回答帮助,我们很高兴地看到你有其他人谁是试图执行相同任务的一个现成的解决方案=) – alvas

+1

是否可以使用NLTK从一些_unstructured_文字像一个日志文件,其中适当提取专有名词名词与**混合使用**并且文本**不完全符合语法正确**?谢谢 – user2436428

1

我认为你需要的是一个标记器,一个词性标记器。此工具分配部分的词性标签(例如,专有名词,代词possesive等),以在一个句子中的每个单词。

NLTK包括一些标记者: http://nltk.org/book/ch05.html

另外还有Stanford Part-Of-Speech Tagger(开源太,更好的性能)。