Angenommen, ich habe eine Reihe von strukturierten Daten gegeben. Die Daten sind bekanntermaßen problematisch, und ich muss sie irgendwie auf Konsistenz abstufen. Zum Beispiel habe ich die Daten wie folgt:Scoring Konsistenz innerhalb des Datensatzes
fieldA | fieldB | fieldC
-------+--------+-------
foo | bar | baz
fooo | bar | baz
foo | bar | lorem
.. | .. | ..
lorem | ipsum | dolor
lorem | upsum | dolor
lorem | ipsum | baz
annehmen So ist die erste Zeile des richtigen Eintrags in Betracht gezogen, weil es relativ mehr Daten in dieser Kombination im Vergleich zu den Aufzeichnungen in der zweiten und dritten Reihe ist. In der zweiten Zeile sollte der Wert für fieldA
foo
sein (inkonsistent aufgrund von Rechtschreibfehlern). In der dritten Zeile sollte dann der Wert fieldC
baz
sein, wie andere Einträge im Datensatz mit ähnlichen Werten für fieldA
(foo
) und fieldB
(bar
) vorschlagen.
Auch in anderen Teil des Datensatzes, gibt es eine andere Kombination, die relativ häufiger (lorem
, ipsum
, dolor
). Das Problem in den folgenden Datensätzen ist das gleiche wie das zuvor erwähnte, nur dass die Wertekombination unterschiedlich ist.
Ich habe zunächst alles in eine SQL-Datenbank ausgegeben und verwende Anweisungen mit GROUP BY
, um die Konsistenz der Feldwerte zu überprüfen. Also wird es eine Abfrage für jedes Feld geben, das ich auf Konsistenz und für jeden Datensatz prüfen möchte.
SELECT fieldA, count(fieldA)
FROM cache
WHERE fieldB = 'bar' and fieldC = 'baz'
GROUP BY fieldA
Dann könnte ich überprüfen, ob der Wert von fieldA
einen Datensatz mit dem Rest durch Bezugnahme des Datensatz auf das Objekt unter (verarbeitetes Ergebnis der vorherigen SQL-Abfrage) konsistent ist.
{'foo': {'consistency': 0.99, 'count': 99, 'total': 100}
'fooo': {'consistency': 0.01, 'count': 1, 'total': 100}}
es war jedoch sehr langsam (-Datensatz hat über 2,2 Millionen Datensätze, und ich bin Überprüfung 4 Felder, so etwa 9mil Abfragen machen), und einen halben Tag zu vollenden würde. Dann habe ich den SQL-Speicher auf elasticsearch ersetzt und die Verarbeitungszeit auf ungefähr 5 Stunden verkürzt, kann es irgendwie schneller gemacht werden?
Auch nur aus Neugier, erfinde ich hier ein Rad neu? Gibt es dafür ein Tool? Momentan ist es in Python3 mit elasticsearch implementiert.
Ich habe keine Zeit, um die Lösung zu sehen, kann ich es verwenden, um Einträge mit mehreren Begriffen zu "score"? z.B. "foo bar" vs. "fooz bar" – Jeffrey04
sollte auch funktionieren. Diffib verwendet Hashes zum Vergleichen. Also wird alles, was hashbar ist, funktionieren. – klaas
lol, sieht nicht wie das Werkzeug aus, das ich brauche. Weil ich nicht alle möglichen (relativ) korrekten kanonischen Werte und Kombinationen für jedes vorhergehende Feld habe. – Jeffrey04