我需要比较可以用几种方式书写的名称。例如,像St. Thomas这样的名字有时会被写成St-Thomas或Sant Thomas。最好是建立一个函数,给出比较的“相等程度”百分比,就像一些论坛所做的那样(例如,“此帖子已编辑5%”)。
我需要比较可以用几种方式书写的名称。例如,像St. Thomas这样的名字有时会被写成St-Thomas或Sant Thomas。最好是建立一个函数,给出比较的“相等程度”百分比,就像一些论坛所做的那样(例如,“此帖子已编辑5%”)。
PHP有两个内置函数(主要)来实现此功能。
levenshtein
函数用于计算从字符串1到字符串2所需的更改次数(删除/添加/替换)。(值越低越好)
还有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%)
?>
$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)
,但仍然昂贵)。
请查看levenshtein()
,它可以满足您的需求,并且相对高效(但不是极其高效):
http://www.php.net/manual/en/function.levenshtein.php
你可以采用不同的方法。
你可以使用 similar_text()
函数来检查相似性。
或者
你可以使用 levenshtein()
函数来找出...
Levenshtein 距离被定义为将 str1 转换为 str2 所需替换、插入或删除的最小字符数。
然后检查合理的阈值进行检查。