Попытка сгруппировать похожие текстовые строки в столбце таблицы с миллионами строк - Открыто для не-MySQL подходов - PullRequest
2 голосов
/ 17 сентября 2010

У меня есть большое количество (около 40 миллионов) записей VARCHAR в таблице MySQL. Длина строки может быть от 5 до 80 символов. Я пытаюсь сгруппировать похожий текст и подумал о возможном подходе:

Возьмите строку и вычислите меру сходства (например, Изменить расстояние) с каждой другой строкой и решите (хотя я не уверен, как решить), принадлежит ли каждый из них к той же группе. Например, у меня есть следующие записи:

The quick brown fox
The qick brwn fox
This is another sentence
Ths is another sntence

Я хочу иметь возможность преобразовать это в форму, в которой я назначаю идентификатор группы, а затем получаю наилучшее совпадение (поэтому в этом случае это будут «Быстрый коричневый лис» и «Это другое предложение», но назначьте идентификатор группы 1 для записей «Быстрая коричневая лиса» и «Лиса qick brwn» и 2 для другого набора).

Есть ли лучший подход к такой проблеме? Как, может быть, использовать схемы индексации или другие преимущества базы данных? Кроме того, просто подтверждение, я не пытаюсь найти строки, содержащие похожий текст, а строки, которые похожи друг на друга. Возможно, я могу привести веские аргументы в пользу того, что некоторые строки отличаются из-за ошибок опечаток, и я хочу их исправить.

РЕДАКТИРОВАТЬ 2: Открыть для других способов, не используя MySQL, которые могут быть разумно сопоставимы с производительностью БД

Так что после небольшого исследования и ответа, приведенного ниже, это будет не так просто, и мне, возможно, придется поискать нечеткие соответствия. Есть ли хорошие подходы для этого, учитывая, что мои данные теперь хранятся в базе данных?

РЕДАКТИРОВАТЬ 1: Попытка использования FULLTEXT MySQL

mysql> create table fulltextsim(id INT PRIMARY KEY AUTO_INCREMENT, text TEXT, FULLTEXT(text));
Query OK, 0 rows affected (0.44 sec)

mysql> insert into fulltextsim(text) VALUES("The quick brown fox");
Query OK, 1 row affected (0.02 sec)

mysql> insert into fulltextsim(text) VALUES("The qick brwn fox");
Query OK, 1 row affected (0.00 sec)

mysql> insert into fulltextsim(text) VALUES("This is another sentence");
Query OK, 1 row affected (0.00 sec)

mysql> insert into fulltextsim(text) VALUES("Ths is anther sntence");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM fulltextsim WHERE MATCH(text) AGAINST ('The qick brwn');
+----+-------------------+
| id | text              |
+----+-------------------+
|  2 | The qick brwn fox |
+----+-------------------+
1 row in set (0.02 sec)

mysql> SELECT * FROM fulltextsim WHERE MATCH(text) AGAINST ('The qick fox');
+----+-------------------+
| id | text              |
+----+-------------------+
|  2 | The qick brwn fox |
+----+-------------------+
1 row in set (0.00 sec)

Мне тоже хотелось послушать «Быстрая коричневая лиса».

1 Ответ

1 голос
/ 17 сентября 2010

Вы смотрели на функциональность MySQL FULLTEXT ?

ОБНОВЛЕНИЕ - Похоже, что MySQL FULLTEXT не поддерживает нечеткий поиск, и это то, что вы ищете здесь. Проверить Полнотекстовый поиск MySQL Булевский режим Частичное совпадение

MySQL поддерживает функцию SOUNDEX (), которая будет сопоставлять слова, которые звучат аналогично введенным, но это не работает для фраз.

Итак, я думаю, вам может не повезти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...