как вычислить сходство между двумя строками в MYSQL

если у меня две строки в mysql:

 @ a = "Добро пожаловать в переполнение стека"
 @ b = "Hello to stack overflow";

есть ли способ получить процент подобия между этими двумя строками с помощью MYSQL? здесь, например, 3 слова похожи, и, таким образом, сходство должно быть примерно таким:
count (похожие слова между @a и @b) / (count (@a) + count (@b) – count (пересечение))
и, следовательно, результат равен 3 / (4 + 4 – 3) = 0,6
любая идея высоко ценится!

вы можете использовать эту функцию (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

  • Максимальная длина текста типа MySQL
  • Подключение к MySQL с Android с помощью JDBC
  • Как сделать резервную копию одной таблицы в базе данных MySQL?
  • Использование переменной в предложении LIMIT в MySQL
  • MySQL: могу ли я сделать левое соединение и вытащить только одну строку из таблицы соединений?
  • Что такое mysql error 1025 (HY000): ошибка при переименовании './foo' (errno: 150) означает?
  • Агрегатная функция в MySQL-списке (например, LISTAGG в Oracle)
  • Самый быстрый способ найти расстояние между двумя лат / длинными точками
  • Запуск MySQLDump без таблиц блокировки
  • Код ошибки: 2013. Потерянное соединение с сервером MySQL во время запроса
  • Включен ли MySQL в MAMP без файла конфигурации?
  • Давайте будем гением компьютера.