現在、いくつかのテキスト間の重複の割合を確認する必要があるプロジェクトに取り組んでいます。目標は、Google の重複処理にできるだけ近づけることです。
多くの調査を行った後、Simhash がこれに最適であると判断しました。多くのライブラリと多くのパラメーターがあります。
私が触発されたhttps://github.com/nicolaichuk/SimHashPhpのライブラリで、次のコードを使用してインデックスを計算します。
/**
* Similarity index
*
* @param int $countDifferences
* @return float
*/
protected function computeSimilarityIndex($countDifferences)
{
return $this->gaussianDensity($countDifferences) / $this->gaussianDensity(0);
}
/**
* Guassian distribution density
*
* @param int $x
* @return float
*/
protected function gaussianDensity($x)
{
$y = - (1 / 2) * pow($x / $this->deviation, 2);
$y = exp($y);
$y = (1 / sqrt(2 * pi())) * $y;
return $y;
}
2 つのテキストのフィンガープリントを取得した後、2 つのテキストの類似度を知りたいと考えています。
ただし、64 ビットの SIMHASH から 128 または 256 に変更すると、異なるビット数が増加し、インデックスがどんどん小さくなります (xxxxxE-19、xxxxxE-40 を使用)。
ライブラリの設計者の記事 ( https://web.archive.org/web/20150227194138/http://www.titouangalopin.com/blog/2014-05-29-simhash ) で、彼はより簡単な式を説明しています。 : 1 - (diffCount / nbBit)
ただし、gaussianDensity の代わりにこの式を適用すると、結果はインターネット上の他のツールと一致せず、非常に間違った値になります。
だから私は少し立ち往生しています...誰かがSimhashでこの問題から抜け出すためのアイデアを持っていますか、それともいくつかのテキスト間の類似性をチェックするための別のアイデアを持っていますか?
ありがとう、良い一日を!