使用Python的水母模块获得最佳匹配(部分字符串匹配)

时间:2016-08-22 09:26:21

标签: python string-matching fuzzywuzzy

我正在尝试创建一种类型的字典来附加我的结果并使用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

在这种情况下,我希望它返回得分最高的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分钟。

1 个答案:

答案 0 :(得分:1)

这可能会解决您的问题:

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