解析文本以获取专有名词(名称和组织)-python nltk

解析文本以获取专有名词(名称和组织)-python nltk,python,nltk,Python,Nltk,我试图从非常小的文本块(如sms)中提取名称和组织名称中的专有名词,nltk提供的基本解析器能够获取这些名词,但问题是当我们获取专有名词时,不是以大写字母开始的,对于这样的文本,像sumit这样的名称不能被识别为专有名词 >>> sentence = "i spoke with sumit and rajesh and Samit about the gridlock situation last night @ around 8 pm last nite" >>&

我试图从非常小的文本块(如sms)中提取名称和组织名称中的专有名词,nltk提供的基本解析器能够获取这些名词,但问题是当我们获取专有名词时,不是以大写字母开始的,对于这样的文本,像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')]

有一种更好的方法可以提取人员和组织的名称

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

但是,所有命名实体识别器都会提交错误。如果你真的不想漏掉任何专有名称,你可以使用专有名称的dict,并检查dict中是否包含该名称。

你可能想看看。 它还尝试猜测名字。很抱歉回答不完整,但我没有太多使用python名称解析器的经验

祝你好运

试试这段代码

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

借助此函数,您可以获取人员、组织和位置的名称。希望能有帮助。Thankz

Thank@mbatchkarov如果我有一个庞大的名称词典(我确实有),我如何用python制作一个,请建议,你的答案看起来不错,我会试试。你可以在应用命名实体识别器之前试试truecasing。它只是一个名称解析器,就像NetSex一样,只要你有一个名称,你就可以解析它,但是这个想法是提取名字,不管他们写的是“sumit”还是“sumit”或“sumit”