我目前正在做一个项目,我需要检查几个文本之间的重复百分比。目标是尽可能接近谷歌的重复处理。
在做了很多研究之后,我认为 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;
}
在检索到我的两个文本的指纹后,我想知道两个文本之间的相似度百分比。
除了当我从 64 位 SIMHASH 到 128 或 256 时,不同位的数量增加并且我的索引变得越来越小(使用 xxxxxE-19、xxxxE-40)。
在图书馆设计者的文章中(https://web.archive.org/web/20150227194138/http://www.titouangalopin.com/blog/2014-05-29-simhash),他解释了一个更简单的公式: 1 - (diffCount / nbBit)
除了如果我应用这个公式而不是 gaussianDensity,结果与互联网上的其他工具不一致,并且给出了非常错误的值。
所以我有点卡住了......有人有想法让我摆脱 Simhash 的这个问题,或者有另一个想法来检查几个文本之间的相似性吗?
感谢,并有一个愉快的一天 !