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))
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
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
Menggunakan fungsi ini, kita boleh mengira persamaan antara @a dan @b seperti berikut:
SELECT LEVENSHTEIN_RATIO(@a, @b);
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!