0

我运营的网站存在用户发布重复内容的问题。因此,当访问者搜索内容时,它会返回一些看起来完全相同的结果。

问题是重复的内容不是抄送。可能会在这里和那里更改一个词,或者几天后会发布,但不需要额外的结果,因为它们本质上是重新发布。

一个例子是:

标题:出售裤子 描述:我正在出售一条裤子。他们身上有洞。在 1234 上联系罗伯

标题:出售裤子 描述:我正在出售一条裤子。他们有一些洞。联系罗伯

标题:出售我的裤子 描述:我正在出售一条裤子。他们身上有洞。在 1234 上联系罗伯

是否有某种形式的算法(最好是内置在 PHP 中并且速度很快)可以准确地找出这些重复项?它将搜索大约 50 个项目的结果集,每个项目最多包含 500 个字符的文本。

编辑:我还应该补充一点,类似的结果可能并不相邻,所以我不能简单地将当前结果与前一个结果进行比较。在理想的世界中,它将类似于 SELECT title, desc FROM database WHERE id IN (10,40,54,143,444) AND UNIQUE(title,desc) > 90%。

4

3 回答 3

1

忘记我上面的回复并使用以下代码:

    类类似文本
    {
        私人 $arrayResults = array();
        私人$文本;

        公共功能测试($text,$accepted_percentage = 70)
        {
            如果(计数($this->arrayResults))
            {
              foreach( $this->arrayResults as $result )
              {
                相似文本($结果,$文本,$百分比);

                if( ( (int) $percent ) >= $accepted_percentage )
                {
                  $this->保存($文本);
                  返回(int)$百分比;
                }
              }
            }
            $this->保存($文本);
            返回0;
        }

        私有函数保存($文本)
        {
            $this->arrayResults[ $text ] = $text;
        }
    }


    $similar = 新的similarText();

    而( /*[ $fetch = ... ]*/ )
    {
        $title = $fetch['title'];
        $description = $fetch['description'];

        if( $similar->test( $title, 70 ) || $similar->test( $description, 70 ) )
        {
          继续;
        }
    }
于 2013-06-20T21:08:00.650 回答
0

我会推荐使用这个

文史丹

它计算使字符串相等所需的插入删除和替换次数。

您需要在获得数据库结果后执行此操作。

然后你选择一个像 50 这样的任意数字来比较每个字符串之间的距离。现在,由于这是仅使用 2 个字符串完成的,因此您需要运行一个循环来比较每个字符串,而且我不确定您有多少结果(没有数据),因此很难说它的运行效率如何。

levenshtein 在 O(m*n) 中运行,这是字符串的长度,如果你将它与每个字符串进行比较,它可能会很昂贵,但很难让它更快。

如果您可以提供更完整的结果样本,那将有所帮助。就像您显示的所有结果类似的帖子一样,或者是否混合了其他结果。

也许您可以拆分 sql 语句以获得类似的结果并在这些上运行 levenshtein?

于 2013-06-20T20:05:42.887 回答
0

让我理解你,你不想显示类似的结果?

您可以使用similar_text

示例:

$ArrayResults = array();
$found = 0;
$accepted_percentage = 70;

while( /*[ $fetch = ... ]*/ )
{
    $title = $fetch['title'];
    if( count( $ArrayResults ) )
    {
      foreach( array_unique( $ArrayResults ) as $result )
      {
        similar_text( $result, $title, $percent );
        if( $percent >= $accepted_percentage )
        {
          $found = 1;
        }
      }
    }
    if( $found )
    {   
      $found = 0;
      continue;
    }
    $ArrayResults[ $title ] = $title;
}
于 2013-06-20T20:15:39.713 回答