Postgresql levenshtein距离群
我有postgreSQL 9.2 我的任务是在表中查找相似的名称(受一些levenshtain距离的限制) 例如,距离为3,表中有数据:Postgresql levenshtein距离群,postgresql,levenshtein-distance,Postgresql,Levenshtein Distance,我有postgreSQL 9.2 我的任务是在表中查找相似的名称(受一些levenshtain距离的限制) 例如,距离为3,表中有数据: | name | |***************************| | Marcus Miller | | Marcos Miller | | Macus Miler | | David Bowie | |
| name |
|***************************|
| Marcus Miller |
| Marcos Miller |
| Macus Miler |
| David Bowie |
| Dave Grohl |
| Dav Grol |
| ... |
我想得到的结果如下:
| Marcus Miller, Marcos Miller, Macus Miler |
| Dave Grohl, Dav Grol |
| ... |
或
我试过这个:
SELECT a.name, b.name
FROM my_table a
JOIN my_table b ON b.id < a.id AND levenshtein(b.name, a.name) < 3;
选择a.name,b.name
从我的桌子a
在b.id
但是我的数据太慢了。你的问题在概念上有重大错误
groupby
将某些(在数学意义上)作为参数,并将其用于SQL关系
问题是,您描述的关系,即“两个字符串在彼此的特定编辑距离内”,不是等价关系。它是对称的和自反的,但不是传递的。举例来说,如果我向您的数据集中添加了一系列名称,这些名称将“Marcus Miller”变形为“Dave Grohl”,并且该系列中的每个名称都在与前一个名称的编辑距离之内,那么答案应该是什么
然而,有一些算法使用非等价关系(如几何距离)来划分数据集。是最著名的例子之一。也许有一种方法可以适应k-means或类似于这个问题的东西,我不知道。groupbyidea是一个非启动的想法-选择Select\u levenshtein\u Group\u func\u('Marcus Miller',3)be的输出是什么?换句话说:你可以有3个名字a,b和c,这样从a到b的Levenshtein距离是3,从b到c的距离是3;因此组将是(a,b),(b,a,c)和(c,b)-SQL Group By无法将同一条目放入多个组中,因此无法生成该结果。顺便说一句,您的模拟查询也不正确,
HAVING
子句应为HAVING count(*)>1
,如count(grouped\u列)
的定义总是1。为什么的计数(分组列)
总是1?例如,查询按COUNT(name)>1的名称从用户组中选择名称
返回用户名,用户名不是唯一的。嗯,你说得对,它会,因为COUNT(name)
统计组中name
的非空值的数量,即使它们都是相同的(与COUNT(DISTINCT name)
相反,COUNT(DISTINCT name)总是1)COUNT(1)
或COUNT(*)
将是相同的,除非name
中存在NULL
值,并且对读者来说更为明显COUNT(某些函数(名称))
特别不直观,因为该函数通常不相关。使用levenstein无法做到这一点,请查看@lpsmith对原因的回答。但是,如果要按所有听起来相似的名称进行分组,可以使用soundex()
或metaphone()
函数(位于同一模块中)
SELECT a.name, b.name
FROM my_table a
JOIN my_table b ON b.id < a.id AND levenshtein(b.name, a.name) < 3;