Heim >Datenbank >MySQL-Tutorial >Wie kann man den Prozentsatz der String-Ähnlichkeit in MySQL effizient berechnen?

Wie kann man den Prozentsatz der String-Ähnlichkeit in MySQL effizient berechnen?

DDD
DDDOriginal
2024-12-03 21:49:13758Durchsuche

How to Efficiently Calculate String Similarity Percentage in MySQL?

So berechnen Sie die String-Ähnlichkeit in MySQL

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.

Implementierung mit MySQL-Funktionen

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

Ähnlichkeitsprozentsatz berechnen

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!

Stellungnahme:
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