【问题标题】:Algorithm to classify a list of products? [closed]对产品列表进行分类的算法? [关闭]
【发布时间】:2010-10-16 06:31:18
【问题描述】:

我有一个代表产品的列表,它们或多或少是相同的。例如,在下面的列表中,它们都是希捷硬盘。

  1. 希捷硬盘 500Go
  2. 希捷硬盘 120Go 笔记本电脑
  3. 希捷 Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s 硬盘
  4. 希捷全新闪亮的 500Go 硬盘
  5. 希捷梭子鱼 7200.12
  6. 希捷 FreeAgent Desk 500GB 外置硬盘 银色 7200RPM USB2.0 零售

对于人类来说,硬盘 3 和 5 是相同的。我们可以更进一步,假设产品 1、3、4 和 5 相同,并将产品 2 和 6 放在其他类别中。

我们有大量产品要分类。 有没有人知道什么是做这种事情的最佳算法。有什么建议吗?

我想到了一个贝叶斯分类器,但我不确定它是否是最佳选择。任何帮助将不胜感激!

谢谢。

【问题讨论】:

    标签: algorithm nlp


    【解决方案1】:

    您至少需要两个组件:

    首先,您需要进行“特征”提取的东西,即提取您的物品并提取相关信息。例如,“new and shinny”不如“500Go hard drive”和“seagate”相关。一种(非常)简单的方法包括简单的启发式提取制造商、技术名称(如“USB2.0”)和模式(如“GB”、“RPM”)。

    然后,您最终会为每个项目获得一组功能。一些机器学习人员喜欢将其放入“特征向量”中,即每个特征都有一个条目,设置为 0 或 1,具体取决于该特征是否存在。这是您的数据表示。然后,您可以在此向量上进行距离比较。

    请注意,您最终可能会得到一个包含数千个条目的向量。即使这样,您也必须对结果进行聚类。

    可能有用的维基百科文章:

    【讨论】:

    • 谢谢!非常有趣的方法!
    【解决方案2】:

    您将遇到的问题之一是确定非线性或无序属性中的最近邻。我在Manuel's entry 上构建。

    您将遇到的一个问题是确定 (1) Seagate 500Go、(2) Seagate Hard Drive 120Go for notebooks 和 (3) Seagate FreeAgent Desk 500GB External Hard Drive Silver 7200RPM USB2.0 Retail 的接近程度:

    1 更接近 2 还是更接近 3?差异是否证明了不同的类别?

    人类会说 3 介于 1 和 2 之间,因为外置 HD 可以在两种机器上使用。这意味着,如果有人为他的台式机搜索 HD,并扩大选择范围以包括替代品,那么也会显示外部 HD,但不会显示笔记本电脑 HD。可能,SSD、USB 记忆棒、CD/DVD 驱动器甚至会出现在笔记本电脑驱动器之前,从而扩大范围。

    可能的解决方案:

    向用户展示一对属性,并让他们权衡接近度。给他们一个比例,告诉你某些属性有多接近。扩大选择范围后,将使用此比例作为此属性的距离函数。

    【讨论】:

      【解决方案3】:

      要对产品进行实际分类,您可以使用带有黑板的“增强型神经网络”。 (这只是一个让你思考正确方向的比喻,而不是严格使用这些术语。)

      想象一组通过侦听器或事件连接的对象(就像神经元和突触)。每个对象都有一组模式,并根据这些模式测试输入。

      一个例子:

      • 一个对象测试 ("seagate"|"connor"|"maxtor"|"quantum"| ...)
      • 另一个对象测试 [:digit:]*(" ")?("gb"|"mb")
      • 另一个对象测试 [:digit:]*(" ")?"rpm"

      所有这些对象都连接到另一个对象,如果它们的某些组合触发,则将输入分类为硬盘驱动器。单个对象本身会将某些特征输入到黑板(用于说明输入内容的公共书写区域)中,例如制造商、容量或速度。

      因此,神经元的触发不是基于阈值,而是基于对模式的识别。其中许多神经元可以在黑板上高度并行工作,甚至可以通过其他神经元进行正确分类(也许会引入确定性?)

      我在用于根据UNSPSC 对产品进行分类的产品原型中使用了类似的东西,并且能够对汽车零件进行 97% 的正确分类。

      【讨论】:

      • 谢谢马拉奇!超级有趣!
      【解决方案4】:

      这类问题没有简单的解决方案。特别是如果您的列表非常大(数百万个项目)。也许这两篇论文可以为您指明正确的方向:

      http://www.cs.utexas.edu/users/ml/papers/normalization-icdm-05.pdf http://www.ismll.uni-hildesheim.de/pub/pdfs/Rendle_SchmidtThieme2006-Object_Identification_with_Constraints.pdf

      【讨论】:

      • 建议的文章很有帮助,可惜答案中没有很好地描述
      【解决方案5】:

      MALLET 具有 CRF 和 MaxEnt 的实现,它们可能可以很好地完成这项工作。正如之前有人所说,您需要先提取特征,然后将它们输入分类器。

      【讨论】:

        【解决方案6】:

        说实话,这似乎更像是一个Record Linkage 问题而不是分类问题。你不会提前知道所有的课程是什么,对吧?但是您确实想弄清楚哪些产品名称指的是相同的产品,哪些指的是不同的产品?

        【讨论】:

          【解决方案7】:

          首先我会使用 CountVectorizer 查看生成的词汇表。会有像'from'、'laptop'、'fast'、'silver'等词。你可以使用停用词来丢弃这些没有给我们任何信息的词。我也会继续丢弃“硬盘”、“驱动器”、“硬盘驱动器”等,因为我知道这是硬盘驱动器列表,因此它们不提供任何信息。然后我们会有像

          这样的单词列表
          1. 希捷 500Go
          2. 希捷 120Go
          3. 希捷梭子鱼 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s
          4. 500Go 希捷等

          您可以使用功能列表,例如以 RPM 结尾的内容可能会提供 RPM 信息,以 mb/s 或 Gb/s 结尾的内容也是如此。然后我会丢弃像“1234FBA5235”这样的字母数字字符,这很可能是型号等,不会给我们太多信息。现在,如果您已经知道列表中出现的硬盘品牌,例如“Seagate”、“Kingston”,您可以使用字符串相似度或简单地检查它们是否出现在给定的句子中。完成后,您可以使用聚类将相似的对象组合在一起。现在,具有相似 rpm、gb's、gb/s、品牌名称的对象将聚集在一起。同样,如果你使用 KMeans 之类的东西,你必须找出 K 的最佳值。你必须做一些手工工作。您可以使用散点图和眼球来实现数据分类最佳的 K 值。

          但上述方法的问题是,如果您事先不知道品牌列表,那么您就有麻烦了。然后我会使用贝叶斯分类器来查找每个句子并获得它是硬盘品牌的概率。我会寻找两件事

          1. 查看数据,大多数时候句子会明确提到“硬盘驱动器”这个词,然后我就知道它肯定是在谈论硬盘驱动器。像“梅赛德斯-奔驰硬盘”这样的东西的可能性很小。
          2. 这有点费力,但我会在亚马逊上编写一个 Python 网络 scraper(或者如果你不能只为最常用的硬盘品牌编写一个谷歌并创建一个列表)它给出我现在列出像“Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s”这样的列表,它会使用像朴素贝叶斯这样的东西来给我一个品牌的可能性。 sklearn 非常适合做这些事情。

          【讨论】:

            猜你喜欢
            • 2010-10-19
            • 1970-01-01
            • 2021-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-05
            • 1970-01-01
            相关资源
            最近更新 更多