2016-08-22 22 views
0

我想創建某種字典來追加我的結果並使用jaro距離函數獲得最佳匹配。使用Python的水母模塊獲得最佳匹配(部分字符串匹配)

這是我嘗試匹配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

這可能會解決你的問題:

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 
+0

這是我使用的解決方案!感謝您回答。 – BernardL