Heim >Datenbank >MySQL-Tutorial >Wie kann man den Prozentsatz der String-Ähnlichkeit in MySQL effizient berechnen?
Um die Ähnlichkeit zwischen zwei in MySQL gespeicherten Strings zu bestimmen, sollten Sie die Verwendung eines effizienten Algorithmus wie der Levenshtein-Distanz in Betracht ziehen. Dieser Ansatz berechnet die Anzahl der Einzelzeichenbearbeitungen (Hinzufügungen, Entfernungen oder Ersetzungen), die erforderlich sind, um eine Zeichenfolge in eine andere umzuwandeln.
MySQL stellt eine Reihe von Funktionen für Zeichenfolgen bereit Manipulation. Hier ist eine Beispielfunktion (levenshtein), die den Levenshtein-Abstand zwischen zwei Zeichenfolgen, s1 und s2, berechnet:
CREATE FUNCTION `levenshtein`(s1 text, s2 text) RETURNS int(11) DETERMINISTIC BEGIN # Initialize variables DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; DECLARE s1_char CHAR; DECLARE cv0, cv1 text; SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; # Check for edge cases IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE # Main loop over s1 characters WHILE j <= s2_len DO SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; END WHILE; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; # Inner loop over s2 characters WHILE j <= s2_len DO SET c = c + 1; IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; IF c > c_temp THEN SET c = c_temp; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j + 1, 1)), 16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; END WHILE; SET cv1 = cv0, i = i + 1; END WHILE; END IF; # Return Levenshtein distance RETURN c; END
Mit dem berechneten Levenshtein-Abstand können Sie den Ähnlichkeitsprozentsatz berechnen wie folgt:
CREATE FUNCTION `levenshtein_ratio`(s1 text, s2 text) RETURNS int(11) DETERMINISTIC BEGIN DECLARE s1_len, s2_len, max_len INT; SET s1_len = LENGTH(s1), s2_len = LENGTH(s2); IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF; RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100); END
Zum Beispiel, wenn Sie zwei Saiten haben MySQL:
SET @a = "Welcome to Stack Overflow"; SET @b = "Hello to stack overflow";
Verwendung der Funktion levenshtein_ratio:
SELECT LEVENSHTEIN_RATIO(@a, @b);
Gibt einen Wert zurück, der den Ähnlichkeitsprozentsatz zwischen den beiden Zeichenfolgen darstellt, z. B. 60 für das bereitgestellte Beispiel.
Das obige ist der detaillierte Inhalt vonWie kann man den Prozentsatz der String-Ähnlichkeit in MySQL effizient berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!