0

我目前正在做一个项目,我需要检查几个文本之间的重复百分比。目标是尽可能接近谷歌的重复处理。

在做了很多研究之后,我认为 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 的这个问题,或者有另一个想法来检查几个文本之间的相似性吗?

感谢,并有一个愉快的一天 !

4

0 回答 0