首页 > 解决方案 > PHP词比较和加权

问题描述

我目前正在为我正在从事的项目编写搜索匹配。作为搜索的一部分,我将使用精确关键字、短语和其他指标的广泛组合来为搜索结果提供加权分数。

目的是允许将单词 a 与单词/字符串 b 进行比较,并提供返回的加权分数。所以完全匹配将提供 100%。

然后,该分数成为更大数学函数的一部分,因此搜索匹配准确性不仅仅基于此(以防万一那是印象),这仅与显示的匹配的相对权重有关。

function search_match($a, $b, $s, $audit = 0)   /* a = needle, b = haystack, $s = score, adit allow print of match type*/
    {
        $a = strtolower($a);
        $b = strtolower($b);

        $c = explode(' ', $a);
        $d = explode(' ', $b);

        if  ( $a === $b )           {                   $s = $s;        $t='Equal match';       }
        else if ( $a == $b )            {                   $s = $s * 0.9;  $t='Almost equal match';        }
        else if (metaphone($a)==metaphone($b)){                 $s = $s * 0.75; $t='Metaphone match';       }           /* word structure matching */
        else if ( levenshtein($a, $b) == 0  )   {                   $s = $s * 0.7;  $t='Levenshtein';           }           /* Typo capture*/
        else if ( strpos($a,$b) !== false )     {                   $s = $s * 0.6;  $t='A in B';            }
        else if ( strpos($b,$a) !== false )     {                   $s = $s * 0.5;  $t='B in A';            }
        else if ( is_array($d) && in_array($a , $d)) {                  $s = $s * 0.4;  $t='Part of A in part of B';        }
        else if ( is_array($c) && in_array($b , $c)) {                  $s = $s * 0.3;  $t='Part of B in part of A';        }
        else                    {                   $s = 0;     $t='No match';          }   
        return ($audit===1)? $t:$s;
    }

所以,我正在寻找一些支持来完善这一点,特别是: 1. 你是否同意与比赛相关性应用的得分比率?2. 您能否建议任何其他匹配标准或更好的匹配顺序。

我的希望是提供一个很好的单词匹配功能,可以在我的项目之外使用,我在这里看到了类似的片段和 strops 等,但没有任何东西真正“加权”匹配。

编辑:

  1. 如果没有匹配则错过 0.... Doh
  2. 按照@Fatfreddy 的建议添加了变音位和 Levenshtein 权重
  3. 添加了返回匹配类型文本的选项,以便了解如何计算得分。只需通过 audit = 1 即可返回匹配的文本。

标签: phpfunctionstrpos

解决方案


参考 levenshtein 算法

levenshtein Github

PHP 文体

PHP 语言处理

PHP 相似文本库

PHP Bishops Github 库

$a = 'How are you?'; // simple word matching in PHP
        if (strpos($a, 'are') !== false) {
            echo 'true';
        }

推荐阅读