在Python中返回给定字符串的模糊匹配列表?

在Python中返回给定字符串的模糊匹配列表?,python,string,levenshtein-distance,fuzzy-search,Python,String,Levenshtein Distance,Fuzzy Search,我已经看到了很多检查两个给定字符串是否是模糊匹配的方法,但是我想为一个给定字符串创建一个潜在模糊匹配列表,这样我就可以在一个巨大的列表中搜索它们 我的代码的目的是查看给定位置是否在Geonames数据库中。我在Geonames中有一个2358121个位置名的列表。当我有一个较小的位置名称子集要搜索时,我遍历名称列表,使用NLTK metrics模块中的函数计算给定位置和每个名称之间的Levenshtein距离,如果Levenshtein距离小于或等于1,则将名称附加到模糊匹配列表中。对于较大的列

我已经看到了很多检查两个给定字符串是否是模糊匹配的方法,但是我想为一个给定字符串创建一个潜在模糊匹配列表,这样我就可以在一个巨大的列表中搜索它们

我的代码的目的是查看给定位置是否在Geonames数据库中。我在Geonames中有一个2358121个位置名的列表。当我有一个较小的位置名称子集要搜索时,我遍历名称列表,使用NLTK metrics模块中的函数计算给定位置和每个名称之间的Levenshtein距离,如果Levenshtein距离小于或等于1,则将名称附加到模糊匹配列表中。对于较大的列表,此实现速度太慢,因此我希望能够创建一个与给定位置的Levenshtein距离小于或等于1的字符串列表,并检查这些字符串是否在地理名称列表中

以下是我当前使用的代码:

def fuzzysearch(givenloc, geonames):
    fuzzymatch = []
    for name in geonames:
        if metrics.edit_distance(name, givenloc) <= 1:
            fuzzymatch.append(name)   
    return fuzzymatch
def fuzzysearch(给定语言、地理名称):
模糊匹配=[]
对于geonames中的名称:

如果metrics.edit_distance(name,givenloc)您可以通过过滤掉所有与第一个字母不匹配的条目,或者甚至规范化每个条目(通过删除所有非字母字符和标点符号)并在第一次运行时匹配这些条目来缩小列表的范围,然后在缩减集上进行完整的模糊匹配。

我想最好的方法是使用SOUNDEX(或类似产品)。您仍然需要检查Levenshtein距离,但您的候选库要小得多。我在JavaScript中为HTML帮助系统的拼写更正程序做了一些非常类似的事情。我认为关于从答案链接到提到的副本的帖子应该可以回答您的问题。我倾向于同意@kind的观点。不过,仅仅编辑距离可能过于简单,无法获得好的结果。