本实验中有一批外卖订单的评论,主要分为正面评论以及负面评论,本文的任务主要有二:
分析外卖订单的文本数据,挖掘有用信息。
根据数据训练一个外卖评论的自动分类器,能够将评论自动归类为正面或负面评论。
首先读取文本,熟悉数据格式。
接下来对文本数据进行一系列分析,包括所有文本及正负样本的词云图,正负样本的高频词统计分析,对数据概况进行宏观表示。
所有文本形成的词云,词汇越大,说明词频越高:
从直观上感受,外卖评论主要的关注点集中于口味、送餐速度,其次是服务态度、份量、包装、价格等,并且比较有用的关键词多是动词、形容词以及名词,当然也存在很多无意义的高频词,比如“的”、“了”。
所有正样本形成的词云:
从大体上看,正面评论主要是要表达“味道好吃”、“送餐速度快”、“感谢外卖员”、“服务态度好”这些方面。
所有负样本形成的词云:
从大体上看,负面评论主要是要表达“味道难吃”、“送餐速度慢”这俩方面。另外 ,还存在许多否定词,比如“还是”、“一点”、“不是”、“不”、“没有”。一个有趣的现象是,不管是正面还是负面评论中,“好吃”都是一个高频词,筛选负面评论中含有“好吃”的文本一探究竟。
通过一些文本的观察可知,“好吃”一般与一些否定词相搭配,形成否定的负面意思,比如“没有以前好吃”,“不好吃”,“不太好吃”,“不是特别好吃”等表达。
在有了一定的感性认识之后,接下来对词汇作一些定量分析,分别统计出正/负面评价的词频,观察两类文本中高低频词的特性,以便作更进一步的文本预处理 *** 作。
统计正样本的词频:
统计负样本的词频:
通过以上的高低频词的打印结果,我们可以观察并分析出两个结论:
正负样本中的高频词中存在一些共同的词汇,比如“了”、“的”、“也”以及一些标点符号,因此理论上这些符号不存在区分度,可以作为停用词去除。
大部分低频词从直观上感受,与正负面情感无直接关联,因此理论上也可以把出现次数为 1 的词汇均作为停用词去除。
基于以上逻辑,我们构建一份停用词表。
接下来对数据尝试多种预处理方式,主要包括:
原文本
只保留文本中的中文
去除停用词
只保留文本中特定词性的词汇
原文本分词处理:
对于每条评论,去除非中文字符并且分词:
停用词过滤:
只保留某些词性的词汇:
所有数据如下:
在完成对数据的多种预处理之后,接下来调用机器学习集成库 scikit-learn 中的模型进行分类训练:
应用同一模型对不同处理之后的数据进行训练,看哪一种预处理方式最佳;
固定预处理数据,尝试应用多种模型,对比得到最好效果的模型。
首先,由于原始数据的标签存在固定顺序,对数据随机打乱顺序:
将文本转换为 TF-IDF 形式:
将数据切分为训练集与测试集:
模型训练并输出测试结果:
综合以上过程的主函数:
各数据统计均应用逻辑回归进行训练,作对比:
在这里,对以上结果中的评价指标作简单介绍,首先观察如下表格(称为混淆矩阵):
注意,这里的正例并非指正面评论,而负例并非指负面评论,以上表格是针对每一个类别而言。在我们的案例中,有两个类别,正面评论以及负面评论,针对每一个类别都有一个对应的混淆矩阵,因此对于每个类别,都有对应的指标。
根据预测值与真实值的不同,分类结果可分为四大情况:
TP(True positives):实际为正例且被分类器划分为正例的样本数,例如某样本真实情况为正面评论且分类器也预测其为正面评论。
FN(False positives):实际为正例但被分类器划分为负例的样本数。
FP(False negatives):实际为负例但被分类器划分为正例的样本数。
TN(True negatives):实际为负例且被分类器划分为负例的样本数。
注意,一般把 accuracy 译为准确率或正确率,precision 译为精确率或精准率或查准率,在中文中这些词汇含义容易混淆,因此最好使用英文,方便记忆。
最后来看 Micro-F1 和 Macro-F1,是针对所有类的综合考量:
Micro-F1:指上述结果中的 micro avg,先计算出所有类别总的 precision 和 recall,然后计算出的 f1 即为 Micro-F1。
Macro-F1:指上述结果中的 macro avg,计算出每一个类别的 precison 和 recall 后计算 f1,最后将 f1 平均即为 Macro-F1。
除了以上模型评价指标,实际上还有 ROC 曲线、AUC 面积等指标,那么这么多指标,到底以谁为准,如何综合判断呢?比如,我们关注评论分类器的整体判别能力,那么可以以 accuracy 或者 F1为主;希望把评论中的差评尽可能地找出来,那么需要更关注差评的 recall;希望预测为差评的样本别出错就行了,那么更关注差评的 precision。这其实取决于相关的场景以及具体的任务倾向性,不能一概而论。
由以上结果可知,只保留文本中的中文以及去除停用词结果稍好一些,在只保留某些词性的词汇时,效果反而变差,由此可见,切忌基于主观上的推理做一些盲目的文本预处理工作,预处理的有效性需要基于结果来对比证实。接下来,我们只保留文本中的中文作为训练数据,应用多种模型进行分类尝试,分别为:
支持向量机
朴素贝叶斯
GBDT
感知机
由以上结果可知,支持向量机比逻辑回归效果稍优,其它模型反而效果下降。那么,还有后续的优化空间吗?答案是肯定的。同学们可以从以下几方面入手尝试更多的优化:
数据增强
改变数据的表征形式
机器学习模型调参
深度学习模型1小蚂蚁antconc停用一些常见的虚词的方法如下所示。
2新建一个文本文件,把你的文本语料拷贝进去,另存为UTF-8的文字编码格式(在另存为对话框上的底部的“编码”从下拉菜单中选择为“UTF-8”);
(2)启动AntConc,点菜单上的“Global Settings”,d出对话框,点左侧的"Language Encodings"的“Edit"按钮的"Unicode Encodings”的“Unicode(utf8)”;
(3)继续在这个对话框上,点左侧列表中的“Token [Word] Definitions”的“Punctuation”的左侧的小方框的勾勾,把这里勾上,点“Apply”就退出了当前的对话框;
(4)点菜单File的“Open File(s)”,来选中你准备处理的文件,从而可以看到左侧的文件列表中的乱码了的文件名;
(5)切换到主界面上的Word List这个子界面,点“Start”按钮
(6)即可看到“列车_n”呀“浜名湖_ns”都变成了“单词列表中的单词
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)