web-dev-qa-db-ja.com

テキストからフレーズやキーワードを検出するアルゴリズム

マークアップなしの約100メガバイトのテキストを、約10,000エントリに分割しています。 「タグ」リストを自動生成したいのですが。問題は、それらが一緒にグループ化されたときにのみ意味をなす単語グループ(つまりフレーズ)があることです。

単語を数えるだけでは、非常に一般的な単語(is、the、for、in、amなど)が多数表示されます。単語とその前後にある他の単語の数を数えましたが、次に何をすればよいのか本当にわかりません。

43
Kimvais

何よりもまず、入力テキストに含まれる「境界」に関する情報を保存してください。
(そのような情報がすぐに失われない場合、あなたの質問はおそらくトークン化が容易に行われたことを意味します)
トークン化(この場合はワード解析)プロセス中に、式の境界を定義する可能性のあるパターンを探します(特に句読点など)ピリオド、および複数のLF/CRの分離では、これらを使用します。また、「the」などの単語を境界として使用することもできます。このような式の境界は、2つのトークンインスタンスを確実に分離するという意味で、通常「負」ですnotは同じ式に含まれません。いくつかの正の境界は引用符、特に二重引用符です。このタイプの情報は、一部のNグラムを除外するのに役立ちます(次を参照)また、「たとえば」、「代わりに」、「必要」などの単語シーケンスも式の境界として使用できます(ただし、このような情報を使用することで、後で説明する「優先」を使用することに重点が置かれます)。

外部データを使用せずに(入力テキスト以外)、テキストのダイグラムとトライグラムでの統計を実行することで、これで比較的成功することができます(2および3の連続する単語のシーケンス)。次に、[ほとんど]有意な数(*)のインスタンスを持つシーケンスが、探している「表現/フレーズ」のタイプになる可能性があります。
このやや粗雑な方法では、いくつかの誤検知が発生しますが、全体としては機能する可能性があります。 「境界」を越えることが知られているn-gramを最初の段落で示唆されているようにフィルタリングすると、自然言語では文の終了と文の開始がメッセージ空間の限られたサブセットから描画される傾向があり、したがってトークンの組み合わせが生成されるため、統計的によく表されているように見えますが、通常は意味的に関連していません。

より良い方法(おそらくより高価で、処理面で、設計/投資面で)、ドメインに関連する追加の「優先度」を使用しますおよび/または入力テキストの各国語。

  • POS(Part-Of-Speech)tagging は、いくつかの点で非常に便利です(追加の、より客観的な式の境界を提供し、また、エンティティのコンテキストで使用されている場合でも、たとえばすべての記事などの「ノイズ」ワードクラスは、OPが生成したいタグクラウドでは通常はほとんどありません。
  • 辞書、辞書なども非常に役立ちます。特に、「エンティティ」(別名 WordNet lingoのインスタンス)とそれらの代替形式を識別するもの。エンティティはタグクラウドにとって非常に重要であり(タグクラウド内で見つかった単語のクラスはこれだけではありません)、エンティティを識別することで、それらを正規化することもできます(たとえば、上院議員T.ケネディ」)、したがって重複を排除するだけでなく、基礎となるエンティティの頻度を増やします。
  • コーパスがドキュメントコレクションとして構成されている場合は、TF(用語の頻度)とIDF(逆ドキュメントの頻度)に関連するさまざまなトリックを使用すると便利です。

[申し訳ありませんが、とりあえず行きましょう(さらに、具体的な目標などについて詳しく教えてください)。後で詳しく説明します。]

[ところで、ここにプラグインしたいJonathan FeinbergとDervin Thunkの応答は、メソッドとツールの観点から優れたポインタを提供するため、手元のタスクのようなもの。特に、[〜#〜] ntlk [〜#〜]およびPython-at-large実験のための優れたフレームワークを提供します]

34
mjv

O'Reillyの本 Beautiful DataPeter Norvig による素晴らしい章から始めます。彼はあなたが必要とするngramデータを、美しいPythonコード(これは問題をそのまま解決するか、いくつかの修正を加えることで解決するかもしれません)とともに提供します) 彼の個人Webサイト =。

11

コロケーション抽出 を探しているようです。 Manning andSchütze このトピックに chapter を捧げ、私がリンクしたWikipediaの記事で言及されている「提案された式」を説明および評価します。

章全体をこの応答に収めることはできません。うまくいけば their links の一部が役立つでしょう。 ( [〜#〜] nsp [〜#〜] 特に適切に聞こえます。)nltkにも collocations module がありますが、ManningとSchützeはその本の前に述べているため言及していません。

これまでに投稿された他の応答は、統計的言語処理とn-gramをより一般的に扱っています。コロケーションは特定のサブトピックです。

8
Darius Bacon

単語の行列を作成します。次に、2つの連続する単語がある場合は、適切なセルに1つ追加します。

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

これにより、2つの連続した単語の値が得られます。この単語は3語でも実行できます。これにはO(n ^ 3)メモリが必要です。

次のようなデータを格納するためにヒープを使用することもできます。

heap['for example']++;
heap['example you']++;
0
Egon

1つの方法は、オートマトンを自分で構築することです。おそらく非決定性有限オートマトン(NFA)です。 [〜#〜] nfa [〜#〜]

もう1つのより簡単な方法は、無視、検索、比較などしたい単語や単語グループを含むファイルを作成し、プログラムの起動時にそれらをメモリに保存してから、ファイルを比較することです。ファイルに含まれている単語/単語グループで解析する。

0
ChadNC