2016-11-24 5 views
0

Я хочу сравнить список извлеченных промо-кодов со списком правильных промо-кодов.Как сравнить каждый элемент в списке с каждым элементом в другом списке?

Если промокод в извлеченном списке, который сравнивается с промокодами в списке correct_promo_code, не находит точного соответствия, то это означает, что в промо-коде есть ошибки. для того, чтобы найти правильный промо-код из списка correct_promo_codes, мне нужно найти промо-код с минимальным расстоянием редактирования (расстояние levenshtein) с тем, которое сравнивается (из extract_list).

код до сих пор: -

import csv 

with open("all_correct_promo.csv","rb") as file1: 
    reader1 = csv.reader(file1) 
    correctPromoList = list(reader1) 
    #print correctPromoList 

with open("all_extracted_promo.csv","rb") as file2: 
    reader2 = csv.reader(file2) 
    extractedPromoList = list(reader2) 
    #print extractedPromoList 

incorrectPromo = [] 
count = 0 
for extracted in extractedPromoList: 
    if(extracted not in correctPromoList): 
     incorrectPromo.append(extracted) 
    else: 
     count = count + 1 
#print incorrectPromo 

for promos in incorrectPromo: 
    print promos 
+0

Последняя часть вашего вопроса не слишком ясно ... – JClarke

+0

, если промо-код в списке, который сравнивается с промо-кодами в кортеже, не находит точного соответствия, значит, у промо-кода есть ошибки. чтобы найти правильный промо-код из набора промо-кодов, мне нужно найти промо-код в кортеже с минимальным расстоянием для редактирования с тем, который сравнивается (из списка). – safwan

ответ

0

Согласно nltk docs

nltk.metrics.distance.edit_distance(s1, s2, transpositions=False) 

вычисляет Левенштейна редактирования-расстояние между двумя строками. Расстояние редактирования - это количество символов, которые необходимо заменить, вставить или удалить, чтобы преобразовать s1 в s2. Например, для преобразования «дождь» в «сияние» требуются три шага, состоящие из двух подстановок и одной вставки: «дождь» -> «священный» -> «голень» -> «блеск». Эти операции могли быть выполнены в других заказах, но требуется не менее трех шагов.

Приходя к вашему кодекса, я думаю, что некоторые изменения в нижней части захватит редактировать расстояние -

from nltk.metrics import distance # slow to load 

extractedPromoList = ['abc','acd','abd'] # csv of extracted promo codes dummy 
correctPromoList = ['abc','aba','xbz','abz','abx'] # csv to real promo codes dummy 

def find_min_edit(str_,list_): 
    nearest_correct_promos = [] 
    distances = {} 
    min_dist = 100 # arbitrary large assignment 
    for correct_promo in list_: 
     dist = distance.edit_distance(extracted,correct_promo,True) # compute Levenshtein distance 
     distances[correct_promo] = dist # store each score for real promo codes 
     if dist<min_dist: 
      min_dist = dist # store min distance 
    # extract all real promo codes with minimum Levenshtein distance 
    nearest_correct_promos.append(','.join([i[0] for i in distances.items() if i[1]==min_dist])) 
    return ','.join(nearest_correct_promos) # return a comma separated string of nearest real promo codes 

incorrectPromo = {} 
count = 0 
for extracted in extractedPromoList: 
    print 'Computing %dth promo code...' % count 
    incorrectPromo[extracted] = find_min_edit(extracted,correctPromoList) # get comma separated str of real promo codes nearest to extracted 
    count+=1 
print incorrectPromo 

Выход

Computing 0th promo code... 
Computing 1th promo code... 
Computing 2th promo code... 
{'abc': 'abc', 'abd': 'abx,aba,abz,abc', 'acd': 'abx,aba,abz,abc'}