PHP单词比较和加权

PHP单词比较和加权,php,function,strpos,Php,Function,Strpos,我目前正在为我正在从事的一个项目编写搜索匹配。作为搜索的一部分,我将使用精确的关键字、短语和其他指标的广泛混合,为搜索结果提供加权分数 其目的是允许将单词a与单词/字符串b进行比较,并提供返回的加权分数。因此,精确匹配将提供100% 这个分数然后成为一个更大的数学函数的一部分,因此搜索匹配的准确度并不仅仅基于此(以防万一这是印象),这只是关于显示的匹配的相对权重 function search_match($a, $b, $s, $audit = 0) /* a = needle, b =

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

其目的是允许将单词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等片段,但没有任何东西真正“权重”匹配

编辑:

  • 如果没有匹配0,则未命中。。。。Doh
  • 添加了@fatfredy建议的变音和Levenshtein权重
  • 添加了返回匹配类型文本的选项,以便查看如何计算分数。对于匹配的文本返回,只需通过audit=1 参考levenshtein算法


    你读过php的板载工具吗?e、 g.和。或者这两种功能的组合:使用两个字符串的变音并比较levenshtein距离?就个人而言,不要使用大量的
    else if
    ,我会将每个语句作为
    if
    ,这样一个完美的匹配仍然会得到最大分数,但如果字符串位于干草堆的开头,你可能会得到更高的分数。它可能会导致比100、90、80或其他你正在做的更好的分数。斜体字当然更轻。刚刚路过:)@Fatfredy,很好,谢谢。不,我以前没有遇到过,我会整合,thanks@sdexp,我在主要得分范围内。基本上,比赛被分配一个最高分数(包括位置、类别、距离和许多其他因素)。根据重要性,定义每个分数(比如5分)。这5个最大点然后通过函数(因此根据匹配的标准进行进一步细化)。其目的是使搜索结果具有更精确的权重,这很容易做到100%、90%等等。“100%栏的所有内容都是学术性的,但我觉得值得为结果权重增加一些深度。谢谢裁判迪内什,@fatfredy已经提出了这些建议。”。strops已经开始了integrated@Pete-iCalculator听起来不错。。检查其他参考资料,它们在某些情况下也会帮助您
    $a = 'How are you?'; // simple word matching in PHP
            if (strpos($a, 'are') !== false) {
                echo 'true';
            }