尝试在百万行表的列中对相似文本行分组 - 欢迎非MySQL方法

2 投票
1 回答
1704 浏览
提问于 2025-04-16 04:15

我在一个MySQL表里有大约4000万个VARCHAR条目。这些字符串的长度在5到80个字符之间。我想把相似的文本分到一起,想到了一个可能的方法:

我可以拿一行数据,计算它和其他每一行的相似度(比如用编辑距离这种方法),然后决定这些行是否属于同一组。不过,我还不太确定怎么做这个决定。比如,我有以下这些条目:

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

我想把这些条目转换成一种形式,给每一组分配一个组ID,然后找到最匹配的条目(在这个例子中,就是'The quick brown fox'和'This is another sentence'),但是我想把'The quick brown fox'和'The qick brwn fox'这两个条目都分到组ID为1的组里,而把其他的分到组ID为2的组里。

有没有更好的方法来解决这个问题?比如利用索引方案或者其他数据库的优势?另外,我想确认一下,我并不是在找包含相似文本的行,而是找彼此相似的行。可以说,有些行因为打字错误而不同,我想把它们纠正过来。

编辑2:我也欢迎其他不使用MySQL的方法,只要能和数据库的性能相当就行

经过一些研究和下面的回答,我发现这并不简单,我可能需要考虑模糊匹配。考虑到我的数据现在存储在数据库里,有没有好的方法可以用?

编辑1:尝试使用MySQL的FULLTEXT

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)

我也想要'The quick brown fox'这一行。

1 个回答

1

你有没有看过MySQL的全文搜索功能

更新一下——MySQL的全文搜索似乎不支持模糊搜索,而这正是你想要的功能。你可以看看MySQL全文搜索的布尔模式部分匹配

不过,MySQL确实支持SOUNDEX()这个函数,它可以匹配发音相似的单词,但对短语就不管用了。

所以,我觉得你可能没什么好运了。

撰写回答