テキストメッセージから場所、日付、時刻を抽出するために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が十分に成熟していないため、日時に適切にタグを付けることができるかどうか、誰かが私を理解するのを助けることができますか?ありがとう!
NltkのデフォルトのNEチャンカーは、ACEコーパスでトレーニングされた最大エントロピーチャンカーです( http://catalog.ldc.upenn.edu/LDC2005T09 )。日付と時刻を認識するようにトレーニングされていないため、そのためには独自の分類子をトレーニングする必要があります。
http://mattshomepage.com/articles/2016/May/23/nltk_nec/ を見てください。プロセス全体が非常によく説明されています。
また、nltk_contribにはtimexというモジュールがあり、ニーズに役立ちます。 https://github.com/nltk/nltk_contrib/blob/master/nltk_contrib/timex.py
名前付きエンティティの認識は簡単な問題ではありません。ライブラリが100%正確であるとしないでください。 NLTKのパフォーマンスについて、1つの文に基づいて結論を下すべきではありません。次に別の例を示します。
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
を時間式として認識できませんでした。あなたはスタンフォードSUTimeを試すことができます、それはスタンフォードの一部です CoreNLP -私はそれがかなりうまくいく前にそれを使いました(それはJavaでもですが)です)。
テキストメッセージからdateまたはtimeを正しく識別したい場合は、StanfordのNERを使用できます。
[〜#〜] crf [〜#〜](条件付きランダムフィールド)分類子を使用します。 CRFは順次分類子です。したがって、単語のシーケンスが考慮されます。
どのように文を構成またはデザインするかによって、分類されたデータが得られます。
入力文がLet's meet on wednesday at 9am.
の場合、スタンフォードNERはwednesday
を日付として正しく識別し、9am
時間として。
NLTKはStanford NERをサポートしています。使ってみてください。