如何根据名称预测项目的类别?

时间:2017-03-07 12:34:47

标签: machine-learning classification deep-learning prediction

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

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

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

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

所以我在想是否可以使用scikit-learn来训练基于我的项目名称的文本分类器,以帮助我预测商品的类别。我将这个问题形成为一个多类文本分类,但每个项目也有一个〜很多图片,所以也可以使用deep learning/Keras

我不知道解决这个问题的最佳方法是什么,所以欢迎任何建议或建议,谢谢你阅读本文。

P.S。实际文本是日文

1 个答案:

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

现在得分包含每个三元组的概率分布:P(class | trigram)。它没有考虑到某些类更常见(先前,参见贝叶斯定理)。我目前还不太确定你是否应该做一些事情来解决一些标题可能只是很长并且因此有很多三元组的问题。我想先采用先前的做法。

如果事实证明你有许多三卦丢失,你可以切换到双字母。或者只是拉普拉斯平滑。

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