【问题标题】:Best machine learning technique for matching product strings匹配产品字符串的最佳机器学习技术
【发布时间】:2012-08-12 09:06:48
【问题描述】:

这是一个谜题...

我有两个数据库,包含相同的 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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 这几乎是最先进的产品匹配。请注意,它仅在您具有属性的“含义”以及产品与属性之间的关联时才有效。这是来自微软研究的相应论文:research.microsoft.com/pubs/148339/offerMatching_kdd.pdf
  • 感谢您的引用——很高兴看到大男孩使用与我最初想到的相同的基本模型。 :) 关于那篇论文的一件事是它假设所有可能的产品及其结构化描述的预先存在的数据库,OP 可能会或可能不会使用这些数据库......你可以想象同时学习这两者,但这会很多更难。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    我对机器学习了解不多,但我知道 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 AAAAAA”匹配。

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

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 2017-01-14
      • 1970-01-01
      • 2013-08-15
      • 2013-06-21
      • 1970-01-01
      • 2023-03-20
      • 2015-01-16
      • 1970-01-01
      相关资源
      最近更新 更多