我一直在努力使用 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;