18

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


ほとんどの目的に適したn-gramのタイプはどれですか?単語レベルまたは文字レベルのn-gram?PHPでn-gram-tokenizerをどのように実装できますか?


まず、N-gramとは何かを知りたいです。これは正しいです?それは私がn-gramを理解する方法です:

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

単語レベルのバイグラム(nの場合は2):「#I」、「I live」、「live in」、「in NY」、「NY#」

文字レベルのバイグラム(nの場合は2): "#I"、 "I#"、 "#l"、 "li"、 "iv"、 "ve"、 "e#"、 "#i"、 "in"、 " n# "、"#N "、" NY "、" Y# "

このn-gram-partsの配列がある場合、重複するものを削除し、各部分に頻度を与えるカウンターを追加します。

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

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

これは正しいです?


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

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

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


あなたが私を助けてくれることを願っています。前もって感謝します!

4

2 に答える 2

26

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

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

注意すべき点の1つは、あるドキュメントのベクトル[1,1,1,2,1]と、別のドキュメントのベクトル[2,1,2,4]を作成するだけでは不十分であるということです。寸法が一致しません。つまり、ベクトルの最初のエントリをthe1つのドキュメントと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に重みを付けないため、この問題に対するユークリッド距離アプローチはお勧めしません。したがって、両方に、、、を含む2つのドキュメントはthe、両方に含まれる2つのドキュメントよりも一致すると見なされます。関心のあるn-gramからストップワードを削除すると、これがいくらか改善されます。aisofBaysian

于 2009-06-23T13:17:08.623 に答える
2

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

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

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

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

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

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

次に、必要に応じて配列を任意の数のn-gramに分割できます。

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

あなたの最後のアプローチは、ページのコンテキストを学ぶ限りはまともなように聞こえます...これはまだかなり難しいですが、n-gramはそうするための良い出発点のように聞こえます。

于 2009-06-23T12:49:44.903 に答える