我正在尝试从像sms这样非常小的文本块中提取名称和组织名称中的专有名词,nltk Finding Proper Nouns using NLTK WordNet提供的基本解析器能够获取名词但问题是我们得到的时候专有名词不以大写字母开头,对于这样的文本,像sumit这样的名字不会被识别为专有名词
>>> sentence = "i spoke with sumit and rajesh and Samit about the gridlock situation last night @ around 8 pm last nite"
>>> tagged_sent = pos_tag(sentence.split())
>>> print tagged_sent
[('i', 'PRP'), ('spoke', 'VBP'), ('with', 'IN'), **('sumit', 'NN')**, ('and', 'CC'), ('rajesh', 'JJ'), ('and', 'CC'), **('Samit', 'NNP'),** ('about', 'IN'), ('the', 'DT'), ('gridlock', 'NN'), ('situation', 'NN'), ('last', 'JJ'), ('night', 'NN'), ('@', 'IN'), ('around', 'IN'), ('8', 'CD'), ('pm', 'NN'), ('last', 'JJ'), ('nite', 'NN')]
答案 0 :(得分:8)
有一种更好的方式来提取人员和组织的名称
from nltk import pos_tag, ne_chunk
from nltk.tokenize import SpaceTokenizer
tokenizer = SpaceTokenizer()
toks = tokenizer.tokenize(sentence)
pos = pos_tag(toks)
chunked_nes = ne_chunk(pos)
nes = [' '.join(map(lambda x: x[0], ne.leaves())) for ne in chunked_nes if isinstance(ne, nltk.tree.Tree)]
但是,所有命名实体识别器都会提交错误。如果你真的不想错过任何正确的名字,你可以使用专有名词的词典,并检查名称是否包含在词典中。
答案 1 :(得分:2)
您可能需要查看python-nameparser。 它也试图猜测capitalization名字。很抱歉答案不完整,但我没有太多使用python-nameparser的经验。
祝你好运!
答案 2 :(得分:0)
试试这段代码
def get_entities(self,args):
qry = "who is Mahatma Gandhi"
tokens = nltk.tokenize.word_tokenize(qry)
pos = nltk.pos_tag(tokens)
sentt = nltk.ne_chunk(pos, binary = False)
print sentt
person = []
for subtree in sentt.subtrees(filter=lambda t: t.node == 'PERSON'):
for leave in subtree.leaves():
person.append(leave)
print "person=", person
您可以借助此ne_chunk()函数获取人员,组织,位置的名称。希望能帮助到你。 Thankz