我需要比较可以用多种方式编写的名称。例如,像 St. Thomas 这样的名字有时写成 St-Thomas 或 Sant Thomas。最好,我希望构建一个函数,该函数可以为比较提供一定百分比的“平等”,就像一些论坛一样(例如,这篇文章被编辑了 5%)。
5 回答
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%)
?>
两个字符串之间的编辑距离一般是指Levenshtein距离。
$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 的最少字符数
然后检查您的检查的合理阈值。