使用CNN进行用户评论情感极性分析
上半年闲来无事参加了一个小比赛《用户评论情感极性分析》,主要是通过摘取的8w数据训练模型,预测3w的测试集,提交预测结果,评测标准为F1-score。最近开始复习,通过写一篇总结整理一下。水平不高,能力有限,写作仓促,部分代码可能未精细整理,难免出现错误,欢迎指正。
数据初见
经验上,首先要对给定数据进行分析,一般分析数据量大小(估计机器运行要求),数据预处理:有无空值(是否需要插值),确定如何进行特征提取。模型输入输出类型等等。
output:
8w的数据集有五种,每一条记录分别是[记录id,评论类型,评论内容,情感标注]。情感标注分别是(0,1,2)分别代表(负面,中立,正面)。比赛的任务也就是训练出模型,输入文本,得到情感极性。明白基本任务,贴几段关键代码(不贴代码的技术博文都是耍流氓)
词向量构建
获取数据、标注,对文本记录打标签
output:
词向量训练
output: 部分进度。
构造词向量--单词索引的映射
output:
构造模型
构造层次化CNN,依次对2,3,4-gram取特征,最后feed给全连接层,输出多分类
CNN:通过设置滤波器窗口大小为2-gram,选取二元文法;最大池化;第一层卷积后输入到第二层卷积选取三元文法;紧接最大池化;……同理4-gram。
卷积后输入到全连接层,通过softmax层输出各类别的概率值,损失函数选取交叉熵损失,批量大小8,训练5-6轮。
预测结果
CNN输出的是三个概率值,分别是归为(2,1,0)的概率。取最大值下标作为最终类别。
总结
模型方面参考连接A,github;根据应用场景调参主要参考文献B。
问题1:使用原模型训练数据时,构造词典;单词词典索引词向量,主要是构造三者的一一映射;原文中只使用训练数据构造词典,第一次预测时发现预测集中的词汇可能不存在对应词向量,个人认为根本上是数据集太小导致的,中文分词太多,对于新的一条中文句子分词后找不到词向量并不稀奇。
解决办法:使用训练集和预测集同时feed进词向量,构造全局词向量,这样对于整个数据集的单词都有对应的词向量。
问题2:关于Tokenizer单词索引
Tokenizer构造单词index的一一映射,特别需要注意的是,输入的分词顺序不同,最终单词对应的索引也是不同的。笔者在发现部分词向量不可见时,为简便构造了测试集词向量,最终结果很差,原因是,同一个词在不同词典里索引是不同的,而且单词索引也并不是从1递增开始的。因此需要构造一个全局的词典。否则会出现一个单词对应的索引和词向量,并不适合训练集训练出的模型的情况。
问题3:关于模型调参
最开始笔者也是经验调参,后来借鉴了一篇论文,里面介绍的还算详细,而且是针对不同类型的评论采取不同的模型,对于CNN窗口大小,词向量大小,是否输入潜入层等也给了参考等等。
(总结以上,还是先把别人代码看透,多借鉴几篇论文,确定好策略以后再开始)
最终成绩
参考文献及连接
A:推特情感分析
https://github.com/tthustla/twitter_sentiment_analysis_part11/blob/master/Capstone_part11.ipynb
B:基于卷积神经网络参数优化的中文情感分析
http://www.wanfangdata.com.cn/details/detail.do?_type=perio&id=jsjgc201708034
领取专属 10元无门槛券
私享最新 技术干货