检查产品名称表/csv的相似性

数据挖掘 相似 模糊逻辑 文本过滤器
2021-10-04 17:30:36

我们有一个包含大约 18,000 个产品名称的列表(它们来自 80-90 个来源,因此有很多相似但不重复 - 这些是从表中挑选出来的 DISTINCT)不幸的是,这些名称有不同的表达方式. 我们必须尝试规范化数据集,以便为用户提供更有意义的名称。

例如,这样的列表:

Canon EOS 5D Mark III
Canon EOS 5D mk III
Canon EOS 5DMK3
Canon EF 70-200mm f/2.8L IS II USM Lens
Canon EF 70-200mm f/2.8L IS II USM Telephoto Zoom Lens
Canon EF 70-200mm f/2.8L IS USM Lens
Canon EF 70-200mm f/4L USM Lens

我希望能够评估这些字符串并将它们折叠成这样的东西:

Canon EOS 5D Mark III
Canon EF 70-200mm f/2.8L IS II USM 
Canon EF 70-200mm f/2.8L IS USM Lens
Canon EF 70-200mm f/4L USM Lens

但我想知道两个字符串有多相似才能确定这一点。我确实意识到 F2.8 IS II 和 IS USM 可能有点难,但我想我会把它扔进去。

真正的产品名称远没有那么令人兴奋(它们是我们库存的农业设备的零件)。

我们还将这些名称存储在 Postgres (9.5) 数据库表中。我见过的例子比较了两个列表,但不幸的是,我们没有一个主产品列表来做这件事。

1个回答

您的问题被称为检测近乎重复的文档,即您有相似但不完全重复的字符串。最常见的方法是使用余弦相似度Jaccard 相似度您可以查看此页面以获取更多信息

首先,您必须将字符串转换为特征向量,该特征可以是数据库中出现的所有标记(单词)的tf-idf 向量,也可以是n-grams的向量。有关语义和句法特性的讨论,您可以查看此处

最后,您必须检查每对文档的相似性,在您的情况下为 18000。蛮力方法是 O(n^2),因此这可能是不可行的。处理此问题的常用技术是将指纹(散列)与局部敏感散列(LSH)一起使用。

您可以在挖掘海量数据集的第 3 章中找到对整个主题的介绍和一般性讨论