【问题标题】:How to predict an item's category given its name?如何根据名称预测项目的类别?
【发布时间】:2017-07-27 16:06:19
【问题描述】:

目前我有一个包含大约 600,000 条记录的数据库,代表商品的类别信息如下所示:

{'title': 'Canon camera', 'category': 'Camera'},
{'title': 'Panasonic regrigerator', 'category': 'Refrigerator'},
{'title': 'Logo', 'category': 'Toys'},
....

但是有些商品没有分类信息。

{'title': 'Iphone6', 'category': ''},

所以我在考虑是否可以通过使用scikit-learn 来根据我的商品名称训练一个文本分类器来帮助我预测商品应该属于哪个类别。我将此问题形成为多类文本分类,但每个项目也有一个~许多图片,所以也许deep learning/Keras也可以使用?

我不知道解决此问题的最佳方法是什么,因此欢迎任何建议或建议,感谢您阅读本文。

附:实际文字是日文

【问题讨论】:

  • 标题“iphone6”出现了多少次,是否有与之关联的其他类别?如果这是唯一的条目,您将不得不求助于外部培训来源
  • @yosemite_k 感谢您的回复。我认为项目中出现两个相同标题的可能性很小,但多个项目的标题中会出现重新出现的术语。稍后我会提供更多信息。

标签: machine-learning classification deep-learning prediction


【解决方案1】:

您可以构建一个 2-char / 3-char 模型并计算值,例如3 克的“pho”多久出现在“相机”类别中。

trigrams = {}
for record in records:    # only the ones with categories
    title = record['title']
    cat = record['category']
    for trigram in zip(title, title[1:], title[2:])
        if trigram not in trigrams:
            trigrams[trigram] = {}
            for category in categories:
                trigrams[trigram] = 0
        trigrams[trigram][cat] += 1

现在您可以使用标题三元组来计算分数:

scores = []
for trigram in zip(title, title[1:], title[2:]):
    score = []
    for cat in categories:
       score.append(trigrams[trigram][cat])
    # Normalize
    sum_ = float(sum(score))
    score = [s / sum_ for s in score]
    scores.append(score)

现在 score 包含每个三元组的概率分布:P(class | trigram)。它没有考虑到某些类只是更常见(之前,请参阅贝叶斯定理)。我目前也不太确定您是否应该针对某些标题可能真的很长并因此有很多三元组的问题采取一些措施。我想采取先验已经做到了。

如果事实证明您缺少许多三元组,您可以切换到二元组。或者干脆做拉普拉斯平滑。

编辑:我刚刚看到文本是日文的。我认为 n-gram 方法在那里可能没用。你可以翻译名字。但是,获取此信息的其他来源可能更容易(例如维基百科/亚马逊/ebay?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 2023-03-25
    • 2016-05-05
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    相关资源
    最近更新 更多