私はしばらくの間、simhash アルゴリズムに苦労しています。クローラーでの理解に従って実装しました。しかし、私がいくつかのテストを行ったとき、それは私にはあまり信頼できないようでした.
200.000 の異なるテキスト データのフィンガープリントを計算したところ、いくつかの異なるコンテンツに同じフィンガープリントがあることがわかりました。そのため、衝突の可能性が大いにあります。
私の実装コードは以下です。
私の質問は次のとおりです。私の実装が正しい場合、このアルゴリズムには大きな衝突があります。なぜグーグルはこのアルゴリズムを使用するのですか? そうでなければ、私のアルゴリズムの問題は何ですか?
public long CalculateSimHash(string input)
{
var vector = GenerateVector(input);
//5- Generate Fingerprint
long fingerprint = 0;
for (var i = 0; i < HashSize; i++)
{
if (vector[i] > 0)
{
var zz = Convert.ToInt64(1 << i);
fingerprint += Math.Abs(zz);
}
}
return fingerprint;
}
private int[] GenerateVector(string input)
{
//1- Tokenize input
ITokeniser tokeniser = new OverlappingStringTokeniser(2, 1);
var tokenizedValues = tokeniser.Tokenise(input);
//2- Hash values
var hashedValues = HashTokens(tokenizedValues);
//3- Prepare vector
var vector = new int[HashSize];
for (var i = 0; i < HashSize; i++)
{
vector[i] = 0;
}
//4- Fill vector according to bitsetof hash
foreach (var value in hashedValues)
{
for (var j = 0; j < HashSize; j++)
{
if (IsBitSet(value, j))
{
vector[j] += 1;
}
else
{
vector[j] -= 1;
}
}
}
return vector;