Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

Bagaimanakah Saya Boleh Mengira Peratusan Kesamaan Rentetan dengan Cekap dalam MySQL?

Patricia Arquette
Lepaskan: 2024-11-30 03:57:12
asal
335 orang telah melayarinya

How Can I Efficiently Compute String Similarity Percentages in MySQL?

Mengkomputerkan Persamaan Rentetan dalam MySQL

Mengira persamaan antara dua rentetan ialah tugas biasa dalam pemprosesan bahasa semula jadi dan analisis data. MySQL menyediakan fungsi teguh, LEVENSHTEIN, yang membolehkan pengiraan persamaan rentetan yang cekap dan tepat.

LEVENSHTEIN mengukur jarak edit antara dua rentetan, iaitu bilangan minimum sisipan, pemadaman atau penggantian yang diperlukan untuk mengubah satu rentetan ke dalam yang lain. Jarak Levenshtein yang lebih rendah menunjukkan persamaan yang lebih tinggi antara rentetan.

Untuk mengira peratusan persamaan antara dua rentetan, @a dan @b, kita boleh menggunakan formula berikut:

similarity = count(similar words between @a and @b) / (count(@a) + count(@b) - count(intersection))
Salin selepas log masuk

di mana persilangan mewakili bilangan perkataan yang muncul dalam kedua-dua @a dan @b.

Untuk melaksanakan formula ini dalam MySQL, kita boleh menggunakan yang berikut fungsi:

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
Salin selepas log masuk
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
Salin selepas log masuk

Menggunakan fungsi ini, kita boleh mengira persamaan antara @a dan @b seperti berikut:

SELECT LEVENSHTEIN_RATIO(@a, @b);
Salin selepas log masuk

Ini akan mengembalikan peratusan persamaan sebagai integer nilai antara 0 dan 100, dengan 100 menunjukkan persamaan lengkap.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan