0

私はしばらくの間、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;
4

1 に答える 1