Calcul de la similarité des chaînes dans MySQL
Le calcul de la similarité entre deux chaînes est une tâche courante dans le traitement du langage naturel et l'analyse des données. MySQL fournit une fonction robuste, LEVENSHTEIN, qui permet un calcul efficace et précis de la similarité des chaînes.
LEVENSHTEIN mesure la distance d'édition entre deux chaînes, qui est le nombre minimum d'insertions, de suppressions ou de substitutions requises pour transformer une chaîne. dans l'autre. Une distance de Levenshtein plus faible indique une similarité plus élevée entre les chaînes.
Pour calculer le pourcentage de similarité entre deux chaînes, @a et @b, nous pouvons utiliser la formule suivante :
similarity = count(similar words between @a and @b) / (count(@a) + count(@b) - count(intersection))
où le l'intersection représente le nombre de mots qui apparaissent à la fois dans @a et @b.
Pour implémenter cette formule dans MySQL, nous pouvons utiliser ce qui suit fonctions :
CREATE FUNCTION `levenshtein`( s1 text, s2 text) RETURNS int(11) DETERMINISTIC BEGIN 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; IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE 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; 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 c; END
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
En utilisant ces fonctions, nous pouvons calculer la similarité entre @a et @b comme suit :
SELECT LEVENSHTEIN_RATIO(@a, @b);
Cela renverra le pourcentage de similarité sous forme d'entier valeur comprise entre 0 et 100, où 100 indique une similitude complète.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!