我有一个数据集,看起来有点像下面这样,比如像沃尔玛这样的商店。
+-----------------------------------------------------+------------------+------------------+------------------+-----+
| Description | Classification 1 | Classification 2 | Classification 3 | ... |
+-----------------------------------------------------+------------------+------------------+------------------+-----+
| iphone 7 order# :123595 | Electronic | Cell Phone | Apple | |
| purchase of samsung galaxy s10 reference 32-2345 | Electronic | Cell Phone | Samsung | |
| dell 13" 500gb ssd intel i7 | Electronic | Laptop | Dell | |
| tablet 15cm for chris t price $199.76 | Electronic | Tablet | NULL | |
| ... | ... | ... | ... | |
| 50x rolley chairs for office supplied by home depot | Supplies | Furniture | Chairs | |
| electrician cost for new building | Supplies | Electrical | Work | |
+-----------------------------------------------------+------------------+------------------+------------------+-----+
这种形状的数据集非常大,有数千(可能 >100,000)行,可能有 50 多列。
我想要一种方法来根据其描述正确地对行进行分类。
因此,基于上述数据集的模型应该采用以前从未见过的描述,并正确地对该项目进行分类,例如:
iphone 11 $999.99 => 电子、手机、苹果
。
我目前只计划使用描述进行分类作为第一步,以保持简单,但是还有其他列(例如谁提供了该项目)可以帮助分类,例如该项目是否由 提供例如,Apple
或 AT&T
它更有可能被归类为手机
。
我正在考虑实现一个神经网络来做到这一点。我之前已经实现过神经网络,但仅针对典型示例(例如识别数字 0-9 [MINST 数据集] 或识别衣服的系统),所以我了解神经网络如何工作的理论(权重、偏差、梯度下降) ,反向传播等)但是我正在努力解决如何实现我现在的这个想法。
到目前为止,我的想法是:
I want to use Python, with tensorflow2.0 + keras.
I need a way to convert the text into a numerical format. There seems to be a few options out there like word2vec, but I am not sure what is the best option.
How many neurons should my base layer have? (With number recognition each image is 28*28 so a 28*28 base layer makes a lot of sense, here I am not sure)
How many hidden layers?
How many output layers? (Should I have one for each distinct combination of classifications, so one for
Electronic, Cell Phone, Samsung
, one forElectronic, Cell Phone, Apple
etc. This would lead to a output layer of thousands of neurons, I am not sure if this is possible/advised?
我并不是在寻找完整的答案,事实上,我知道根据所提供的信息,这实际上是不可能的。相反,我正在寻找更有经验的人关于如何处理这个问题的指导/建议,也许,事实上,很可能有些事情我还没有考虑。
最佳答案
我已经解决 NLP 问题近 5 年了,以下是我的建议。
我想使用Python,搭配tensorflow2.0 + keras。
是的,Keras
将是您实现解决方案的一个不错的选择。使用 Keras 执行此操作应该相当简单。
我需要一种将文本转换为数字格式的方法。似乎有一些选项,例如 word2vec,但我不确定什么是最好的选项。
是的,词向量肯定会提高模型的性能。但如果你想要一个更简单的解决方案,你可以尝试 onehot vectors 。我建议从 onehot 向量开始,然后一旦有了可行的解决方案,就使用词向量改进它。这样您就可以确定一开始不会引入太多复杂性,从而在实现中出现问题时更容易进行调试)。
PS:word2vec现在已经很老了,有更好的替代品,例如GloVe和 FastText .
我的基础层应该有多少个神经元? (通过数字识别,每个图像都是 28*28,因此 28*28 基础层很有意义,这里我不确定)
这取决于您的词汇量。正如我之前所说,无论您是否使用单词向量,您都必须将单词转换为 onehot 向量。 onehot向量的长度由词汇表的大小决定。
有多少隐藏层?
这是一个很难回答的问题。如果您正在寻找最佳结构(即通过超参数优化),您将需要尝试不同的架构并找到最佳的架构。
有多少个输出层?
认为这是一个棘手的问题(主要是因为标签预测不属于我的专业领域)。但我可以告诉你两件事要尝试。
有一个包含所有可能类别的输出层。但正如你可以想象的那样,需要有人提出类别。然后,如果您有大量标签,您最终将得到一个大型 softmax 预测层。但您可以使用负采样之类的方法来缓解这种情况。
您可以仅使用一个具有固定词汇表的输出层(例如电子产品、电话、笔记本电脑等)来完成此操作。但是,您需要有一组固定的标签(即词汇)来进行预测。然后你可以使用LSTM模型来预测给定描述的任意数量的标签。您可以生成任意数量的标签作为输出,因为您可以使用 LSTM 模型一次持续预测一个时间步。
但是现在您假设标签之间存在时间依赖性(按照它们出现的顺序),这可能会导致有趣的结果。例如,如果您有相同的描述,但有两个不同系列的标签(即 electronics、phone、samsung 和 electronics、samsung、phone),这可能会混淆模型。
关于python - 如何训练神经网络将文本分类为预先存在的类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247292/