有没有办法根据正则表达式将输入词与最接近的可接受词匹配,有点像拼写检查/ Google的“你的意思是:x?”正则表达式/有限自动机除外?有没有特定的算法?
编辑:用Java编程,但是如果有任何算法存在,我会更感兴趣。
答案 0 :(得分:1)
您可以使用Levenshtein distance。它计算两个单词的差异/接近程度。
作为代码示例,Python提供了一个function in the difflib module,您传递一个字符串和一个字符串列表,它会为您提供良好的匹配字符串。 因此,您可能希望获得以与您的单词(来自数据库/文件)相同的字母开头的单词列表,然后检查它们的接近程度。 这是否符合您感兴趣的方向?
答案 1 :(得分:1)
一般来说,没有。正则表达式是精确匹配机制。您正在寻找的更多是模糊匹配。
现在,可以构造正则表达式以匹配多个备选方案。其中一些替代品可能代表常见的拼写错误。例如:
r'potatoe?s?'
匹配potato
,potatoe
,potatos
和potatoes
。但是,构建所有可能不太正确的组合是费力且容易出错的。
您通常会采用模糊匹配算法来判断输入术语与所有已知/适当术语列表的“接近程度”。例如,在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])
的好建议。这具有成为标准库的一部分的优点。当然,如果您使用的是其他语言,则需要针对该特定语言探索“查找匹配”库。