как вычислить сходство между двумя строками в MYSQL
если у меня две строки в mysql:
@ a = "Добро пожаловать в переполнение стека" @ b = "Hello to stack overflow";
есть ли способ получить процент подобия между этими двумя строками с помощью MYSQL? здесь, например, 3 слова похожи, и, таким образом, сходство должно быть примерно таким:
count (похожие слова между @a и @b) / (count (@a) + count (@b) – count (пересечение))
и, следовательно, результат равен 3 / (4 + 4 – 3) = 0,6
любая идея высоко ценится!
- Как обрезать таблицу с ограниченным внешним ключом?
- Ошибка запуска сервера MySql «Сервер завершает работу без обновления PID-файла»
- Разделительная строка с разделителями разделов MySQL в таблицу Temp
- Перенос базы данных из Postgres в MySQL
- mysql выбирает из n последних строк
- Тестирование пропускной способности на одном порту
- MySQL utf8mb4, Ошибки при сохранении Emojis
- Как изменить тип данных для столбца в MySQL?
- MySQL: SELECT с другого сервера
- Использование streamов для создания запросов к базе данных
- Написание дополнительных параметров в хранимых процедурах в MySQL?
- Как сделать нечеткое совпадение имен компаний в MYSQL с PHP для автоматического заполнения?
- Как заставить UTF-8 работать в Java Webapps?
вы можете использовать эту функцию (cop ^ H ^ H ^ Hadapted из http://www.artfulsoftware.com/infotree/queries.php#552 ):
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
и для его использования, поскольку XX% использует эту функцию
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
Я не думаю, что есть хороший одношаговый способ запроса – материал на естественном языке разработан в основном для поиска «google-like», который отличается от того, что вы пытаетесь сделать.
В зависимости от того, что вы на самом деле пытаетесь сделать, я предполагаю, что вы оставили много деталей – я бы:
-
создайте таблицу, в которую вы разделите каждую строку на слова, все в нижнем регистре, разделите пробелы и пунктуацию – в вашем примере вы получите:
string_id word 1 hello 1 from 1 stack 1 overflow 2 welcome 2 from 2 stack 2 overflow
Затем вы можете запускать запросы к этой таблице – например
select count(*) from stringWords where string_id = 2 and word in (select word from stringWords where string_id = 1);
дает вам пересечение.
Затем вы можете создать функцию или аналогичную для вычисления подобия в соответствии с вашей формулой.
Не очень чистый, но он должен выполняться довольно быстро, он в основном реляционный, и он должен быть в значительной степени независимым от языка. Чтобы справиться с возможными опечатками, вы можете рассчитать soundex – это позволит вам сравнить «стек» с «stak» и посмотреть, насколько они похожи на них, хотя это не работает надежно для языков, отличных от английского.
Вы можете попробовать алгоритм SOUNDEX, посмотрите здесь 🙂
SOUNDEX MySQL
ИЗМЕНИТЬ 1:
Может быть, эта ссылка о обработке естественного языка с MySQL может быть полезна
Полнотекстовые поисковые запросы
Как найти похожие результаты и отсортировать по сходству?
НТН!
Это может помочь вам, если вы не хотите писать свои собственные алгоритмы:
http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html