7

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

  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 放在其他类别中。

我们有一个庞大的产品清单,我想对其进行分类。有没有人知道什么是做这种事情的最佳算法。有什么建议么?

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

谢谢。

4

7 回答 7

5

您至少需要两个组件:

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

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

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

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

于 2009-03-29T20:52:09.240 回答
1

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

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

于 2009-04-14T12:35:43.933 回答
1

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

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

一个例子:

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

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

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

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

于 2009-03-30T11:51:26.893 回答
1

您将遇到的问题之一是确定非线性或无序属性中的最近邻。我正在这里建立曼努埃尔的条目

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

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

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

可能的解决方案:

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

于 2009-03-30T11:29:53.747 回答
0

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

于 2010-04-22T13:38:20.607 回答
0

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

于 2017-02-27T22:09:57.740 回答
0

首先,我会使用 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 的最佳值。你必须做一些手工工作。

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

  1. 看看数据,大多数时候句子会明确提到“硬盘”这个词,然后我就知道它肯定是在谈论硬盘。像“梅赛德斯奔驰硬盘”这样的东西的机会很小。
  2. 这有点费力,但我会在亚马逊上写一个 Python 网络爬虫(或者如果你不能只为最常用的硬盘品牌写一个谷歌并创建一个列表)它给我的列表就像'Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s' 现在对于每个句子,它都会使用诸如朴素贝叶斯之类的东西来给我它是一个品牌的可能性。sklearn 非常方便地做这些事情。
于 2017-03-02T06:51:47.413 回答