在PHP中查找最相似的字符串?

时间:2013-08-06 16:17:23

标签: php

我有一个包含17,000个字符串的数组。许多字符串都有类似的匹配,例如:

User Report XYZ123
Bob Smith
User Report YEI723
User Report
User Report
Number of Hits 27
Frank's Weekly Transaction Report
Transaction Report 123

找到顶级“类似字符串”的最佳方法是什么?例如,使用上面的示例,我希望将“用户报告”和“交易报告”视为两个顶级“类似字符串”。

4 个答案:

答案 0 :(得分:0)

在没有提供所有源代码的情况下,您可以浏览数组并删除您认为无用的组件,例如任何带数字的字母,等等。

然后你可以使用array_count_values()并对该数组进行排序,以查看所涉及的最重要数据。

答案 1 :(得分:0)

您可以为每个字符串计算Levenstein distance与其他字符串进行比较,然后按该值对其进行排序。

$strings = array('str1', 'str2', 'car', 'dog', 'apple', 'house', 'str3');
$len = count($strings);

$distances = array_fill(0, $len, 0);

for($i=0; $i<$len-1; ++$i)
    for($j=$i+1; $j<$len; ++$j)
    {
        $dist = levenshtein($strings[$i], $strings[$j]);
        $distances[$i] += $dist;
        $distances[$j] += $dist;
    }

// Here $distances indicates how of "similar" is each string
// The lower values are more "similar"

答案 2 :(得分:0)

我猜你可以通过每个字符串做一个foreach,并消除那些你不想要特定搜索的字符串。然后通过你离开的那一次(可能还有另一个foreach)并继续缩小你感兴趣的字符串数量,直到只有几个。然后按字母顺序排序。

答案 3 :(得分:-1)

如果你能够将所有字符串作为一个数组,并将它们循环到foreach()这样:

$string_array = array('string', 'string1', 'string2', 'does-not-match');
$needle = 'string';

$results = array();
foreach($string_array as $key => $val):
    if (fnmatch($needle, $val):
        $results[] = $val;
    endif;
endforeach;

最后,您应该结束与$needle匹配的条目。作为fnmatch()的替代方案,您可以使用preg_match()和模式/string/i

$string_array = array('string', 'string1', 'string2', 'does-not-match');
$needle = '/string/i';

$results = array();
foreach($string_array as $key => $val):
    if (!empty(preg_match($needle, $val)):
        $results[] = $val;
    endif;
endforeach;

注意使用empty()并传递preg_match()的结果时可能会出现问题。:

  

在PHP 5.5之前,empty()仅支持变量;其他任何东西都会导致解析错误。换句话说,以下将不起作用:empty(trim($ name))。相反,使用trim($ name)== false。

PHP版本5.3.x不应该发出错误&lt; 5.4