24

我正在嘗試使用NLTK工具包從文本消息中獲取提取地點,日期和時間。我剛剛安裝在我的機器上的工具包和我寫了這個快速片段來測試它:用於命名實體識別的NLTK

sentence = "Let's meet tomorrow at 9 pm"; 
tokens = nltk.word_tokenize(sentence) 
pos_tags = nltk.pos_tag(tokens) 
print nltk.ne_chunk(pos_tags, binary=True) 

我是假設,這將確定日期(明天)和時間(晚上9點)。但是,令人驚訝的是它沒有認識到這一點。我得到以下結果,當我跑我上面的代碼:

(S (GPE Let/NNP) 's/POS meet/NN tomorrow/NN at/IN 9/CD pm/NN) 

有人可以幫助我明白,如果我失去了一些東西或NLTK只是不夠成熟標記正確的時間和日期。謝謝!

回答

5

命名實體識別不是一個簡單的問題,而不是期望任何庫100%準確。你不應該根據一句話就NLTK的表現做出任何結論。再舉一例:

sentence = "I went to New York to meet John Smith"; 

我得到

(S 
    I/PRP 
    went/VBD 
    to/TO 
    (NE New/NNP York/NNP) 
    to/TO 
    meet/VB 
    (NE John/NNP Smith/NNP)) 

正如你所看到的,NLTK做得非常好這裏。但是,我無法讓NLTK將todaytomorrow識別爲時間表達式。你可以試試斯坦福SUTime,它是斯坦福大學的一部分CoreNLP - 我之前使用過它,但它工作得很好(雖然它在Java中)。

+0

實際上NLTK爲斯坦福的NERTagger提供了綁定('from nltk.tag.stanford import StanfordNERTagger')。你仍然需要下載java源代碼,但有很多幫助。 – Pithikos

25

nltk中的默認NE chunker是在ACE語料庫上訓練的最大熵chunker(http://catalog.ldc.upenn.edu/LDC2005T09)。它沒有經過訓練來識別日期和時間,所以如果你想這樣做,你需要訓練自己的分類器。

看看http://mattshomepage.com/articles/2016/May/23/nltk_nec/,整個過程解釋得非常好。

另外,在nltk_contrib中有一個叫做timex的模塊,可以幫助您滿足您的需求。 https://code.google.com/p/nltk/source/browse/trunk/nltk_contrib/nltk_contrib/timex.py

+0

謝謝!鏈接是非常有幫助的! –

1

如果您想從短信正確識別日期時間可以使用斯坦福NER

它使用CRF(條件隨機場)分類器。 CRF是一個順序分類器。因此需要考慮單詞的順序。

如何構造或設計一個句子,相應地,您將獲得保密數據。

如果您輸入的句子應該是Let's meet on wednesday at 9am.,那麼斯坦福NER會將wednesday確定爲日期,並將9am確定爲時間。

NLTK支持斯坦福大學NER。嘗試使用它。

相關問題