2013-04-05 5 views
7

問題:マッチングCLOSESTファイル

私は約20 ASCIIテキストファイルを持っているが、各サイズを持つ未満10^9バイト .AnotherのASCIIテキストファイル(たとえばFOO)が与えられています。プログラムは、FOOの内容と指定された20のファイルを戦略的に一致させ、CLOSESTの一致するファイルの名前を出力することです。 FOOの内容は部分的にしか一致しないかもしれません。

ファイルのサイズが大きすぎるので、私は思ったんだけど:

1.Howを(私はIRについてあまり知らないので)情報検索を使用するように

2.whichデータ構造私が使用する必要がありますそのような情報を保存する

3.それを実装するための最良のアルゴリズムは何でしょうか。

私はあまりにも多くを求めていることを知っているしかし、実際に私はこの問題に立ち往生し、アプローチする方法を見つけることができません。どんな助けもありがたいです。ありがとう!

+0

の方法についてのスキャンすべてのファイルと、各テキストファイルの単語の次元のベクトルを作成し、その後、あなたはdocumetsとの間の角度を計算して選択することができます一番近いもの? –

+0

より簡単な方法はJaccard Index http://en.wikipedia.org/wiki/Jaccard_indexを使用することですが、コサインの類似性と同じ精度を提供しない可能性があります。この手法は正規化された単語数で動作することに注意してください。 – decden

+9

あなたは本当に "最も近い"を定義する必要があります。テストファイルがファイル#1のすべての単語と同じであるが逆の順序の単語(すなわち "クイックレッドキツネ"と "キツネレッドクイックザ")と一致する場合、それはファイル#2に正確に一致する場合よりも "近い"最初の30%を順番にしていますが、後で類似性はほとんどありませんか?大文字小文字は重要ですかホワイトスペース?「最も近い」という定義がなければ、あなたは何を比較するか決定するのに苦労するでしょう。 –

答えて

0

私はファイルにテキストが含まれていると仮定します。したがって、ファイルのそれぞれが大きな文字列であると言うことができます。今度は20のベクトルまたは配列を作成します。ファイル内を移動し、各単語をベクトルの要素として配置します。今度は各ファイルのマッチングを保存するための20のサイズのベクトルを作成します。ここで、指定されたファイルのワードベクトルも作成します。あなたがこれらの20種類のベクトルとあなたの与えられたベクトルのいずれかとの一致を見つけた場合、これらのベクトルを実行するためのループを作成してください。一致するベクトルを格納しているファイルの値を増やしてください。最後に、一致する格納ベクトルの最高値は、最も一致したファイルを示します。

0

ヴァンパイアコーダの解決策は、文書が単語​​の袋であるとみなし、単語の順序付けが重要でないことを意味します。しかし、「部分一致」では、文の一部が一致していることを意味していましたが、それはうまくいっていません。

各ドキュメントを重複するサブセットに分割し、各サブセットのハッシュを取得できます。次に、ドキュメントを一連のハッシュに変換します。次に、ハッシュを比較することができます。これは、あなたがしたいことをすることができる1つの方法です。

各文書について、潜在的な一致を絞ったら、文書を分割する解像度を上げることができます。最初に2つに分割したとします。今度は10に分割することができます。これは実行時間を最小限に抑えるためです。

はまた、あなたのような局所性鋭敏型ハッシュアルゴリズムを使用する必要があります。http://en.wikipedia.org/wiki/Nilsimsa_Hash