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



这是一个谜题...

我有两个相同的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

这些是具有非常相似的产品名称的不同产品。

我应该如何解决这个问题?

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

根据您有多少种不同类型的产品以及列出的名称有何不同,我实际上可能会从手动定义一组属性开始,甚至可能只是添加特定的单词/正则表达式来匹配它们,迭代查看到目前为止尚未解析的内容并为此添加规则。我想一个词汇项目可能属于多个属性,没有太多歧义,尽管没有看到你的数据库,我想我不知道。

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

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

  1. 解析字符串的组件,即公司、size_desc、display_type、制造等。
  2. 求一对的两个字符串之间相同分量之间的距离。
  3. 创建一个数字元组,表示组件之间的距离。
  4. 根据作为训练集一部分的字符串将元组标记为相同/不相同。
  5. 馈送元组并训练二元分类器 (SVM)。

现在,当您获得一对想要确定它们是否相同的字符串时,请像在训练集中一样提取特征,并为字符串的各个组成部分之间的距离创建数字元组。将元组馈送到经过训练的 SVM,并将它们分类是否相同。

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

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

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

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

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

。甚至可能是两者的结合!

Levenshtein 不是很好,因为它允许替换,这很容易打折具有额外字符的类似字符串。例如,"Hello AAAAAA"、"Hello"和"BBBBB"。

"Hello"

和"BBBBB"距离更近Levenshtein,即使你可能希望"Hello"与"Hello AAAAAAA"匹配。

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

最新更新