项目列表发现几乎重复
List of items find almost duplicates
在 excel 中,我有艺术家、歌曲、版本的列表。
此列表包含超过 15000 条记录。
问题是该列表确实包含一些 "duplicate" 记录。我说 "duplicate" 是因为它们不完全匹配。有些人可能有一些错字,我想解决这个问题并删除那些记录。
例如一些记录:
ABBA - Mamma Mia - Party
ABBA - Mama Mia! - Official
每个破折号表示一个单独的列(因此填写了 A、B、C 3 列)
如何在 Excel 中将它们标记为重复项?
我发现了模糊查找工具。然而我正在研究 mac,因为它在 mac 上不可用,所以我被卡住了。
任何正则表达式魔术或 vba 脚本可以帮助我吗?
也可以查看该行的相似程度(比如 80% 相似)。
在你的循环中尝试这个工作表函数:
=COUNTIF(Range,"*yourtexttofind*")
您可以使用数组公式来指示重复项,并且可以修改下面的内容以显示行号,这会检查条目下方的行是否有任何可能的 80% 重复项,其中 80% 被视为左侧对吧,不总比较。我的数据是a1:a15000
=IF(NOT(ISERROR(FIND(MID($A1,1,INT(LEN($A1)*0.8)),$A2:$A000))),1,0)
这种方式也会查回列表,表示找到的
=SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A1)*0.8)),$A3:$A000,1)),0,1))+SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A2)*0.8)),$A:$A1,1)),0,1))
第一个条目即第 1 行是公式的第一部分,最后一行需要 +
之后的最后一部分
模糊文本匹配的常用方法之一是 Levenshtein(距离)算法。这里有几个很好的实现:
从那里,您可以直接在电子表格中使用该函数来查找实例之间的相似之处:
你没有问,但这里有一个数据库会非常好。原因是您可以进行笛卡尔连接(这是为数不多的有效用途之一)并将每条记录与其他记录进行比较。例如:
select
s1.group, s2.group, s1.song, s2.song,
levenshtein (s1.group, s2.group) as group_match,
levenshtein (s1.song, s2.song) as song_match
from
songs s1
cross join songs s2
order by
group_match, song_match
是的,这将是一个非常昂贵的查询,具体取决于记录的数量(在您的示例中为 225,000,000 行),但它会冒泡到最有可能重复/匹配项的顶部。不仅如此,您还可以合并 "reasonable" 联接以消除明显的不匹配,例如将其限制为组匹配、几乎匹配、以相同字母开头等的情况,或者预先过滤掉 Levenschtein大于 x.
在 excel 中,我有艺术家、歌曲、版本的列表。 此列表包含超过 15000 条记录。 问题是该列表确实包含一些 "duplicate" 记录。我说 "duplicate" 是因为它们不完全匹配。有些人可能有一些错字,我想解决这个问题并删除那些记录。
例如一些记录:
ABBA - Mamma Mia - Party
ABBA - Mama Mia! - Official
每个破折号表示一个单独的列(因此填写了 A、B、C 3 列)
如何在 Excel 中将它们标记为重复项?
我发现了模糊查找工具。然而我正在研究 mac,因为它在 mac 上不可用,所以我被卡住了。
任何正则表达式魔术或 vba 脚本可以帮助我吗? 也可以查看该行的相似程度(比如 80% 相似)。
在你的循环中尝试这个工作表函数:
=COUNTIF(Range,"*yourtexttofind*")
您可以使用数组公式来指示重复项,并且可以修改下面的内容以显示行号,这会检查条目下方的行是否有任何可能的 80% 重复项,其中 80% 被视为左侧对吧,不总比较。我的数据是a1:a15000
=IF(NOT(ISERROR(FIND(MID($A1,1,INT(LEN($A1)*0.8)),$A2:$A000))),1,0)
这种方式也会查回列表,表示找到的
=SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A1)*0.8)),$A3:$A000,1)),0,1))+SUM(IF(ISERROR(FIND(MID($A2,1,INT(LEN($A2)*0.8)),$A:$A1,1)),0,1))
第一个条目即第 1 行是公式的第一部分,最后一行需要 +
之后的最后一部分模糊文本匹配的常用方法之一是 Levenshtein(距离)算法。这里有几个很好的实现:
从那里,您可以直接在电子表格中使用该函数来查找实例之间的相似之处:
你没有问,但这里有一个数据库会非常好。原因是您可以进行笛卡尔连接(这是为数不多的有效用途之一)并将每条记录与其他记录进行比较。例如:
select
s1.group, s2.group, s1.song, s2.song,
levenshtein (s1.group, s2.group) as group_match,
levenshtein (s1.song, s2.song) as song_match
from
songs s1
cross join songs s2
order by
group_match, song_match
是的,这将是一个非常昂贵的查询,具体取决于记录的数量(在您的示例中为 225,000,000 行),但它会冒泡到最有可能重复/匹配项的顶部。不仅如此,您还可以合并 "reasonable" 联接以消除明显的不匹配,例如将其限制为组匹配、几乎匹配、以相同字母开头等的情况,或者预先过滤掉 Levenschtein大于 x.