У меня есть большое количество (около 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)
Мне тоже хотелось послушать «Быстрая коричневая лиса».