对一列产品进行分类的算法?

7
我有一个代表几乎相同产品的列表。例如,在下面的列表中,它们都是Seagate硬盘。
  1. Seagate硬盘500Go
  2. Seagate笔记本电脑120Go硬盘
  3. Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s硬盘
  4. 来自Seagate的新款闪亮的500Go硬盘
  5. Seagate Barracuda 7200.12
  6. Seagate FreeAgent Desk 500GB外置硬盘银色7200RPM USB2.0零售
对于人类而言,硬盘3和5是相同的。我们可以再进一步,假设产品1、3、4和5是相同的,并将产品2和6放入其他类别中。
我们有一个需要分类的大型产品列表。是否有任何想法可以用最佳算法完成此事。有什么建议吗?
我想到了一个贝叶斯分类器,但我不确定它是否是最佳选择。任何帮助将不胜感激!
谢谢。
7个回答

5

您需要至少两个组件:

首先,您需要进行“特征”提取的工具,即获取您的项目并提取相关信息的工具。例如,“新的和闪亮”的信息不如“500GB硬盘”和“西部数据”重要。一个(非常)简单的方法是从每个项目中提取制造商、技术名称(如“USB2.0”)和模式(如“GB”、“RPM”)等信息。

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

请注意,您可能最终会得到数千个条目的向量。即使如此,您仍然需要对结果进行聚类。

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


1
说实话,这似乎更像是一个记录链接问题,而不是一个分类问题。你事先不知道所有的类别,对吧?但是你想要找出哪些产品名称指的是同一个产品,哪些指的是不同的产品?

1

你将会遇到的问题之一是如何在非线性或非有序属性中决定最近邻居。我在这里基于Manuel's entry

你将会面临的一个问题是如何判断(1) Seagate 500Go,(2) Seagate Hard Drive 120Go for laptop和(3) Seagate FreeAgent Desk 500GB External Hard Drive Silver 7200RPM USB2.0 Retail的接近程度:

1与2还是1与3更接近?这些差异是否足以证明它们属于不同的类别?

一个人会说3位于1和2之间,因为外置硬盘可以用于两种类型的机器。这意味着如果有人在寻找桌面电脑的硬盘,并扩大选择范围以包括其他替代品,外置硬盘也将显示出来,但笔记本电脑的硬盘则不会。可能的情况是,SSD、USB存储设备、CD/DVD驱动器甚至会在笔记本电脑驱动器之前显示,从而扩大了范围。

可能的解决方案:

向用户展示属性对,并让他们权衡相似度。给他们一个刻度来告诉你某些属性之间的距离有多近。扩大选择范围将使用此刻度作为该属性上的距离函数。


1

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

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

一个例子:

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

所有这些对象连接到另一个对象,如果它们的某些组合触发,就将输入归类为硬盘驱动器。这些单独的对象会将某些特征输入到黑板上(共同的写作区域,用于描述输入的内容),例如制造商、容量或速度。

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

我在一个用来根据UNSPSC对商品进行分类的产品的原型中使用了类似这样的东西,成功地将汽车零件进行了97%正确的分类。


谢谢你,Malach!非常有趣! - Martin

1

建议的文章非常有帮助,可惜在答案中没有被描述得很好。 - eliasah

0

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


0
首先我会使用CountVectorizer来查看生成的词汇表。会有一些词如'from','laptop','fast','silver'等等。您可以使用停用词来丢弃这些不提供信息的词。我还会将'hard','drive','hard drive'等词丢弃掉,因为我知道这是一个硬盘列表,它们没有提供任何信息。然后我们会得到以下词汇列表:
1. 希捷 500Go 2. 希捷 120Go 3. 希捷 Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s 4. 500Go 希捷等等

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

但上述方法的问题在于,如果您事先不知道品牌列表,则会遇到麻烦。然后,我会使用贝叶斯分类器来查找每个句子,并获取其作为硬盘品牌的概率。我会寻找两件事情

看数据的话,大多数情况下句子会明确提到“硬盘”这个词,那我就知道它肯定是在讨论硬盘。像“梅赛德斯奔驰硬盘”这样的东西出现的可能性很小。 这有点费力,但是我会写一个 Python 网络爬虫来抓取亚马逊上的数据(如果您不会写的话,可以在 Google 上搜索最常用的硬盘品牌并创建列表)。它会给我一个列表,例如“Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb/s”,现在对于每个句子,它将使用类似朴素贝叶斯的算法为我计算出它是品牌的概率。sklearn 对此非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接