web-dev-qa-db-ja.com

名前付きエンティティの認識のための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が十分に成熟していないため、日時に適切にタグを付けることができるかどうか、誰かが私を理解するのを助けることができますか?ありがとう!

27
Darth.Vader

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

29

名前付きエンティティの認識は簡単な問題ではありません。ライブラリが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でもですが)です)。

6
mbatchkarov

テキストメッセージからdateまたはtimeを正しく識別したい場合は、StanfordのNERを使用できます。

[〜#〜] crf [〜#〜](条件付きランダムフィールド)分類子を使用します。 CRFは順次分類子です。したがって、単語のシーケンスが考慮されます。

どのように文を構成またはデザインするかによって、分類されたデータが得られます。

入力文がLet's meet on wednesday at 9am.の場合、スタンフォードNERはwednesdayを日付として正しく識別し、9am時間として。

NLTKはStanford NERをサポートしています。使ってみてください。

3
Rohan Amrute