使用NLTK WordNet查找专有名词

36

有没有办法使用NLTK WordNet找到适当的专有名词?也就是说,我是否能够使用nltk WordNet标记所有格名词?

2个回答

62

我认为你不需要使用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 被分成了两个标记,可能会让您感到不太满意,那么您可能需要更复杂的东西,比如命名实体识别器。

根据 penntreebank 标签集的文档记录,对于所有格名词,您可以简单地查找 POS 标签,http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html。但是通常情况下,当它是一个 NNP 时,标注器不会标记 POS

要查找所有格名词,请查找以 "'s" 或 "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,但除非你关心从句子中获取什么类型的专有名词,否则它似乎并没有做太多事情:

或者,您可以使用NLTK的ne_chunk,但除非您关心从句子中获取何种类型的专有名词,否则它似乎不会有太大作用:

>>> 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有点冗长,而且它不能获得所有的所有格。


1
谢谢您提供的解决方案,我在去年11月将其实现为控制台脚本 - https://github.com/dereckson/extract-proper-nouns - 并成功地从小说中导入了专有名词列表。 - Dereckson
1
很高兴答案有所帮助,看到您为其他尝试执行相同任务的人提供了准备好的解决方案真是太好了 =) - alvas
3
能否使用nltk从一些“非结构化”的文本中提取专有名词,比如一个日志文件,其中专有名词是以大小写混合的形式出现且文本语法不完全正确?谢谢。 - user2436428
1
@user2436428 不一定,但试试也没什么坏处。拥有不正确的专有名词是一种讽刺,你需要的是更像是命名实体识别的东西,请参见https://dev59.com/KpLea4cB1Zd3GeqP1V42#34458164。 - alvas
1
@alvas让我执行nltk.download()以便使用它。但是它报错HTTP 405不允许? - Ankush Rathi
你确定句子中的第一个单词被标记为“NNP”吗?需要检查一下。可能取决于版本。 - Catalina Chircu

3
我认为你需要的是一个词性标注器(part-of-speech tagger),比如tagger。这个工具会为句子中的每个单词分配一个词性标记,例如专有名词、所有格代词等。 NLTK包含一些标注器: http://nltk.org/book/ch05.html 还有Stanford 词性标注器(同样是开源的,性能更好)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接