lstm训练情感分析的优点_人机对话学习——情感分析学习笔记

89177605616804144a3cfe29242a2e75.png

此笔记课程内容见

自然语言处理--实战情感分析-学习视频教程-腾讯课堂​ke.qq.com
14376b788ef6a5f27d1b1edab8260bb3.png

b32d7ad8b65693a72c50be008ccb1769.png


简介最主要就是说情感分析在实际的应用场景中起到一个什么作用。词法分析学习笔记:

c745caa33c597bf6e9e2fe15492b224a.png


词法分析处理流程其实就是基于句子中正负情感的关键词多少来判断句子的情感立场。

067538dd62cfd5244a635c45c355ed3b.png


词法分析的关键点是情感词典的建立与维护,缺点也是随着情感词典的变大维护难度了加大,维护成本上升,搜索性能下降。机器学应用在情感分析中的应用学习笔记:

878d9fe7d663debf3ef63ad521231dff.png


这个PPT其实就是说明子如何使用朴素贝叶斯来解决垃圾邮件问题,其实和中文分词中讲的选西瓜的例子是一模一样的,只要把瓜熟,瓜生分别用正常邮件、垃圾邮件来代替就能够理解最后分类算法是怎么推导来的。

a036bded90797d50d7bb628f8beedd55.png


相对情感词典,机器学习更加适合于处理长文本的情感分析。情感分析之深度学习方法对比:

6236770cc6d79fb9dca79a4c465fc04a.png


此PPT其实就是对比三种不同的特征提取方法以及不同的算法在进行影评分类时不同之处。代码实战词袋模型应用于影评分析:
此部份的代码有几个关键点:1、数据的预处理:将HTML字符去除,去停用词,单词全部转为小写

f6c1d5693cbfa01530400af55fd11e6e.png


看这段代码始终不明白为所有单词何都要转换为小写呢?带着疑问请教老师,老师回答全部转换为小写是为了让词袋模型更好的提取特征,因为在英文中大小写不同,会认为是两个不同的词,全部转为小写就避免了这种现象的出现,从而使得数据的噪音变小。写到这我突然明白,其实这些数据预处理工作就是为了让我们更好的提取特征呀。2、词袋模型提取特征

ac96bcfa3faa938e24a77018376ae688.png


max_features=5000为什么能这样设置呢,仔细想想这应该是基于对数据特征的认知才可以得出,就好比数据一共有多少词,词频分布是多少,即超过出现5000次以上的词是不是占有了绝大部分词,如果是占有大部分词,哪这样提取特征就没问题,如果不是这样则设置max_features=5000就不对了,比如max_features=3000就达到覆盖80%以上的词,就不需要5000,反之如果max_features=5000只能覆盖50%的词,则max_features的值就要调大了。3、训练分类器

de194b0c9bb2f36a586a428fbac26169.png

这段代码核心是cnf_matrix的讲解,其它的训练代码其实就是把提取的特征喂给逻辑回归算法进行训练而已。代码实战词向量模型应用于影评分析:

a6d1df900a12a3c3582ab05ba4858d75.png


上图是清洗数据的代码与词袋模型对比不同之处就在于分词的区别,其分词采用了NLTK自带的分词器,我查看了一些分词结果,发现一些词使用NLTK自带的分词器他分得更细,大部分的时候和使用空格分词的效果是一样的,估计这样分词粒度更细提取词向量效果会更好一些吧,否则这样分词就没意义了。

d92ea2bfd26cda8ae88edcecad0ac166.png


上图中的代码展示如何使用gensim训练一个维度为300的英文影评词向量模型。

d965070bf964deb90a41b9901d689303.png


上图中的代码就是利用已训练生成的词向量模型生成影评词向量也可以说是影评句向量,即每一条影评都用一个300维的向量进行表示,这条影评中所有词的词向量都会叠加在一起,构成这要影评的总体向量表示,或者也可以称为句向量表示。此处需要注意的一点即维度一定是300维,因为我们用词向量模型也是300维,两者维度一定要一样,否则表示的意思就不一样了。
最后生成的数据集train_data_features维度是应该是25000,300。
在生成了train_data_features特征数据集之后,依旧是利用逻辑回归进行训练这个和词袋模型的代码是一模一样的,但是由于使用了词向量模型之后,模型的精度提升了进两个点,还是能见到效果的。代码实战LSTM应用于影评分析学习笔记:

98c52b37140015e0d213b077383ba358.png


此段代码我一直困惑这些npy向量文件是如何生成的,后来搜索了相关资料得到这个向量文件是GLOVE一种词向量模型技术生成的,据说是比WordtoVec的技术要好。

606a1e4d03e7ba75c461002f180ec48f.png


