2017-09-20 1 views
2

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.

+0

Verwandte: https: // Stackoverflow.com/questions/4173579/implementing-levenshtein-distance-in-python –

+0

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 –

+0

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

Antwort

0

Nicht zu Ihrem Algorithmus gehörig, aber wenn Sie 100 Dateien pro Tag ausführen und sich die Referenzdatei nicht ändert, kann es nützlich sein, eine Masterdatei (oder eine Datenbank) mit allen bereits berechneten Werten zu erstellen . Wenn die Dateien groß sind und viele redundante Daten vorhanden sind, kann dies die Leistung im Laufe der Zeit erheblich steigern.

0

, wenn es eine Chance, dass Sie Sie in einem der Datei doppelte Einträge haben, können Sie sortieren -uniq sie vor der Verarbeitung

+0

Danke für die Antwort. Wir haben keine doppelten Zeilen in beiden Dateien. –