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%正確であると想定しています。 1文に基づいて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に時間表現としてtodayまたはtomorrowを認識させることができませんでした。あなたはStanford SUTimeを試すことができます。それはスタンフォードの一部ですCoreNLP - 私はそれがかなりうまく動作する前にそれを使用しました(それはJavaにあります)。

+0

実際、NLTKはスタンフォードのNERTagger( 'nltk.tag.stanford import StanfordNERTagger')のバインディングを提供しています。それでもJavaソースをダウンロードする必要がありますが、そこからたくさんの助けがあります。 – Pithikos

25

nltkのデフォルトNEチャンクは、ACEコーパス(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をサポートしています。それを使って試してみる。

関連する問題