Ich habe 2 .csv-Dateien. Einer von ihnen mit neuen Daten hat ~ 100 Zeilen und ein anderer ist ein Nachschlagewerk mit ~ 40.000 Zeilen.Vergleichen Sie 2 .csv-Dateien mit etwas Berechnung sehr langsam
Ich möchte alle Strings aus der ersten Datei (eins nach dem anderen) zu alle Strings aus der zweiten und berechnen die Levenshtein Abstand zur ähnlichsten Zeichenfolge vergleichen.
Danach muss ich eine dritte Datei mit den Ergebnissen erstellen. (Mit allen Daten aus dem ersten Datei, die max Levenshtein-Distanz, und die Zeichenfolge aus der zweiten Datei)
Zum Beispiel:
Datei A (neue Daten):
Spam
foo
Datei B (Nachschlagewerk):
Bar 1 0
Spamm 2 1
Spann 3 0
Booo 1 0
Fooo 2 2
Bo 3 3
...
Was ich brauche (Ergebnisdatei), wobei n = Levenshtein Entfernung:
Spam n Spamm
Foo n Fooo
Vorerst ist mein Code:
def calculate_Leven(source, ref, result_file):
with open(source, 'r') as input1:
with open(ref, 'r') as input2:
with open(result_file, 'w') as csvoutput:
reader1 = csv.reader(input1)
reader2 = list(csv.reader(input2))
writer = csv.writer(csvoutput)
result = []
headers = next(reader1)
result.append(headers)
for row1 in reader1:
print "First row"
max = 0
while max < 1
for row2 in reader2:
a = distance(row1[0],row2[0])
b = 1 - a/len(row1[0])
if b > max:
max = b
SKU = row2[0]
row1.append(max)
row1.append(SKU)
result.append(row1)
writer.writerows(result)
Wo die Entfernung eine Funktion ist, um die Levendsthein-Distanz zu berechnen.
Dieser Code funktioniert, ist aber extrem langsam. Gibt es einen besseren Weg, dies zu strukturieren, oder einen alternativen Weg, der effizienter ist? Ich habe etwa 100 neue Dateien pro Tag gegen das Nachschlagewerk zu überprüfen, so ist die niedrige Geschwindigkeit ein Flaschenhals.
Verwandte: https: // Stackoverflow.com/questions/4173579/implementing-levenshtein-distance-in-python –
Ich denke, Problem nicht in Levenshtein algorythm. Es funktioniert gut und korrekt. Ich habe kleine Daten überprüft, zum Beispiel 100 Zeilen pro Tabelle. Skript funktioniert ungefähr 3 Sekunden –
Mehrere Prozesse mit dem 'concurrent.futures' Modul können dies beschleunigen, wenn Sie mehr als einen CPU/Kern zur Hand haben. Es gibt einen Backport dieses Moduls für Python 2.7. – BlackJack