机器学习进行情感分析(上)

devtools/2024/10/18 14:16:33/

目录

  • 一、 绪论
  • 二、 数据处理
    • 1. 构建CSV文档
    • 2. 构建模型前的思考
      • 2.1. 问题
      • 2.2. 解决方法
    • 3. 读取数据
    • 4. 用正则表达式来进行对特定符号的剔除
    • 5. 使用口袋模型进行文本处理和特征提取
  • 三、 数据划分

一、 绪论

        近年来,随着互联网和社交媒体的快速发展,人们在网络上表达情感的方式变得更加多样和频繁。在这样的背景下,情感分析成为一项重要的研究领域,旨在通过分析文本、语音和图像等数据来判断人们的情感状态。情感分析在众多领域中具有广泛的应用,包括市场营销、舆情监测、产品评价、心理健康等。

        传统的情感分析方法主要基于规则和词典,通过人工定义的规则和情感词汇来判断文本的情感倾向。然而,这种方法往往面临词汇覆盖不全、主观性强和适应性差等问题。为了解决这些挑战,机器学习技术成为情感分析研究中的重要手段。
机器学习是一种从数据中自动学习模式和规律的方法。在情感分析中,机器学习算法可以通过训练数据来学习情感表达的特征,并构建模型来对新的文本进行情感分类。

        在机器学习情感分析中,关键的一步是特征提取。特征提取是将原始文本数据转化为机器学习算法能够理解和处理的数值表示。常用的特征提取方法包括词袋模型(Bag-of-Words)、TF-IDF(Term Frequency-Inverse Document Frequency)和词嵌入(Word Embedding)等。这些方法可以将文本转化为向量形式,保留了词汇的语义信息。

        一旦特征提取完成,机器学习模型可以通过训练数据进行训练和优化。在训练过程中,模型学习从输入文本中学习情感特征,并尝试准确地预测情感类别。通过不断调整模型参数和优化算法,可以提高模型的性能和泛化能力。

        然而,机器学习情感分析也存在一些挑战和限制。首先,训练数据的质量和规模对模型的性能有重要影响。缺乏标注的大规模训练数据可能导致模型的泛化能力不足。其次,情感分析在不同的语境和领域中具有很大的变化性,模型的泛化能力需要通过合适的特征选择和模型设计来提高。此外,情感分析还需要解决多语言、多模态和主观性判断等问题。

        总的来说,机器学习在情感分析中具有重要的应用价值。通过利用机器学习算法和技术,可以实现对大规模文本数据的情感倾向分析,从而为各种实际应用提供决策依据和洞察力。

二、 数据处理

1. 构建CSV文档

        首先,我们构建模型需要数据集,我们使用一个互联网电影数据库中的大量电影评论数据。下载链接:https://ai.stanford.edu/~amaas/data/sentiment/

        观察我们下载的数据集,test和train目录下都有25000个数据集,分别在neg 与 pos文件夹下,代表消极(6分以下)和积极(6分以上)的评论。

        为了更好的对数据集进行处理,得到方便我们进行机器学习的CSV文件。所以需要构建一个CSV文档,我觉得每一个样例应该有一个特征(比如说评论),还有一个标签,我用1代表积极,用0代表消极。

        首先我读取aclImdb文件夹中的文本文件,并将它们的内容和对应的情感标签存储到一个DataFrame中,并将数据保存为CSV文件:
在这里插入图片描述

        这里是使用pyprind.ProgBar创建了一个进度条对象,总共有50000个进度。出现的进度条,用于显示处理进度。

        最后打乱顺序,以防影响学习效果。然后输出到我们想要的位置,然后读取CSV文件并打印前三行的数据,检查是否正常运行:
在这里插入图片描述

2. 构建模型前的思考

2.1. 问题

        我们有了原始的数据集了,可以开始构建模型了,但是在构建模型的时候我们遇到了几个问题:

  • 问题1:我们的文本中含有大量的HTML符号,影响我们的学习过程。
  • 问题2:我们处理的特征是一个文本,但是我们机器学习的过程中只能由数字数据构成。

2.2. 解决方法

  • 对于问题一,可以用正则表达式来进行对特定符号的剔除。

        正则表达式就是利用特殊符号构建的一种规则,将文本中符合这种规则的字符串提取或者消除的一种方式,在这里我们构建了符合HTML符号的一种规则,将HTML符号在我们的文本数据中进行剔除。

  • 对于问题二,可以用一种在文本处理中常见的模型——词袋模型

        模型简单来说就是将一个大整体数据(在本项目中是50000条评论)中出现过的所有词汇进行逐一编号,比如一个数据集中一共出现了10个词,第一条中出现了其中的5个,它的矩阵可能就是[0 0 0 0 1 1 0 1 1 1] ,第i个位置表示第i号单词出现的次数。通过这一模型,一篇文档可以通过统计所有单词的数目来表示,这种方法不考虑语法和单词出现的先后顺序。

        但是这样会衍生出一个问题,我们日常用语中会出现大量的“无意义”词汇,比如英文中的 is he she are am等等,这样的词汇在我们的向量中会多次出现,对我们的学习过程会产生不确定的影响。为此可以提前准备好一个集合,里面是所有我们预先规定的停用词,也就是在句子中一般无意义的词汇,将他们在我们的数据集中进行剔除。

