Heim > Datenbank > MySQL-Tutorial > Wie kann ich String-Ähnlichkeitsprozentsätze in MySQL effizient berechnen?

Wie kann ich String-Ähnlichkeitsprozentsätze in MySQL effizient berechnen?

Patricia Arquette
Freigeben: 2024-11-30 03:57:12
Original
335 Leute haben es durchsucht

How Can I Efficiently Compute String Similarity Percentages in MySQL?

Berechnung der String-Ähnlichkeit in MySQL

Die Berechnung der Ähnlichkeit zwischen zwei Strings ist eine häufige Aufgabe bei der Verarbeitung natürlicher Sprache und der Datenanalyse. MySQL bietet eine robuste Funktion, LEVENSHTEIN, die eine effiziente und genaue Berechnung der String-Ähnlichkeit ermöglicht.

LEVENSHTEIN misst den Bearbeitungsabstand zwischen zwei Strings, also die Mindestanzahl von Einfügungen, Löschungen oder Ersetzungen, die zum Transformieren eines Strings erforderlich sind ins andere. Ein geringerer Levenshtein-Abstand weist auf eine höhere Ähnlichkeit zwischen den Zeichenfolgen hin.

Um den Ähnlichkeitsprozentsatz zwischen zwei Zeichenfolgen, @a und @b, zu berechnen, können wir die folgende Formel verwenden:

similarity = count(similar words between @a and @b) / (count(@a) + count(@b) - count(intersection))
Nach dem Login kopieren

wobei die Schnittpunkt stellt die Anzahl der Wörter dar, die sowohl in @a als auch in @b vorkommen.

Um diese Formel in MySQL zu implementieren, können wir Folgendes verwenden Funktionen:

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
Nach dem Login kopieren
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
Nach dem Login kopieren

Mit diesen Funktionen können wir die Ähnlichkeit zwischen @a und @b wie folgt berechnen:

SELECT LEVENSHTEIN_RATIO(@a, @b);
Nach dem Login kopieren

Dies gibt den Ähnlichkeitsprozentsatz als Ganzzahl zurück Wert zwischen 0 und 100, wobei 100 vollständige Ähnlichkeit anzeigt.

Das obige ist der detaillierte Inhalt vonWie kann ich String-Ähnlichkeitsprozentsätze in MySQL effizient berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage