匹配产品字符串的最佳机器学习技术

时间:2012-08-16 02:40:05

标签: machine-learning pattern-matching string-comparison levenshtein-distance

这是一个难题......

我有两个相同50000+电子产品的数据库,我希望将一个数据库中的产品与另一个数据库中的产品相匹配。但是,产品名称并不总是相同的。我已经尝试使用Levenshtein距离来测量弦的相似性但是这没有用。例如,

-LG 42CS560 42-Inch 1080p 60Hz LCD HDTV
-LG 42 Inch 1080p LCD HDTV

这些项目是相同的,但它们的产品名称变化很大。

另一方面......

-LG 42 Inch 1080p LCD HDTV
-LG 50 Inch 1080p LCD HDTV

这些产品名称非常相似。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:17)

我的第一个想法是尝试将名称解析为功能说明(公司LG,尺寸42 Inch,解决方案1080p,类型LCD HDTV)。然后,您可以将这些描述相互匹配以实现兼容性;可以省略产品编号,但不同尺寸。简单的兼容公共属性可能就足够了,或者你可能必须编写/学习关于允许不同属性有多少的规则等等。

根据您拥有的不同种类的产品以及所列出的名称的不同,我实际上可能首先手动定义一组属性,甚至可能只是添加特定的单词/正则表达以匹配它们,迭代地看到什么不是'到目前为止已被解析并为此添加规则。我想,对于一个可能属于多个属性的词汇项而言,并没有太多含糊不清,尽管没有看到你的数据库,我想我不知道。

如果这不可行,这种提取有点类似于半监督的词性标注。但是,它有点不同,因为我认为词汇表比典型的解析更有限,并且产品名称的空间更加层次化:resolution标签仅适用于某些类型的产品。我对这些文献不是很熟悉;你可以使用一些想法。

答案 1 :(得分:13)

使用大量培训示例。对于此示例中的每个可能的对集:

  1. 解析其组件的字符串,即。 company,size_desc,display_type,make等。
  2. 找到一对中两个字符串之间相同组件之间的距离。
  3. 创建一个表示组件之间距离的数字元组。
  4. 根据对中的字符串将元组标记为相同/不相同,作为训练集的一部分。
  5. 提供元组并训练二进制分类器(SVM)。
  6. 现在,当你得到一对你想要决定它们是否相同的字符串时,提取你在训练集中所做的功能,并为各个组件之间的距离创建数字元组。串。将元组提供给训练有素的SVM,并对它们是否相同进行分类。

    使用这样的学习方法的好处是您不必一遍又一遍地修改规则,并且系统也会学习大量相同和不同的产品之间的差异。

    您可以在WEKA中使用LibSVM程序包来执行此操作。

答案 2 :(得分:0)

我对机器学习了解不多,但是我知道Levenshtein距离并不是解决此类问题的最佳方法。

我目前正在解决一个极其相似的问题,并且使用最大连续子序列(https://www.geeksforgeeks.org/longest-consecutive-subsequence)找到了更准确的匹配项。

您也可能会发现最长公共子串也很有帮助(https://www.geeksforgeeks.org/longest-common-substring-dp-29/)。

...或者甚至是两者的组合!

Levenshtein并不是很好,因为它允许替换,这可以轻松地打折具有额外字符的相似字符串。 例如,“ Hello AAAAAA”,“ Hello”和“ BBBBB”。

“ Lelloshtein”距离“ Hello”和“ BBBBB”更近,即使您可能希望“ Hello”与“ Hello AAAAAA”匹配。

LCS和LSS不允许替换,因此使用这两种方法,“ Hello”将与“ Hello AAAAAA”匹配。