最接近的字符串与正则表达式匹配

时间:2014-11-01 23:11:17

标签: regex fuzzy-search

有没有办法根据正则表达式将输入词与最接近的可接受词匹配,有点像拼写检查/ Google的“你的意思是:x?”正则表达式/有限自动机除外?有没有特定的算法?

编辑:用Java编程,但是如果有任何算法存在,我会更感兴趣。

2 个答案:

答案 0 :(得分:1)

您可以使用Levenshtein distance。它计算两个单词的差异/接近程度。

作为代码示例,Python提供了一个function in the difflib module,您传递一个字符串和一个字符串列表,它会为您提供良好的匹配字符串。 因此,您可能希望获得以与您的单词(来自数据库/文件)相同的字母开头的单词列表,然后检查它们的接近程度。 这是否符合您感兴趣的方向?

答案 1 :(得分:1)

一般来说,没有。正则表达式是精确匹配机制。您正在寻找的更多是模糊匹配。

现在,可以构造正则表达式以匹配多个备选方案。其中一些替代品可能代表常见的拼写错误。例如:

r'potatoe?s?' 

匹配potatopotatoepotatospotatoes。但是,构建所有可能不太正确的组合是费力且容易出错的。

您通常会采用模糊匹配算法来判断输入术语与所有已知/适当术语列表的“接近程度”。例如,在Python中,您可以安装并使用fuzzywuzzy模块,该模块使用Levenshtein distance计算“接近度”:

from fuzzywuzzy import process

commands = ["open", "close", "run", "debug", "help" ]

for word in ["open", "closer", "runt", "defung", "xlkjs"]:
    choice, score = process.extractOne(word, commands)
    if score < 70:
        print "don't understand {0!r} {1}".format(word, score)
    else:
        print "correcting {0!r} to {1!r} (score {2})".format(word, choice, score)

产量:

correcting 'open' to 'open' (score 100)
correcting 'closer' to 'close' (score 91)
correcting 'runt' to 'run' (score 86)
correcting 'defung' to 'debug' (score 73)
don't understand 'xlkjs' 40

您可以调整所需的阈值,以确定“不够接近,无法将其视为可纠正。”

<强>更新

@k-nut提出difflib.get_close_matches(word, possibilities[, n][, cutoff])的好建议。这具有成为标准库的一部分的优点。当然,如果您使用的是其他语言,则需要针对该特定语言探索“查找匹配”库。