Нечеткое сравнение двух столбцов

У меня есть CSV-файл с условиями поиска (числа и текст), который я хотел бы сравнить со списком других условий (числа и текст), чтобы определить, есть ли совпадения или потенциальные совпадения. Затем я хотел бы, чтобы все результаты были записаны в новый CSV для ручного просмотра. Я использую подключаемый модуль fuzzywuzzy, чтобы создать «оценку», чтобы определить, насколько близко совпадение между терминами. В идеале я мог бы фильтровать соотношение.

Мой текущий код сравнивает строки файлов один к одному вместо одной строки в первом файле со всеми строками во втором; что мне нужно.

Как выполнить нечеткий поиск каждой строки в файле 1 по всем строкам в файле 2?

from fuzzywuzzy import fuzz
import csv
from itertools import zip_longest

f = open('FuzzyMatch2.csv', 'wt')
writer = csv.writer(f, lineterminator = '\n')


file1_loc = 'LookUp.csv'
file2_loc = 'Prod.csv'

file1 = csv.DictReader(open(file1_loc, 'r'), delimiter=',', quotechar='"')
file2 = csv.DictReader(open(file2_loc, 'r'), delimiter=',', quotechar='"')

for row in file1:
    for l1, l2 in zip_longest(file1, file2):
        if all((l1, l2)):
            partial_ratio = fuzz.token_sort_ratio(str(l1['SearchTerm']), str(l2['Description']))       

        a = [l1,l2,partial_ratio]
        writer.writerow(a)

f.close()

Ниже приведена гораздо более чистая версия приведенного выше кода, но в ней все еще есть проблемы. Код выдает ошибку

IndexError: индекс списка вне допустимого диапазона

Любая идея, как получить список в пределах диапазона и работающий код?

from fuzzywuzzy import process
import csv

save_file = open('FuzzyResults.csv', 'wt')
writer = csv.writer(save_file, lineterminator = '\n')

def parse_csv(path):
    with open(path,'r') as f:
        for row in f:
            row = row.split()
            yield row


if __name__ == "__main__":
    ## Create lookup dictionary by parsing the products csv
    data = {}
    for row in parse_csv('Prod.csv'):
        data[row[0]] = row[1]

    ## For each row in the lookup compute the partial ratio
    for row in parse_csv("LookUp.csv"):

        for found, score in process.extract(row, data, limit=100):
            if score >= 10:
                print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
                Digi_Results = [score, row, found]
                writer.writerow(Digi_Results)


save_file.close()

person djm457    schedule 19.05.2015    source источник
comment
Где вопрос?   -  person Pierre Prinetti    schedule 19.05.2015
comment
Как выполнить нечеткий поиск каждой строки в файле 1 по всем строкам в файле 2?   -  person djm457    schedule 20.05.2015


Ответы (2)


Код ниже будет работать. Убедитесь, что установлена ​​последняя версия FuzzyWuzzy — последнее обновление от 28 апреля 2015 г. В противном случае вы получите ошибку «Юникод». Надеюсь это поможет!

from fuzzywuzzy import process
import csv

save_file = open('FuzzyResults3.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')

def parse_csv(path):

    with open(path,'r') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:
            yield row


if __name__ == "__main__":
    ## Create lookup dictionary by parsing the products csv
    data = {}
    for row in parse_csv('File1.csv'):
        data[row[0]] = row[1]

    ## For each row in the lookup compute the partial ratio
    for row in parse_csv("File2.csv"):
        #print(process.extract(row,data, limit = 100))
        for found, score, matchrow in process.extract(row, data, limit=100):
            if score >= 60:
                print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
                Digi_Results = [score, row, found]
                writer.writerow(Digi_Results)


save_file.close()
person djm457    schedule 01.06.2015

Я предполагаю, что, возможно, вы хотите изменить row.split() на row.split(','), но не можете сказать наверняка, не видя входных файлов, а также точную трассировку ошибки.

person maxymoo    schedule 29.05.2015