使用Python的jellyfish模块进行最佳匹配(部分字符串匹配)

Using Python's jellyfish module to get best match (partial string matching)

我正在尝试创建某种类型的字典来附加我的结果并使用 jaro 距离函数获得最佳匹配。

这是我尝试匹配 2 个列表并在两个列表中获得最佳匹配名称的尝试的一部分。

示例:

import jellyfish
jellyfish.jaro_distance(u'jellyfish', u'sellyfish')

output: 
0.9259259259259259

我想做的是:

listA = ['grellofish','mellofush','jellyfihs','sellyfish','salmonfish']
listB = ['jellyfish','salmonfish']

#convert to unicode
listA = [unicode(i) for i in listA]
listB = [unicode(i) for i in listB]

for nickB in listB:
    for nickA in listA:
        results = jellyfish.jaro_distance(nickA, nickB)
        print nickB,nickA,results

output:
jellyfish grellofish 0.825925925926
jellyfish mellofush 0.777777777778
jellyfish jellyfihs 0.962962962963
jellyfish sellyfish 0.925925925926
jellyfish salmonfish 0.685185185185
salmonfish grellofish 0.733333333333
salmonfish mellofush 0.7
salmonfish jellyfihs 0.618518518519
salmonfish sellyfish 0.755555555556
salmonfish salmonfish 1.0

在这种情况下,我希望它 return 得分最高的 2 个:

jellyfish jellyfihs 0.962962962963
salmonfish salmonfish 1.0

对于 FuzzyWuzzy 用户,我正在尝试模拟 process.extractOne 函数,您可以在其中将列表传递给 process.extractOne(<value you want to compare>,<list of items you want to compare>),您将获得最佳匹配。

我不使用 FuzzyWuzzy 的原因只是因为处理速度太慢,我不确定后面发生了什么,与另一个 5000 个字符串列表相比,5000 个字符串的匹配最多需要 40 分钟。

这可能会解决您的问题:

def get_closest_match(x, list_random):
    best_match = None
    highest_jaro_wink = 0
    for current_string in list_random:
        current_score = jf.jaro_winkler(x, current_string)
        if(current_score > highest_jaro_wink):
            highest_jaro_wink = current_score
            best_match = current_string
    return best_match
for nickB in listB:
    result = get_closest_match(nickB,listA)
    print nickB, result