Php 如何在大型数据集中有效地识别相似但不完全相同的字符串?

Php 如何在大型数据集中有效地识别相似但不完全相同的字符串?,php,string-comparison,similarity,levenshtein-distance,Php,String Comparison,Similarity,Levenshtein Distance,假设我有数千个字符串,需要在其中标识最常见的组 以下是一个示例数据集: 此数据集的前10行表示我要查找的字符串类型。虽然在现实生活中,这些会与其他的混合在一起 一种策略是循环遍历每个字符串,并使用字符串比较工具将其与其他字符串进行比较,并跟踪高度相似性。下面是一些伪php代码来说明这一点: <?php $arr = explode("\n",http://pastebin.com/XGijjsfE); // I know. Just pseudocode here! $winners =

假设我有数千个字符串,需要在其中标识最常见的组

以下是一个示例数据集:

此数据集的前10行表示我要查找的字符串类型。虽然在现实生活中,这些会与其他的混合在一起

一种策略是循环遍历每个字符串,并使用字符串比较工具将其与其他字符串进行比较,并跟踪高度相似性。下面是一些伪php代码来说明这一点:

<?php
$arr = explode("\n",http://pastebin.com/XGijjsfE); // I know. Just pseudocode here!
$winners = array(); // store close matches here
foreach ($arr as $k1 => $line1) {
    foreach ($arr as $k2 => $line2) {
        if ($k1 != $k2) {
            $lev = levenshtein($line1, $line2);
            if ($lev < 10) { // assume 10 is a reasonable start to learn and tune later
                $winners[] = array($line1,$line2,$lev);
            }
        }
    }
}
print_r($winners);
?>

你想使用BK树。该树可以在线性时间内构建,然后可以回答诸如“此集合中的哪些项与我的测试字符串的距离在N的levenshtein范围内”之类的问题。每个查询都是次线性时间。这里有一些用python和haskell构建它们的示例代码,还有一个链接指向关于这个主题的更全面的文章:

就像Adam Hupp说的那样,这是最好的选择。 他的实现非常好,但根据您的评论,您希望随着时间的推移存储BK树值

实现允许您保存BKTree结构,并随时间向结构中添加字符串,这正是您要查找的内容


如果你需要帮助,请告诉我。我实现了它;-)

最好使用搜索引擎,如
Solr
。否则就没有神奇的答案。但使用迭代器比使用数组更能节省内存。确实非常酷。如果我可以从你这里得到更多的信息,我如何存储随时间变化的BK树值?我是否在我的表中增加了两列(
BKx
BKy
?),并在收到新字符串时存储它们?用这些坐标计算类似的字符串?我已经阅读了参考文章,但我很难理解它是如何工作的。这不是你可以在数据库表中插入和查询的东西。您将在内存中根据单词集构建它,然后直接查询它。因此,如果您想了解它是如何随时间变化的,您可以在内存中为每个要比较的时间点构建一个版本。如果您没有,我将查看上面自述中链接的页面,该页面很好地描述了以下内容:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet consectetur adipiscing elit.
My Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit
Lorem ipsum dolor sit amet, consectetur adipiscing elit!
Lorem ipsum dolor sit amet - consectetur adipiscing elit.
Lorem ipsum dolor sit amet. Consectetur adipiscing elit.
Lorems ipsum dolor sit amet, consectetur adipiscing elit.
Lorem & ipsum dolor sit amet, consectetur adipiscing elit.
*Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum non condimentum sapien, in rutrum nisl.
Nunc ante lorem, varius nec nunc id, porttitor malesuada odio.
Ut non nibh tortor.
Donec accumsan auctor nulla, ac tempus lectus varius vel.
In imperdiet in sapien et ultricies.
Integer ultrices neque nibh, vel varius ante ultricies non.
Etiam aliquet pretium ante, at suscipit mi placerat vitae.
Praesent lobortis commodo tincidunt.
Quisque convallis ultricies eros, vel ultricies augue lacinia eget.
Pellentesque aliquam eleifend enim, et rutrum urna vehicula a.
Nunc euismod metus felis, eget ultricies arcu lobortis at.
Quisque quis leo urna.
Fusce malesuada blandit sodales.
Fusce ut dictum lorem, eget molestie mi.
Mauris rutrum neque a nisl volutpat tristique.
Vestibulum sit amet ligula placerat, imperdiet neque at, ullamcorper purus.
Cras id rutrum orci.
Duis lacus tortor, adipiscing a cursus adipiscing, vestibulum ac dolor.
Suspendisse potenti.
Curabitur sed quam metus.
Nullam velit eros, sodales sed dapibus a, convallis et nibh.
Nunc fringilla tempor tristique.
Fusce fermentum erat ut est adipiscing, in consequat sapien ornare.
Vivamus ac magna sollicitudin purus feugiat blandit.
Vestibulum libero tellus, ullamcorper a elit ut, viverra interdum lorem.
Duis sit amet lobortis nisl, et fringilla nunc.
Vivamus nec ante et turpis pretium congue.
Vivamus nec metus ut nisi tempus vehicula.
Duis malesuada lacinia hendrerit.
In nisl ligula, vestibulum nec convallis vel, hendrerit non elit.
Ut in pretium nibh, in fermentum est.
Proin consectetur nisl et nunc ullamcorper sagittis.
Sed aliquet magna sem, quis malesuada felis semper ac.
Proin interdum volutpat sapien, vitae malesuada turpis placerat in.
Nam semper leo vitae turpis faucibus adipiscing.
Morbi odio neque, adipiscing vel nulla faucibus, mollis viverra sem.
Vestibulum ultrices magna et aliquet luctus.
Nulla id tincidunt mauris.
Sed dignissim eget diam lacinia ullamcorper.
Vivamus interdum in ligula quis tempor.
Suspendisse sed posuere ligula, ut varius sem.
Morbi sollicitudin aliquam sapien, id egestas sapien tincidunt sed.
Mauris et massa eget neque fermentum rhoncus.
Vivamus tincidunt ut mi non tincidunt.
In hac habitasse platea dictumst.
Donec non cursus diam.
Nulla ac metus sem.
Duis id nisl dictum, molestie ligula ut, congue nibh.
Nulla eget massa et elit pellentesque blandit.
Donec mauris magna, porttitor ac neque vel, convallis commodo metus.
Nam consequat, orci sed rutrum sagittis, augue sapien mattis nisi, quis fermentum tellus lorem ac magna.
Nam vehicula quam id purus condimentum, vel pharetra tellus posuere.
Quisque vitae massa viverra, bibendum sem non, tempor sapien.
Vivamus aliquam dapibus dictum.
Aliquam sapien dolor, dictum sed augue sit amet, accumsan ultrices justo.
Mauris urna augue, egestas nec nunc in, ultrices fermentum odio.
Nullam vel odio at erat semper convallis.
Curabitur vel nisi erat.
Mauris vulputate dolor quis pharetra euismod.
Pellentesque pretium aliquet quam, dignissim iaculis mi.