Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

DDD
DDDasal
2024-12-03 21:49:13754semak imbas

How to Efficiently Calculate String Similarity Percentage in MySQL?

Cara Mengira Persamaan Rentetan dalam MySQL

Untuk menentukan persamaan antara dua rentetan yang disimpan dalam MySQL, pertimbangkan untuk menggunakan algoritma yang cekap seperti jarak Levenshtein. Pendekatan ini mengira bilangan suntingan satu aksara (penambahan, penyingkiran atau penggantian) yang diperlukan untuk mengubah satu rentetan kepada rentetan yang lain.

Pelaksanaan menggunakan Fungsi MySQL

MySQL menyediakan satu siri fungsi untuk rentetan manipulasi. Berikut ialah contoh fungsi (levenshtein) yang mengira jarak Levenshtein antara dua rentetan, s1 dan s2:

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

Mengira Peratusan Kesamaan

Dengan jarak Levenshtein yang dikira, anda boleh mengira peratusan persamaan seperti berikut:

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

Untuk contoh, jika anda mempunyai dua rentetan dalam MySQL:

SET @a = "Welcome to Stack Overflow";
SET @b = "Hello to stack overflow";

Menggunakan fungsi levenshtein_ratio:

SELECT LEVENSHTEIN_RATIO(@a, @b);

Akan mengembalikan nilai yang mewakili peratusan persamaan antara dua rentetan, mis. 60 untuk contoh yang disediakan.

Atas ialah kandungan terperinci Bagaimana untuk Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn