2008-09-16 8 views
12

質問を入力すると、stackoverflowは同じトピックをカバーすると思われる質問のリストを提示します。私は他のサイトや他のプログラムでも同様の機能を見てきましたが(例えば、ヘルプファイルシステムなど)、私はこのようなプログラムを自分でプログラムしたことはありません。今私はそれのためにどんな種類のアルゴリズムを使うのか不思議です。類似性のフレーズを比較するにはどうすればよいですか?

私の頭に浮かぶ最初のアプローチは、フレーズを単語に分割し、これらの単語を含むフレーズを探すことです。そうする前に、おそらく重要でない単語( 'the'、 'a'、 'does'など)を捨てて、結果をランク付けしたいと思うでしょう。

ちょっと、待って - のは、ウェブページのことをさせ、その後、私たちは... watchamacallit ...持つことができます - 「検索エンジン」を、そして私たちは、広告を販売することができ、その後、...

いいえ、真剣に、この問題を解決する一般的な方法は何ですか?

答えて

12

1つの手法は、いわゆるバッグオブワードモデルです。

あなたが推測したように、まず、テキストに表示される単語の数をカウントします(通常、NLP-Lingoのドキュメントと呼ばれます)。次に、 "the"、 "a"、 "or"などのいわゆるストップワードを捨てます。

あなたは言葉と語数を残しています。これをしばらく実行すると、ドキュメントに表示される包括的な言葉が得られます。 "aardvark"は1、 "apple"は2、...、 "z-index"は70092です。

ここであなたの単語の袋を取り出して、ベクター。たとえば、あなたの文書がaardvarksと他には何のための2つの参照が含まれている場合、それは次のようになります。

[2 0 0 ... 70k zeroes ... 0]. 

この後、あなたがa dot productと2つのベクトル間の「角度」をカウントすることができます。角度が小さいほど、ドキュメントが近くなります。

これはシンプルなバージョンであり、さらに高度な技術があります。 Wikipedia be with you

2

フルテキスト検索エンジンを開発した私の経験からは、私は質問からいくつかの言葉を含む質問を探します(あなたの質問はあなたの質問です)。 確かに、ノイズの単語は無視する必要があります。検索の範囲を絞り込むために、「ASP.Net」のような「強い」単語をクエリで確認したい場合があります。 http://en.wikipedia.org/wiki/Index_(search_engine)#Inverted_indices'>無効なインデックスは、私たちが関心のある単語で質問を見つけるためによく使用されます。

質問から質問を見つけたら、私たちが質問で興味のある単語の間の距離を計算したいので、「フレーズの類似性」テキストの質問は、「類似性を論じると、あなたは次のフレーズを聞く」という質問よりも高いランクです。

3

でJava実装の例を参照してください:

あなたもnグラムにいくつかの注意を払うことができますいくつかの方法がありますが、 2つ以上の単語の列が順番に保持される。 「スペースの複雑さ」の検索は、「スペース」と「複雑さ」があるものを検索することよりもはるかに多いため、このフレーズの意味はその部分の合計以上です。つまり、あなたが宇宙と宇宙の複雑さについて語っている結果を得たなら、これは恐らく「宇宙の複雑さ」の探求が本当に意味するものではないでしょう。

自然言語処理の重要なアイデアはmutual informationです。これは、フレーズが本当に特定のフレーズ(「空間の複雑さ」など)であるか、偶然に隣接する単語であるか(アルゴリズム的に)判断することができます。 。数学的には、主なアイデアは、これらの単語があなた自身の頻度だけで推測するよりも頻繁に隣り合って表示されるかどうかを、確率論的に尋ねることです。検索クエリで(またはインデックス作成中に)高い相互情報スコアを持つフレーズが表示された場合は、これらの単語を順番に保つことでより良い結果を得ることができます。

関連する問題