Python-Fuzzy-Matching (FuzzyWuzzy) - nur das Beste Match
Ich versuche zu fuzzy-match-zwei csv-Dateien, die jeweils eine Spalte von Namen, die ähnliche aber nicht die gleichen.
Mein code bisher wie folgt aus:
import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv
save_file = open('fuzzy_match_results.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('names_1.csv'):
data[row[0]] = row[0]
## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.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 = [row, score, found]
writer.writerow(Digi_Results)
save_file.close()
Die Ausgabe ist wie folgt:
Name11 , 90 , Name25
Name11 , 85 , Name24
Name11 , 65 , Name29
Das Skript funktioniert. Die Ausgabe ist wie erwartet.
Aber was ich Suche, ist nur das beste match.
Name11 , 90 , Name25
Name12 , 95 , Name21
Name13 , 98 , Name22
Also muss ich irgendwie ablegen, die doppelte Namen in Spalte 1, basierend auf dem höchsten Wert in Spalte 2.
Es sollte ziemlich einfach sein, aber ich kann nicht scheinen, um es herauszufinden.
Jede Hilfe würde geschätzt werden.
Ein straight-forward Weg ist, um zwei temp-Wert Datensatz der aktuelle Datensatz ist höchste übereinstimmung und die Bewertung. Dann nur schreiben, dass Sie die Datei sofort nach der inneren Schleife beendet
InformationsquelleAutor Kvothe | 2015-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
fuzzywuzzy ist
process.extract()
gibt die Liste in umgekehrter Reihenfolge sortiert , mit den besten match kommen zuerst.so, zu finden, die am besten passen, können Sie den Grenzwert als argument
1
, so dass es gibt nur die beste übereinstimmung, und wenn diese größer ist als 60 , Sie können schreiben Sie Sie zu der csv-Datei, wie Sie jetzt tun.Beispiel -
InformationsquelleAutor Anand S Kumar
Mehrere Stücke des Codes kann stark vereinfacht werden durch die Verwendung
process.extractOne()
von FuzzyWuzzy. Nicht nur, dass es nur wieder das top-Spiel, können Sie eine Gesamtpunktzahl für die es innerhalb der Funktion aufrufen, anstatt Sie durchführen müssen eine separate logische Schritt, z.B.:Diese Funktion gibt ein Tupel in der höchsten match-plus die dazugehörige Partitur, wenn es eine übereinstimmung findet, die die Bedingung erfüllen. Wird es wieder
None
sonst.InformationsquelleAutor Michael Ohlrogge
Schrieb ich einfach die gleiche Sache für mich, aber in der pandas....
Habe ich die Schwelle von 50 in diesem, aber es ist konfigurierbar.
Dataframe1 sieht aus wie
Und Dataframe2 sieht aus wie
So läuft es produziert die Spiele der
Hoffe, das hilft.
InformationsquelleAutor Tim Seed