我有一个从数据库中的列表创建的正则表达式,以匹配游戏中建筑物类型的名称。问题是拼写错误,有时那些在游戏中为团队编写说明的人会拼错一个建筑名称,显然正则表达式不会捡起来(即拼写为“大学”和“大学”)。
有关于制作1或2个字母的正则表达式拼写错误拼写的建议吗?
正则表达式是动态生成的,并且可以在能够处理更多负载的本地计算机上运行,所以我作为最后的手段以算法方式创建每个单词的版本,其中缺少一个字母,然后另一个单词添加了字母。
我正在使用PHP,但我希望这个问题的任何解决方案都不是特定于PHP的。
答案 0 :(得分:14)
请允许我向您介绍Levenshtein Distance,衡量字符串之间的差异,将一个字符串转换为另一个字符串所需的转换次数。
它也是built into PHP。
因此,我将输入文件拆分为非单词字符,并测量每个单词与目标建筑物列表之间的距离。如果距离低于某个阈值,则假设它是拼写错误。
我认为你可以通过这种方式获得更多的运气,而不是为每种特殊情况制作正则表达式。
答案 1 :(得分:3)
通过查看以前的结果,谷歌实施“你的意思是”也可能有所帮助:
答案 2 :(得分:3)
soundex类似于levennshtein函数Triptych提到的。这是一种比较字符串的方法。请参阅:http://us3.php.net/soundex
您还可以查看metaphone和similar_text。我会把它放在评论中,但我还没有足够的代表那样做。 :d
答案 3 :(得分:2)
在我们有时使用Soundex()解决这些问题的日子里。
答案 4 :(得分:2)
你很幸运;算法人员已经对正则表达式的近似匹配做了大量工作。这些工具中最古老的可能agrep
最初是在亚利桑那大学开发的,现在有一个很好的开源版本。您只需告诉agrep
您愿意容忍多少错误,并从那里开始匹配。除了行之外,它还可以匹配其他文本块。 link above链接到较新的GPLed版agrep
以及许多特定于语言的库,用于正则表达式的近似匹配。
答案 5 :(得分:1)
这可能有点矫枉过正,但Google的Peter Norvig写了一篇关于用Python编写拼写检查程序的excellent article。这绝对值得一读,可能适用于您的情况。
在文章的最后,他还列出了用其他各种语言提供的算法实现。