【问题标题】:Generate regular expression for given string and edit distance为给定字符串生成正则表达式并编辑距离
【发布时间】:2012-10-23 09:25:42
【问题描述】:

我有一个问题,我想将数据库中与给定字符串具有一定编辑距离的所有字符串匹配。

我的想法是生成一个正则表达式,它将编辑距离 d 到字符串 s 的所有字符串匹配。

例如,我想为d = 1s = 'abc' 生成一个正则表达式r,格式为:r = 'abc|.abc|.bc|a.c|ab.|abc.' 等等。但我不确定这是否非常有效,或者是否已经有一些很好的算法来解决这个问题?我想考虑在编辑距离中甚至字符交换。所以'acb' 也应该是r 的一部分。我想用PHP实现,然后进行SQL查询:SELECT * FROM table WHERE name RLIKE TheRegularExpression.

这是一个很好的方法吗?或者你会推荐什么?

【问题讨论】:

  • 如果您想要提高效率,首先您应该避免将无法使用索引解决的 ​​WHERE 条件应用于表中的所有记录,除非该表相当小。
  • 另外,考虑到结果模式的长度将是O(nCd),其中n 是字符串的长度,d 是您的距离。这可能会导致非常大的模式。例如,对于80 字符串,所需距离为5,您将向数据库发送大约2 GB 的RE。 (这仅考虑字符替换,而不是换位。)但是,如果您确定字符串会很短和/或d 非常小或非常接近n,这可能是可行的。
  • 这里的另一个含义是,如果字符串是用户输入的,你需要确定长度是否在一定的范围内,否则你会创建一个DoS漏洞。 (与使用用户输入参数的任何非常非常低效的算法一样。)

标签: php mysql regex edit-distance


【解决方案1】:

你可以在 Mysql 中存储一个Levenshtein function。之后,您可以像这样简单地进行搜索:

mysql_qery("SELECT `term` FROM `words` WHERE levenshtein('$word', `term`) BETWEEN 0 AND '$d'");

【讨论】:

    【解决方案2】:

    也许最好的办法是为所有可能性建立一个迭代过程。换句话说,是这样的:

    function findall($startString) {
        // create an array of all strings that are distance one away
        // each element would be $returnArray["abc"] = "abc";
    }
    
    $d = 2; // distance
    $myArray[$startString] = $startString;
    
    for($i = 0; $i < $d; $i++) {
        $newCombos = array_merge(array(), $myArray);
        foreach($myArray as $element) {
            $newCombos = array_merge($newCombos, findall($element));
        }
        $myArray = array_merge(array(), $newCombos);
    }
    
    $myRegex = implode("|", $myArray);
    

    【讨论】:

    • 我注意到该解决方案的唯一一点是,对于较长的单词和高于 2 的编辑距离,sql 查询非常长且速度慢。
    • 我实际上认为 Levenshtein 函数解决方案可能比我的更好(by enrico.bacis),你应该检查一下
    【解决方案3】:

    您需要实现Levenshtein Distance(或类似的东西)。这是用于 MySQL 的function definition

    【讨论】:

    • 一旦确定的编辑距离超过所需的阈值,修改该算法以退出可能会更有效,而不是不必要地计算确切的结果。
    • 谢谢。问题是,在我想使用它的服务器上,我没有使用存储函数和过程的权利......所以我必须用 php 来实现它......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2011-03-11
    • 2015-07-09
    • 2011-03-05
    相关资源
    最近更新 更多