マークアップなしの約100メガバイトのテキストを、約10,000エントリに分割しています。 「タグ」リストを自動生成したいのですが。問題は、それらが一緒にグループ化されたときにのみ意味をなす単語グループ(つまりフレーズ)があることです。
単語を数えるだけでは、非常に一般的な単語(is、the、for、in、amなど)が多数表示されます。単語とその前後にある他の単語の数を数えましたが、次に何をすればよいのか本当にわかりません。
何よりもまず、入力テキストに含まれる「境界」に関する情報を保存してください。
(そのような情報がすぐに失われない場合、あなたの質問はおそらくトークン化が容易に行われたことを意味します)
トークン化(この場合はワード解析)プロセス中に、式の境界を定義する可能性のあるパターンを探します(特に句読点など)ピリオド、および複数のLF/CRの分離では、これらを使用します。また、「the」などの単語を境界として使用することもできます。このような式の境界は、2つのトークンインスタンスを確実に分離するという意味で、通常「負」ですnotは同じ式に含まれません。いくつかの正の境界は引用符、特に二重引用符です。このタイプの情報は、一部のNグラムを除外するのに役立ちます(次を参照)また、「たとえば」、「代わりに」、「必要」などの単語シーケンスも式の境界として使用できます(ただし、このような情報を使用することで、後で説明する「優先」を使用することに重点が置かれます)。
外部データを使用せずに(入力テキスト以外)、テキストのダイグラムとトライグラムでの統計を実行することで、これで比較的成功することができます(2および3の連続する単語のシーケンス)。次に、[ほとんど]有意な数(*)のインスタンスを持つシーケンスが、探している「表現/フレーズ」のタイプになる可能性があります。
このやや粗雑な方法では、いくつかの誤検知が発生しますが、全体としては機能する可能性があります。 「境界」を越えることが知られているn-gramを最初の段落で示唆されているようにフィルタリングすると、自然言語では文の終了と文の開始がメッセージ空間の限られたサブセットから描画される傾向があり、したがってトークンの組み合わせが生成されるため、統計的によく表されているように見えますが、通常は意味的に関連していません。
より良い方法(おそらくより高価で、処理面で、設計/投資面で)、ドメインに関連する追加の「優先度」を使用しますおよび/または入力テキストの各国語。
[申し訳ありませんが、とりあえず行きましょう(さらに、具体的な目標などについて詳しく教えてください)。後で詳しく説明します。]
[ところで、ここにプラグインしたいJonathan FeinbergとDervin Thunkの応答は、メソッドとツールの観点から優れたポインタを提供するため、手元のタスクのようなもの。特に、[〜#〜] ntlk [〜#〜]およびPython-at-large実験のための優れたフレームワークを提供します]
O'Reillyの本 Beautiful Data の Peter Norvig による素晴らしい章から始めます。彼はあなたが必要とするngramデータを、美しいPythonコード(これは問題をそのまま解決するか、いくつかの修正を加えることで解決するかもしれません)とともに提供します) 彼の個人Webサイト =。
コロケーション抽出 を探しているようです。 Manning andSchütze このトピックに chapter を捧げ、私がリンクしたWikipediaの記事で言及されている「提案された式」を説明および評価します。
章全体をこの応答に収めることはできません。うまくいけば their links の一部が役立つでしょう。 ( [〜#〜] nsp [〜#〜] 特に適切に聞こえます。)nltkにも collocations module がありますが、ManningとSchützeはその本の前に述べているため言及していません。
これまでに投稿された他の応答は、統計的言語処理とn-gramをより一般的に扱っています。コロケーションは特定のサブトピックです。
単語の行列を作成します。次に、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']++;
1つの方法は、オートマトンを自分で構築することです。おそらく非決定性有限オートマトン(NFA)です。 [〜#〜] nfa [〜#〜]
もう1つのより簡単な方法は、無視、検索、比較などしたい単語や単語グループを含むファイルを作成し、プログラムの起動時にそれらをメモリに保存してから、ファイルを比較することです。ファイルに含まれている単語/単語グループで解析する。