算法对产品列表进行分类?

时间:2009-03-29 20:44:05

标签: algorithm nlp

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

  1. Seagate Hard Drive 500Go
  2. 希捷硬盘120Go笔记本电脑
  3. Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb / s硬盘
  4. 来自希捷的全新和新颖的500Go硬盘
  5. Seagate Barracuda 7200.12
  6. 希捷FreeAgent Desk 500GB外置硬盘银7200RPM USB2.0零售
  7. 对于人类而言,硬盘驱动器3和5是相同的。我们可以更进一步,假设产品1,3,4和5是相同的,并将产品2和6放在其他类别中。

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

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

    感谢。

7 个答案:

答案 0 :(得分:5)

您至少需要两个组件:

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

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

请注意,最终可能会有数千个条目的向量。即便如此,您还必须对结果进行聚类。

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

答案 1 :(得分:1)

您将遇到的一个问题是在非线性或非有序属性中确定最近邻居。我在这里建立Manuel's entry

您将遇到的一个问题是决定接近(1)Seagate 500Go,(2)希捷硬盘120Go笔记本电脑,以及(3)希捷FreeAgent Desk 500GB外置硬盘银7200RPM USB2.0零售:

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

一个人会说3在1到2之间,因为外部HD可以在两种机器上使用。这意味着如果有人为他的桌面搜索高清,并扩大选择范围以包括替代品,外部高清也将显示,但不会显示笔记本电脑高清。可能是SSD,USB记忆棒,CD / DVD驱动器甚至会出现在笔记本电脑驱动之前,扩大了范围。

可能的解决方案:

为用户提供成对的属性,让他们加权接近。给他们一个比例来告诉你某些属性是多么接近。然后,扩大选区的范围将使用此比例作为此属性的距离函数。

答案 2 :(得分:1)

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

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

一个例子:

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

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

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

首先,我使用CountVectorizer查看生成的词汇。会有像'来自','笔记本电脑','快速','银'等字样。您可以使用停用词来丢弃不会给我们提供任何信息的单词。我也会继续放弃“硬盘”,“硬盘”,“硬盘”等等,因为我知道这是一个硬盘列表所以它们没有提供任何信息。然后我们会有像

这样的单词列表
  1. Seagate 500Go
  2. 希捷120Go
  3. Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb / s
  4. 500Go Seagate等。
  5. 您可以使用功能列表,例如以RPM结尾的内容可能会提供RPM信息,与以mb / s或Gb / s结尾的内容相同。然后我会丢弃像“1234FBA5235”这样的字母数字字符,这很可能是型号等,这些字体不会给我们提供太多信息。现在,如果您已经知道列表中出现的硬盘驱动器品牌如“Seagate”'Kingston',您可以使用字符串相似性或只是检查它们是否存在于给定的句子中。完成后,您可以使用群集将类似的对象组合在一起。现在,具有相似rpm,gb,gb / s,品牌名称的对象将聚集在一起。同样,如果你使用像KMeans这样的东西,你必须找出K的最佳价值。你将不得不做一些手工工作。您可以做什么使用散点图和眼球,数据K的值分类最好。

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

    1. 查看数据,大多数时候句子会明确提到“硬盘”这个词,然后我知道它肯定是在谈论硬盘。像“梅赛德斯奔驰硬盘”这样的东西很渺茫。
    2. 这有点费力但我会在亚马逊上写一个Python网络剪贴簿(或者如果你不能只为谷歌写一个最常用的硬盘品牌并创建一个列表)它给我列表如'Seagate Barracuda 7200.12 ST3500418AS 500GB 7200 RPM SATA 3.0Gb / s'现在每个句子都使用像Naive Bayes这样的东西给我一个品牌的概率。 sklearn非常方便地做这件事。