我需要比较可以用多种方式编写的名称。例如,圣托马斯这样的名字有时候就像圣托马斯或圣托马斯一样。最好是,我希望构建一个函数,为比较提供“相等”的百分比,就像某些论坛一样(这篇文章是5%编辑的)。
答案 0 :(得分:20)
PHP有两个(主要)内置函数。
levenshtein
计算从string1生成string2需要多少更改(删除/添加/替换)。 (越低越好)
和
similar_text
返回匹配字符的数量(越高越好)。请注意,您可以将引用作为第三个参数传递,它将为您提供百分比。
<?php
$originalPost = "Here's my question to stack overflou. Thanks /h2ooooooo";
$editedPost = "Question to stack overflow.";
$matchingCharacters = similar_text($originalPost, $editedPost, $matchingPercentage);
var_dump($matchingCharacters); //int(25)
var_dump($matchingPercentage); //float(60.975609756098) (hence edited 40%)
?>
答案 1 :(得分:2)
两个字符串之间的编辑距离通常是指Levenshtein距离。
答案 2 :(得分:0)
查看levenshtein()
,它可以满足您的需求并且相对有效(但效率不高):
http://www.php.net/manual/en/function.levenshtein.php
答案 3 :(得分:0)
您可以使用不同的方法。
您可以使用similar_text()
功能检查相似性。
OR
您可以使用levenshtein()
功能查找...
Levenshtein距离定义为您必须替换,插入或删除以将str1转换为str2的最小字符数
然后检查一下合理的检查门槛。
答案 4 :(得分:0)
$v1 = 'pupil';
$v2 = 'people';
# TRUE if $v1 & $v2 have similar pronunciation
soundex($v1) == soundex($v2);
# Same but it use a more accurate comparison algorithm
metaphone($v1) == metaphone($v2);
# Calculate how many common characters between 2 strings
# Percent store the percentage of common chars
$common = similar_text($v1, $v2, $percent);
# Compute the difference of 2 text
$diff = levenshtein($v1, $v2);
因此,levenshtein($v1, $v2)
或similar_text($v1, $v2, $percent)
会为您完成,但仍有权衡。 levenshtein()
算法的复杂性为O(m*n)
,其中n和m是v1和v2的长度(与similar_text()
进行比较时相当好,即O(max(n,m)**3)
,但仍然昂贵)。