在PHP中查找两个字符串之间的匹配百分比?

4

有人能为我建议一种更好的方法(或者最受欢迎的方法)来使用模糊逻辑查找两个字符串之间的匹配百分比吗?例如,如何计算这两个字符串(例如,名称)在百分比方面的相关性。有人能帮我编写代码吗?我真的很想知道该从哪里开始。


7
使用一些模糊逻辑吗?当然可以,这是一个例子:$matchPercentage = ($str1 == $str2) ? 100 : 0;。不过说正经点,您能详细解释一下吗? - netcoder
12
“更好”这个词,我假设你已经看过了PHP自带的similar_text()levenshtein()函数了吧? - quietmint
3
$matchPercentage = (levenstein($str1, $str2) / strlen($str1)) * 100这段代码的作用是计算两个字符串之间的相似度,使用的是莱文斯坦距离算法。其具体实现为将两个字符串进行比较,根据其编辑距离(即需要进行多少次插入、删除或替换操作才能将一个字符串转化为另一个字符串)计算出它们之间的相似程度,并将结果以百分比的形式表示出来。 - DaveRandom
1
或者 levenstein()soundex() - Dejan Marjanović
@user1518659 但是这两个字符串 完全不同,它们在相同的位置上没有任何相同的字符。你想从这两个字符串中得到什么结果,更重要的是,为什么 - 你想使用什么逻辑? - DaveRandom
显示剩余4条评论
2个回答

12

不需要使用$percent。 - ehsan mohajeri

8

单词比较器

这里是一个基于单词的比较 - 它比基于字符的比较要快得多,而且通常更适合用单词比较人类文本。但是,单词长度确实很重要;为了获得更好的结果,该算法会考虑这一点。请查看末尾的测试结果;我认为它们几乎符合人类的判断。

function wordSimilarity($s1,$s2) {

    $words1 = preg_split('/\s+/',$s1);
    $words2 = preg_split('/\s+/',$s2);
    $diffs1 = array_diff($words2,$words1);
    $diffs2 = array_diff($words1,$words2);

    $diffsLength = strlen(join("",$diffs1).join("",$diffs2));
    $wordsLength = strlen(join("",$words1).join("",$words2));
    if(!$wordsLength) return 0;

    $differenceRate = ( $diffsLength / $wordsLength );
    $similarityRate = 1 - $differenceRate;
    return $similarityRate;

}

这个函数会返回一个0到1之间的浮点数,其中1表示完全相似。

让我们来看一些测试


    $test = "this is something you've never done before";
    
    wordSimilarity($test,"this is something you've never done before");  //  1.000
    wordSimilarity($test,"this is something");                           //  0.588
    wordSimilarity($test,"this is nothing you have ever done");          //  0.312
    wordSimilarity($test,"leave me alone with lorem ipsum");             //  0.000
    wordSimilarity($test,"before you do something you've never done");   //  0.845
    wordSimilarity($test,"never have i ever done this");                 //  0.448


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接