2013-10-21 77 views
9

我試圖從很小的文本像短信中提取名稱和組織名稱中的專有名詞,可用於nltk Finding Proper Nouns using NLTK WordNet的基本解析器正在能夠得到的名詞,但問題是,當我們得到專有名詞開頭大寫字母,像這樣類似SUMIT名稱文本沒有得到認可的專有名詞解析文本,以獲得專有名詞(名稱和組織)-python,nltk,

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

您可以在應用命名實體識別器之前嘗試使用truecasing。 –

回答

1

您可能想看看python-nameparser。 它也試圖猜測capitalization的名字。對不起,不完整的答案,但我沒有太多經驗使用python-nameparser。

祝你好運!

+1

那麼它只是一個像netgender這樣的名字分析器,因爲你有一個名字可以解析它,但是這個想法是提取名字,不管它們是否寫成「sumit」或「Sumit」或「SUMIT」 –

7

有一種更好的方式來提取人員和組織的名稱

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

但是,所有命名實體識別器提交錯誤。如果你真的不想錯過任何專有名稱,你可以使用專有名稱的字典,並檢查名稱是否包含在字典中。

+0

謝謝@mbatchkarov如果我有一個龐大的名稱字典(我確實有)如何在Python中創建一個,請指教,您的答案看起來不錯我會嘗試一下 –

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