我有一个包含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
找到顶级“类似字符串”的最佳方法是什么?例如,使用上面的示例,我希望将“用户报告”和“交易报告”视为两个顶级“类似字符串”。
答案 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