在做机器学习的各种应用中,文本分类是比较典型的一种。比如,微博的分类,电商中商品评价的好坏分类,新闻的分类等等。同时,文本作为一种重要的特征,也在CTR预估,推荐等应用中起着作用。就文本分类这个应用而言,通常的做法是基于词袋模型和词向量模型来进行。基于词袋(Bag of Words)的模型的话,一般走一步TF-IDF再结合朴素贝叶斯就可以做个模型了,当然如果词很多,存在高维的问题,就用SVD/PCA做降维或者卡方特征抽取也行,然后再扔到某个分类器中。如果是基于词向量来做,那么一般就是用深度学习的模型来进行。下面就简单说下基于开源库Deeplearning4j来进行文本情感分类的一个例子,例子在Spark1.5.2上测试通过。10轮训练过后,准确率在92%左右。可以供相关同学参考。另外,特别说明下,本文中的语料数据来自于博客:http://spaces.ac.cn/archives/3414/。所以非常感谢链接中博客作者的数据分享。
首先说下语料的处理。http://spaces.ac.cn/archives/3414/链接中的语料主要分为正、反两方面的评价文本。分别以excel文件的形式存储。从之前说的链接上down下来语料后,对正反评价的文本用jieba分词器进行分词。这里就不具体贴出处理的代码,分词器可以任意选择一个开源的。不过需要注意的是,词与词之间用空格隔开。处理的语料结果如下截图:
正面评价预料:第一列为标注
负面评价预料:第一列为标注
在处理好语料之后,就可以开始建立分类模型了。这里主要采用Embedding+LSTM的结构。优化算法选择SGD。其他超参数如下所示:
MultiLayerConfiguration netconf = new NeuralNetConfiguration.Builder()
.seed(1234)
.iterations(1)
.learningRate(0.1)
.learningRateScoreBasedDecayRate(0.5)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.regularization(true)
.l2(5 * 1e-4)
.updater(Updater.ADAM)
.list()
.layer(0, new EmbeddingLayer.Builder().nIn(VOCAB_SIZE).nOut(512).activation("identity").build())
.layer(1, new GravesLSTM.Builder().nIn(512).nOut(512).activation("softsign").build())
.layer(2, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)