php中的类似文本百分比

时间:2016-03-10 17:16:24

标签: php percentage similarity

使用php代码找到两个字符串之间的百分比似乎很容易,我只是使用

int similar_text ( string $first , string $second [, float &$percent ]

但假设我有两个字符串,例如:

1-在药物测试失败后,赞助商退回莎拉波娃

2-玛丽亚莎拉波娃在澳大利亚网球公开赛上未通过毒品测试

使用similar_text工具,我得到了53.7%,但它没有任何意义,因为两个字符串正在谈论“Sharapova”的“药物测试失败”,百分比应该超过53.7%。

我的问题是:有没有办法找到两个字符串之间真正的相似百分比?

1 个答案:

答案 0 :(得分:1)

我已经实现了几种搜索重复项的算法,它们非常相似。

我通常使用的方法如下:

  1. 规范化字符串
  2. 使用比较算法(例如similar_text,levenshtein等)
  3. 在我看来,在实施步骤1)时,您将能够大大改善您的结果。

    标准化算法的例子(我使用"赞助商在药物测试失败后退回莎拉波娃"详情):

    1)小写字符串

    - > "赞助商在药物测试失败后退回莎拉波娃"

    2)在单词中爆炸字符串

    - > [赞助商,回来,离开,离开,莎拉波娃,之后,失败,吸毒,测试]

    3)删除嘈杂的单词(如命题,例如in,for,that,this等)。此步骤可根据您的需求进行定制

    - > [赞助商,莎拉波娃,失败,药物,测试]

    4)按字母顺序对数组进行排序(可选,但这可以帮助实现算法...)

    - > [药物,失败,莎拉波娃,赞助商,测试]

    将相同的算法应用于其他字符串,您将获得:

    [澳大利亚,毒品,失败,玛丽亚,开放,莎拉波娃,测试]

    这将帮助您详细说明一个聪明的算法。例如:

    1. 对于第一个字符串中的每个单词,搜索第二个字符串中单词的最高相似度
    2. 累积最高相似度
    3. 将累计的相似度除以单词数
    4. 
          $words1 = ['drug', 'failed', 'sharapova', 'sponsors', 'test'];
          $words2 = ['australian', 'drugs', 'failed', 'maria', 'open', 'sharapova', 'test'];
          $nbWords1 = count($words1);
          $stringSimilarity = 0;
      
          foreach($words1 as $word1){
              $max = null;
              $similarity = null;
              foreach($words2 as $word2){
                  similar_text($word1, $word2, $similarity);
                  if($similarity > $max){ //1)
                      $max = $similarity;
                  }
              }
              $stringSimilarity += $max; //2)
          }
          var_dump(($stringSimilarity/$nbWords1)); //3)
      
      

      运行此代码将为您提供84.83660130719。不错,我想^^。我相信这个算法可以进一步完善,但这是一个好的开始......在这里,我们基本上计算每个单词的平均相似百分比,你可能想要一个不同的最终方法......根据你的需要调整; - )