質問

N-gram (できれば PHP) を使用していくつかのアプリケーションを実装したいと考えています。


ほとんどの目的には、どのタイプの N グラムがより適切ですか?単語レベルですか、それとも文字レベルの N グラムですか?PHP で n-gram-tokenizer を実装するにはどうすればよいでしょうか?


まず、N-gram とは正確には何なのかを知りたいと思います。これは正しいです?私は N グラムを次のように理解しています。

文:「私はニューヨークに住んでいます。」

単語レベルのバイグラム (n に 2):「#私」、「私は住んでいます」、「住んでいます」、「ニューヨークにいます」、「ニューヨーク#」

文字レベルのバイグラム (n に 2):"#I"、"I#"、"#l"、"li"、"iv"、"ve"、"e#"、"#i"、"in"、"n#"、"#N"、 「ニューヨーク」、「Y#」

この n グラム部分の配列がある場合、重複する部分を削除し、頻度を示す各部分のカウンターを追加します。

単語レベルのバイグラム:[1、1、1、1、1]

文字レベルのバイグラム:[2、1、1、...]

これは正しいです?


さらに、n-gram で何ができるかについてさらに詳しく知りたいと思います。

  • N-gram を使用してテキストの言語を識別するにはどうすればよいですか?
  • 対訳コーパスがない場合でも、N-gram を使用して機械翻訳を行うことは可能ですか?
  • スパム フィルター (スパム、ハム) を構築するにはどうすればよいですか?N-gram とベイジアン フィルターを組み合わせますか?
  • トピックスポッティングを行うにはどうすればよいですか?例えば:バスケットボールや犬に関するテキストですか?私のアプローチ (「犬」と「バスケットボール」に関する Wikipedia の記事で次のことを実行します):両方のドキュメントの N-gram ベクトルを構築し、それらを正規化し、マンハッタン/ユークリッド距離を計算します。結果が 1 に近いほど、類似性が高くなります。

私のアプリケーションのアプローチ、特に最後のアプローチについてどう思いますか?


助けていただければ幸いです。前もって感謝します!

役に立ちましたか?

解決

Word n-gramは、一般に、言語検出の例外を除き、ほとんどのテキスト分析アプリケーションに役立ちます。文字のトリグラムのようなものがより良い結果をもたらす可能性があります。効果的には、検出したい各言語のテキストのコーパスに対してn-gramベクトルを作成し、各コーパスのトリグラムの頻度を、分類しているドキュメントのトリグラムと比較します。たとえば、トライコード the は、おそらくドイツ語よりも英語ではるかに頻繁に表示され、ある程度の統計的相関を提供します。 n-gram形式のドキュメントを作成したら、さらに分析するための多くのアルゴリズム、ベイジアンフィルター、N-Nearest Neighbor、サポートベクターマシンなどを選択できます。

あなたが言及したアプリケーションの中で、機械翻訳は恐らく最も大げさなものです。n-gramだけでは、あなたを道のりにさほど遠くに連れて行かないからです。入力ファイルをn-gram表現に変換することは、機能分析のためにデータを形式に変換する方法にすぎませんが、多くのコンテキスト情報が失われるため、翻訳には役に立たない可能性があります。

注意すべきことの1つは、1つのドキュメントに対してベクトル[1,1,1,2,1]を作成し、別のドキュメントに対してベクトル[2,1,2,4]を作成するだけでは不十分なことです。 、寸法が一致しない場合。つまり、ベクターの最初のエントリは、あるドキュメントでは the にならず、別のドキュメントでは is にできません。そうしないと、アルゴリズムが機能しません。ほとんどのドキュメントには関心のあるほとんどのn-gramが含まれていないため、[0,0,0,0,1,1,0,0,2,0,0,1]のようなベクトルになります。機能のアップは不可欠であり、分析に含めるngramを「事前に」決定する必要があります。多くの場合、これは2パスアルゴリズムとして実装され、最初にさまざまなn-gramの統計的有意性を判断して、何を保持するかを決定します。詳細については、Googleの「機能選択」。

トピックベースのスポッティングを実行するには、ワードベースのn-gramとサポートベクターマシンが優れた方法で使用されますが、分類子をトレーニングするには、「トピック上」と「トピック外」に事前に分類された大量のテキストが必要です。 citeseerx のようなサイトで、この問題に対するさまざまなアプローチを説明する多数の研究論文を見つけることができます。 。統計的有意性に基づいて個々のn-gramを重み付けしないため、この問題に対するユークリッド距離アプローチはお勧めしません。そのため、両方とも the a is であり、 of は両方とも Baysian を含む2つのドキュメントよりも一致すると見なされます。関心のあるN-gramからストップワードを削除すると、これが多少改善されます。

他のヒント

n-gram の定義については正しいです。

単語レベルの N-gram は、検索タイプのアプリケーションに使用できます。文字レベルの N グラムは、テキスト自体の分析にさらに使用できます。たとえば、テキストの言語を識別するには、言語の確立された頻度と比較した文字の頻度を使用します。つまり、テキストはその言語の文字の出現頻度とほぼ一致する必要があります。

PHP での単語の N-gram トークナイザーは、strtok を使用して実行できます。

http://us2.php.net/manual/en/function.strtok.php

文字の場合は分割を使用します。

http://us2.php.net/manual/en/function.str-split.php

その後、配列を任意の数の n グラムに分割することができます。

ベイジアン フィルターは、n グラムと組み合わせて使用​​できるスパム フィルターとして使用できるようにトレーニングする必要があります。ただし、学習するには十分な入力を与える必要があります。

ページのコンテキストを学習する限り、最後のアプローチは適切に思えます...ただし、これを実行するのはまだかなり難しいですが、N グラムはそのための良い出発点のように思えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top