3. 读取数据

        构思完后,我们使用pandas库中的read_csv函数从名为’movie_data.csv’的CSV文件中读取数据,并将读取的数据存储在名为df的DataFrame对象中。

4. 用正则表达式来进行对特定符号的剔除

        定义了一个名为delete_html的函数,作用是使用正则表达式删除文本中的HTML标签和表情符号,同时将文本转换为小写,最后返回处理后的文本。

        将其应用于数据集的’review’列,文本数据中的HTML标签和表情符号被删除,并且文本被转换为小写形式,方便后续的文本处理和分析。
在这里插入图片描述

5. 使用口袋模型进行文本处理和特征提取

        导入了相关的库和定义了几个函数,用于进行文本分词、词干提取和停用词处理,以准备文本数据进行进一步的特征提取和建模。

        导入PorterStemmer类,用于词干提取。

        导入了nltk库,用于自然语言处理任务。

        从nltk.corpus模块中导入stopwords类,用于获取停用词列表。

        tokenizer函数:将文本按空格分割成单词列表。

        stem_tokenizer函数:对列表中的每个单词进行词干提取,返回词干化后的单词列表。
在这里插入图片描述

三、 数据划分

        从DataFrame中提取训练集和测试集的特征和标签数据。

        我们一开始对训练集和测试集进行了1:1的划分。
在这里插入图片描述

        但是在后面我们发现划分训练集和测试集的比例为1:1可能会导致一些问题:

  1. 训练数据不足:如果将数据集几乎均匀地分为训练集和测试集,每个集合中的样本数量都会减少。在训练集中有较少的数据可用时,模型可能无法充分学习数据集中的模式和特征,从而影响模型的性能。
  2. 不可靠的性能评估:测试集的样本数量过少可能导致评估模型性能时的不稳定性。模型在一个小规模的测试集上的表现可能无法准确地反映其在整个数据集或真实场景中的表现。
  3. 随机性的影响:在数据集较小的情况下,随机性对模型性能的影响更为显著。划分为1:1的比例可能导致测试集中的样本在分布上与整个数据集存在较大的差异,这可能导致模型在测试集上的性能评估不够准确。

        训练集和测试集的比例选择通常取决于具体的应用场景和数据集大小。将数据集划分为训练集和测试集的目的是评估模型在未见过的数据上的性能表现,并检验模型的泛化能力。

        常见的划分比例包括 7:3、8:2 或者 9:1 等。选择适当的比例可以在一定程度上平衡训练集和测试集之间的数据量,确保有足够的数据用于模型的训练和评估。所以我们后面将训练集和测试集比例修改为了7:3。
在这里插入图片描述

        数据集被分为训练集和测试集,其中训练集包含索引0到索引17500的数据,而测试集包含索引17500到索引25000之间的数据。这样可以将数据用于模型的训练和评估,其中训练集用于训练模型,而测试集用于评估模型在未见过的数据上的性能。


更多详细内容可看
在这里插入图片描述


http://www.ppmy.cn/devtools/32047.html

相关文章

网络安全运维类面试非技术问题

1、你熟悉哪些品牌的安全设备 答:天融信的ngfw防火墙,老牌防火墙厂商,功能比较齐全,像流量检测,web应用防护和僵木蠕等模块都有,界面是红白配色,设计稍微有点老 2、IPS用的是哪个牌子的 答&…

python脚本实现布尔盲注

目录 代码实现 代码解释 过程中遇到的问题 1、号url编码问题 2、二分法查找 3、如何判断这一次循环内的变量值等于上一次的值 第一种思路 第二种思路 相信师傅们在平常渗透测试中,偶尔会遇到布尔盲注的情况,但是手工的话太慢,上sqlma…

安卓adb 命令查看程序日志

gcat日志导出到文件 在Android设备上,你可以使用logcat命令将日志导出到文件中。打开终端或者命令行工具,然后输入以下命令: adb logcat -d > logcat.txt这条命令会将当前设备的logcat日志输出到名为logcat.txt的文件中。-d参数是用来确…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年,每当我遇到那些错综复杂的业务逻辑和系统交互,总有一个模式像一位忠诚的骑士,默默守护着我的代码城堡,那就是——业务代表模式(Business Delegate Pattern)。它不是最耀眼的明星…

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算,表达式执行的入口和计算逻辑都是统一的,这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…

【KTips】在Kotlin中实现一个十分简单的自循环状态机

在平日的编码生活中,你有没有遇到过需要通过状态机来实现的逻辑呢?一个状态的轮转、事件订阅的通讯处理等。 状态机的实现方式千变万化,这里我会为你介绍一个简单的自循环状态机实现。 简单介绍 在开始之前,我先说明一下这个所谓…

SFT430C 用于快速充电协议和QC2.0/3.0的USB专用充电端口控制器芯片IC

一般描述 SFT430C是HiSicon快速充电协议(FCP)和高通快速充电协议控制器“2.0/3.0(质量控制2.0/3.0 )USB接口该设备可对FCP或QC2.0/3.0供电设备(PD)进行快速充电。该协议功能监测USB D/D-数据线电压或D-数据线传输,并自动调整移动电源和墙壁适配器的输出电压&…

【代码随想录】day48

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、198打家劫舍二、213打家劫舍II三、337打家劫舍III 一、198打家劫舍 class Solution { public:int rob(vector<int>& nums) {vector<int> dp(n…