Maison > base de données > tutoriel mysql > Comment puis-je calculer efficacement les pourcentages de similarité de chaînes dans MySQL ?

Comment puis-je calculer efficacement les pourcentages de similarité de chaînes dans MySQL ?

Patricia Arquette
Libérer: 2024-11-30 03:57:12
original
349 Les gens l'ont consulté

How Can I Efficiently Compute String Similarity Percentages in MySQL?

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))
Copier après la connexion

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
Copier après la connexion
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
Copier après la connexion

En utilisant ces fonctions, nous pouvons calculer la similarité entre @a et @b comme suit :

SELECT LEVENSHTEIN_RATIO(@a, @b);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal