我有一个带有企业数据库的python应用程序,我希望能够按名称搜索企业(用于自动完成目的)。
例如,考虑名称“最佳购买”,“麦当劳”,“索尼”和“苹果”。
我希望“app”返回“apple”,以及“appel”和“ple”。 “麦当劳”应该回归“麦当劳”。 “bst b”和“best-buy”都应该返回“最佳购买”。
我在寻找哪种算法,是否有python实现?
谢谢!
答案 0 :(得分:5)
Levenshtein distance应该这样做。
环顾四周 - 有多种语言的实现。
答案 1 :(得分:2)
Levenshtein距离会做到这一点。
注意:这是一个距离,您必须将其计算到数据库中的每个字符串,如果您有大量条目,这可能是一个大问题。
如果您遇到此问题,则记录用户所做的所有拼写错误(拼写错误=无直接匹配),并离线构建包含所有拼写错误>修复映射的更正数据库。有些公司更聪明地做到这一点,例如:google观察用户如何纠正自己的拼写错误并从中学习映射。
答案 2 :(得分:0)
Soundex或Metaphone可能有用。
答案 3 :(得分:0)
我认为您正在寻找的是一个巨大的数据质量和数据清理领域。我担心如果你能找到关于这个的python实现,因为它必须能够清除db中可能具有商业价值的大量数据。
答案 4 :(得分:0)
Levensthein距离朝着正确的方向前进,但只有一半。有几种技巧可以让它使用半场比赛。
一种是使用子序列动态时间扭曲(DTW实际上是levensthein距离的推广)。为此,您可以在计算成本矩阵时放松开始和结束案例。如果您只放松其中一个条件,您可以通过拼写检查获得自动完成功能。我不确定是否有可用的python实现,但是如果你想自己实现它,它不应该超过10-20 LOC。
另一个想法是使用Trie加速,可以同时对多个结果执行DTW / Levensthein(如果数据库很大,则可以大幅加速)。关于Levensthein的一篇关于IEEE的试验的文章,你可以在那里找到算法。再次为此你需要放松最后的边界条件,所以你得到部分匹配。然而,既然你在trie中下台了,你只需要检查你完全消耗了输入然后返回所有叶子。
答案 5 :(得分:0)
检查一下http://docs.python.org/library/difflib.html 它应该会帮助你