段代码我开始不明白为什么一定要得到影评的平均长度呢,这有什么意义呢?咨询老师,老师回答这其实和词袋模型max_features=5000设置是一个道理,都是为了更好的提取特征,即大部份的影评长度都是在230到250左右,用这个长度去提取特征,能够保留大部分的影评的数据特征。
其实从更严格的角度上来讲,应该更深入的分析数据的情况,即什么样的影评长度在数据集中出现的是频次是最高的,比如说长度超过250的影评数量在整个数据集中占比很小,而小于251占有了太多数影评,哪我们就应该使用250这个长度来提取数据特征。
有了上述的理解,才能彻底搞懂下面的代码

efacde8172a1a0605d9705f616c85b9b.png


为什么说此参数对模型的准确率影响很大呢,无非就是数据特征提取是否合适当前训练的数据呀。

42de28d6ba4e6d193d19e8b4ed6973dd.png


在得到max_seq_num这个参数的基础上,我们就能够生成训练数据了,在get_train_batch的代码注释中就更能看出max_seq_num的作用了,我给关键的代码都加了相应注释,这样提取出来的数据特征更加随机,训练出来的模型健状性更好,不容易过拟合。
接下来关键代码就是得到三个维度的词向量,为喂给模型做最后的准备。

c1514d3230d097328d4afc55e2cec0ab.png


至于网络模型搭建,训练,测试这些代码在TensorFlow实战深度学习入门课程都有学习,此处的代码基本上就把原来课程中的代码复制过来了,简单,没什么难度。商品评论代码实战学习笔记:

73d9e52dd66435a9242a0e1b3e70f705.png


首先依旧是数据预处理的准备工作,在数据准备的代码中有一个读入sum.xls代码是注释了,但sum.xls中有些评论的内容是非空有效的,但是大部分是空的内容,咨询老师为什么不把这部分数据纳入,老师说这些数据没有明确打上标签是负面还是正面,所以就把这部分评论弃用了,虽然深度学习训练就是需要数据越多越好,但是如果要个人去标注这样的数据,成本有点高,所以这块的代码就没用了。
这块最核心的代码应该是dict[‘id’]的生成,因为生成了字的索引才能够生成pn[‘sent’],后续才能生成商品评论的句向量。
此处代码最后一行maxlen=50,其实是有很大的问题,这一行代码其实就是英文影评分析中的max_seq_num=250,他们起到的作用都是一样的,但是这里却没有给出相应的数据计算方式,证明maxlen=50的合理性。
我跟踪代码调试发现商品评论一共有1353755个词,一共有21105条商品评论,平均每条评论的长度是64而不是50,看上去使用50来做商品的最大长度并不是很合理,但是真正使用什么长度最合理,咨询老师,老师说还是应该看什么样的长度能够覆盖大部分数据,而这需要编程实现这部分功能,比如说20到50这个长度商评评论数量占到整个数据集的80%以上,就应该使用50做为长度,而要得到这个准确数据需要编程实现。老师给我发了份代码,我加进原有的程序得到商品评论长度的分布如下:

c65a95cb81c2cc18984fd4e27022a7b7.png


从图中可以看出60的长度基本上占了数据的70%,可以看出用50做为影评的统一长度也能够覆盖60%以上的数据,用50的效果可能会更好些,因为如果用的过长,很多影评数据都需要补零对齐,这样反而会造成许多数据噪音。经过数据的分析得到的最终结论用50是比较合适的。紧接着是生成训练数据代码:

033b226e72ec0deb610b15be681ec498.png


这部分代码个人认为他没有把评论数据随机打乱是会产生问题的,在进行数据预处理时上半部分完全是正面评价,标签全部是1,虽然使用奇,偶进行分割成训练集和测试集,但还是没有把所有商器评论数据打乱,因为上半部分还都是标签为1的正面评论,在现实世界中不可能是这样数据分布,如此训练学习的结果容易过拟合。
最后就是搭建模型,开始训练和测试了。

443eb5ae3404f3e22adfad19d4e84609.png


这块的代码主要是需要学习Keras,咨询老师要如何学习这个东东,得到回复是Keras已经成为TensorFlow2.0的标配,老师有专门的课程讲如何从《TF1.X升级到TF2.0》。我购买了此课程,其中有节课专门是讲LSTM影评在tf2上如何进行情感分析,学了这节课就很容易看懂上面的代码了。
mmodel = Sequential()#意思就是搭建网络模型,这个网络模型即可以装CNN也可以装DNN,还可以装LSTM。
model.add(Embedding(len(dict)+1, 256))#这句代码的意思就是根据输入的数据影评数据X生成影评的三维词向量也可以说是句向量,对照英文情感分析的代码就是下面三行

input_data = tf.placeholder(tf.int32, [batch_size, max_seq_num])
data = tf.Variable(
    tf.zeros([batch_size, max_seq_num, num_dimensions]), dtype=tf.float32)
#根据get_train_batch生成的数据找出相应的词向量张量。
data = tf.nn.embedding_lookup(wordVectors, input_data)

接下来的其他代码就更好懂了,我加了注释如下:

f7b19a1563129d17486fe012f88c7afd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值