最近在网上看到一篇很不错的文本情感分类的教程,内容详细,而且有可执行的代码和数据,非常适合学习。教程传送门:
原作者从网上搜集了一些客户购物的评价信息(大概2万多条数据),然后分成两类标签:正面的情感(用1表示)和负面的情感(用0表示)。此外,原作者作者还用Keras编写了3种情感分类模型,并做了相互对比分析。
我跑了一下相关的代码,结果遇到了性能问题。程序跑了17分钟,还在做2万多条数据的预处理,性能很糟糕。修改程序,做了一些跟踪,终于发现了造成性能差的代码。
def doc2num(s, maxlen): s = [i for i in s if i in abc.index] s = s[:maxlen] return list(abc[s])
这段函数把一条用户评价信息转成对应的词编号,每次执行大概0.2秒左右,2万多条数据处理完需要4000多秒,也就是66分钟以上。性能糟糕的原因是这句:
if i in abc.index
其中,i是一串文字,abc.index是一大串文字。因为abc.index不是字典dict类型,所以,使用in去比较会非常的慢。加速性能的办法,就是为abc.index另外创建一个字典dict类型对象words_dict。然后使用这个字典dict类型对象words_dict进行对比。对应python2,代码改成
[i for i in s if words_dict.has_key(i)]
对应python3,代码改成
[i for i in s if i in words_dict]
这样处理过后,原来要4000多秒的数据预处理过程,只要60秒左右就完成了。
运行后面的代码,都很顺利。
对于word embedding模型,我尝试修改了模型中的Dense属性,给这里增加了L2正则化。
model.add(Dense(1, kernel_regularizer=regularizers.l2(0.01)))
训练的结果很不错。训练准确率:99.44%,测试准确率90.33%。比原作者的结果要略高些。
最后,我编了一些数据去测试训练生成的模型。下面是客户评价信息和预测的情感分类(1代表正情感,0代表负面情感)
---------------------------------------------------------------------------------------------------------------
东东不重,一个人就拉回家了,找人来安装,费用也不高,热水器很精致,哈哈,物有所值,很满意,当晚就使用上了。 好评,全5分。
情感分类:1买完降价了,店家服务还不错,但安装售后太黑了安装费竟然漫天要价,一开口要378,我不肯买单,打了400的服务电话投诉后降价到260,真心黑,太恶心了。
情感分类:0服务很差。再不买XX的东西了。卖家服务还不错。
情感分类:1服务很差。再不买XX的东西了。
情感分类:0客服骗人 不是恒温又说是恒温 噪音大 燃气的味道浓 10号开始使用 17号马上没有热水出 差差差差
情感分类:0-------------------------------------------------------------------------------------------------------------
看看分类结果, 还是不太准确, 还有很多改进的空间。以后有时间继续改进。