机器学习 —— 使用机器学习进行情感分析 详细介绍版
机器学习 —— 使用机器学习进行情感分析 演示版
一、项目构想
在现代互联网时代里,人们的意见、评论和建议已成为政治科学和企业的宝贵资源。借助现代技术,我们现在能够最有效地收集和分析此类数据。该项目通过机器学习应用于语言分析,即情感分析;情感分析是分析用户情感的过程。我们可以将他们的情绪分为正面,负面或中性。
这是最受欢迎的机器学习项目之一。其背后的原因是每家公司都试图了解客户的情绪,如果客户满意,他们会留下来。该项目可能显示出减少客户流失的途径。
二、实现过程
数据集
-
首先,我们构建模型需要数据集,我们使用一个互联网电影数据库中的大量电影评论数据。下载链接: Sentiment Analysis (stanford.edu)
-
如上图所示,test和train目录下都有25000个数据集,分别在neg 与 pos文件夹下,代表负面(6分以下)和正面(6分以上)的评论。之后将我们的数据集进行处理,得到方便我们进行机器学习的CSV文件。
数据标注
-
导入包。Pyprind为进度条模块,用于实现处理进度可视化效果。
-
分别创建进度条、标签字典和一个列表,分别用于显示处理进度;表示正面和负面评论;以及存储每个评论的文本和标签。
-
通过遍历数据集中的‘pos’和‘neg’文件夹中的文件,将评论文本和标签添加到空列表中。
-
创建DataFrame,用于存储评论文本和标签。之后打乱顺序,以防影响学习效果。
- 将DataFrame保存为CSV文件,并打印开头的三个评论,检查是否正常运行。
- 结果
数据预处理
我们有了原始的数据集。需要对数据进行预处理,该数据有两个问题需要解决:
(1)数据集含有大量的HTML符号,要消去文本中的HTML符号。
(2)要将文本数据转化为矩阵数据,以便进行机器学习。
对于问题一,可以用正则表达式来进行对特定符号的剔除。
正则表达式就是利用特殊符号构建的一种规则,将文本中符合这种规则的字符串提取或者消除的一种方式,在这里我们构建了符合HTML符号的一种规则,将HTML符号在我们的文本数据中进行剔除。
问题一解决过程
- 导入包。并读取数据。
- 导入正则表达式模块,并定义一个delete_html函数。
- 在函数中,re.sub()用于空格替换文本中的HTML标签。
- re.findall()用于在文本中查找表情符号,之后移除非字母数字字符,转换为小写,并将表情符号添加到文本中。
- 完整代码
- 对‘review’列中的每个文本应用delete_html函数。
问题二解决过程
-
通过词袋模型对文本数据进行编码,将其表示为数值型的特征向量。词袋模型,是用于自然语言处理和信息检索中的一种简单的文档表示方法。通过这一模型,一篇文档可以通过统计所有单词的数目来表示,这种方法不考虑语法和单词出现的先后顺序。
-
使用词袋模型,首先对文本数据进行词汇分割,这里利用文本中的空格进行分割。
- 导入PorterStemmer,对文本进行词干提取,并返回词干化后的单词列表。
- 数据中还有大量“无意义” 词汇,需要用一个预先规定的停用词集合,在数据集中进行剔除。所以要先导入nltk库,下载并导入停用词列表。
数据划分
数据预处理之后,进行数据划分。将数据集划分为训练集和测试集。通常,大部分数据用于训练,另一部分用于测试模型的性能。
如上图所示,将前1000划分为训练集,后1000划分为测试集
搭建训练模型
- 导入库。作用如图所示。
- 定义参数网格。主要参数解释如图所示。
- 创建机器学习流水线,可以简化代码,将步骤封装成完整的工作流,避免了代码重复。
- 导入模型,并训练。
- 打印最优组合。
- 实现结果:
随机梯度下降算法
当数据集过大,我们可以用随机梯度下降算法(SGD)。SGD主要应用在大规模稀疏数据问题上,经常用在文本分类及自然语言处理,是深度学习中常用的优化算法之一。
- 数据预处理和数据划分与前文相同,仅截图展示。
- 导入训练模型。
- 分批次加载训练集数据,每次加载1000条,共45*1000。
- 使用模型对测试数据集进行评估,并打印评估结果。
- 实现结果:
与第一种方法对比可知,第二种方法准确度更高。
三、可视化分析
对训练集和测试集的准确率进行可视化分析
- 如图所示,进行10次迭代,仅展示核心代码:
- 绘制训练集和测试集准确率随迭代次数的变化:
- 可视化
如图所示,在训练集上进行部分拟合后,十次迭代的准确度与测试集经过十次迭代的准确度相差不远,说明模型欠拟合。
对训练集经过深度学习后的准确率与损失函数进行可视化分析
- 如图所示,搭建深度学习模型,训练后获取准确度和损失函数,仅展示核心代码:
- 绘制训练集准确率和损失函数曲线:
3. 可视化
如图所示,在训练集上进行深度学习后,准确度远远高于验证准确度,而且损失函数也比验证损失函数小,说明深度学习训练效果好。