3

我需要比较可以用多种方式编写的名称。例如,像 St. Thomas 这样的名字有时写成 St-Thomas 或 Sant Thomas。最好,我希望构建一个函数,该函数可以为比较提供一定百分比的“平等”,就像一些论坛一样(例如,这篇文章被编辑了 5%)。

4

5 回答 5

22

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%)
?>
于 2013-02-12T11:59:26.643 回答
2

两个字符串之间的编辑距离一般是指Levenshtein距离。

http://php.net/manual/en/function.levenshtein.php

于 2013-02-12T12:02:31.633 回答
1
$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),但仍然很昂贵)。

于 2013-02-12T12:04:02.957 回答
0

查看levenshtein(),它可以满足您的需求并且相对高效(但不是非常高效): http ://www.php.net/manual/en/function.levenshtein.php

于 2013-02-12T12:00:41.697 回答
0

您可以使用不同的方法。

您可以使用该similar_text()功能来检查相似性。

或者

您可以使用levenshtein()函数来找出...

Levenshtein 距离定义为您必须替换、插入或删除以将 str1 转换为 str2 的最少字符数

然后检查您的检查的合理阈值。

于 2013-02-12T12:02:13.320 回答