Kann ich Activerecord verwenden, um Zeilen zu finden, basierend auf Nearest-Match (levenshtein Entfernung)
-
18-09-2019 - |
Frage
Ich habe eine Tabelle von Strings in meiner Datenbank. Ich wähle eine von ihnen, A .
Wie kann ich den Rest der Tabelle suchen die Zeichenfolge am ähnlichsten A
findenLösung
Ich glaube, Sie für die Levenstein Entfernung suchen. Der Levenstein Abstand zwischen zwei String, ist, wie viel das Hinzufügen / Löschen / Modifizieren Zeichen benötigt wird, um die Zeichenfolge gleich zu machen.
Andere Tipps
Wenn Sie nach der klanglichen Ähnlichkeit zwischen zwei Strings sind, können Sie die SQL soundex Funktion nutzen konnten (es auch in Oracle metaphone ist).
Dies wird die Zeichenfolge übergeben, um es in einen 4-stelligen Code (1 Buchstabe, 3 Nummern iirc) umwandeln, die den Laut Klang des Wortes darstellt (s).
Wenn Sie dies tun, um beide der Saiten Sie vergleichen, wenn sie klanglich ähnlich sind, dann können Sie die Codes entsprechen.
Hier ist eine einfache Implementierung der Levenshtein Entfernung Algorithmus in Ruby:
def levenshtein(a, b)
case
when a.empty?: b.length
when b.empty?: a.length
else [(a[0] == b[0] ? 0 : 1) + levenshtein(a[1..-1], b[1..-1]),
1 + levenshtein(a[1..-1], b),
1 + levenshtein(a, b[1..-1])].min
end
end
Der Levenshtein Abstand zwischen zwei Zeichenkette durch die minimale Anzahl von Operationen gegeben wird benötigt, um eine Zeichenkette in die andere zu transformieren, wobei eine Operation eine Insertion, Deletion oder Substitution eines einzelnen Zeichens.