Several methods to solve text classification problems
几种文本分类方法
刚开始接触NLP,选择从最基础的文本分类入手,完全小白一个,一开始连如何处理数据都不知道,
TensorFlow也不会,在写代码的过程中,也参考了很多别人的代码,尤其感谢gaussic
,他的代码给了我很大很大的帮助。
PS.很多细节没补充,上传的文件可能也有问题,有时间会继续补充、改正,欢迎提交issue。
对THUCNews按照0.7:0.1:0.2的比例将数据集划分成训练集、验证集、测试集。
由于复旦中文文本分类语料只包含训练集和测试集,故从训练集中选取0.1的文档做为验证集,最终训练集包含8088篇文档、验证集包含989篇文档、
测试集包含9825篇文档。分布如下:
测试集 | 验证集 | 训练集 | |
---|---|---|---|
Art | 666 | 74 | 742 |
Literature | 29 | 4 | 34 |
Economy | 1440 | 160 | 1601 |
Mine | 29 | 4 | 34 |
Sports | 1127 | 126 | 1254 |
History | 419 | 47 | 468 |
Computer | 1215 | 135 | 1350 |
Transport | 51 | 6 | 59 |
Energy | 28 | 4 | 33 |
Politics | 921 | 103 | 1026 |
Space | 576 | 64 | 642 |
Communication | 22 | 3 | 27 |
Agriculture | 918 | 103 | 1022 |
Education | 53 | 6 | 61 |
Military | 66 | 8 | 76 |
Electronics | 24 | 3 | 28 |
Medical | 45 | 6 | 53 |
所有模型都没使用预训练的词向量,参数也没有仔细调过,模型性能未达到最优,结果仅供参考。
去掉低频词(频率低于3),使用信息增益选择特征词,然后用TF-IDF作为权重,使用scikit-learn的SVC模型训练。
这个目前在选择特征词的时候有个小BUG,因为是每个类别提取n个特征词,由于代码实现原因
如果这个类别的特征词的个数n,则将会把所有的词全部选入,这个有时间会更新。
基于这篇论文提出的模型Convolutional Neural Networks for Sentence Classification
做了两个模型
char_cnn_model使用的模型参考了gaussic使用的
模型,在Embedding层后加了一个卷积层、Max
Pooling层和Softmax层。
char_cnn_model2使用的模型是
Character-level Convolutional Networks for Text Classification
所述的模型。
包括4个模型
text_rcnn_model是参考了自动化所NLPR的学生发表在AAAI2015上的一篇文章
Recurrent Convolutional Neural Networks for Text Classification。
text_dnn_model参考了哈工大讯飞联合实验室发表在ACL2018上的
Disconnected Recurrent Neural Networks for Text Categorization
感觉自己复现的有些问题,还在改进中,不过目前发现这个模型在处理长文本时,非常耗时。
Error-RCNN是我一开始复现RCNN的时候,错误的将BiLSTM的一层MLP理解成卷积层,使用大小为1的window size跑出的结果,竟然比
使用MLP效果更好,目前不确定是否是偶然因素,会进一步进行实验,寻找原因。
最后两行带*号的为Recurrent Convolutional Neural Networks for Text Classification
这篇论文中作者使用CNN和RCNN得到结果(作者使用了预训练的词向量)