NLP_Sentiment_Analysis

Python 2025-07-26

NLP:情感分析


关于人或事件(政治,社交等)的产品,服务,电影或文本的评论对于清楚地了解最终用户/一般公众的思考,即了解如何满足或不满意产品或服务的原因,即喜欢或不喜欢给定的电影或个人的原因,以及在上面的理解(关键方面/功能)。

Sentiment analysis可以通过破译人们喜欢/不喜欢,他们想要的东西以及他们的主要关注点来帮助我们收集有关评论/文本的见解信息

主要有两种方法可以从给定的评论/文本中提取情感,并将结果归类为正面或负面:

  • 基于词典的方法
  • 机器学习方法

→在此存储库笔记本中,我们将解决machine learning approach

机器根本无法以原始形式处理文本数据。他们需要我们将文本分解为数值格式,该格式很容易被机器读取。这是下面描述的技术/模型发挥作用的地方。

1- Bag of Words (Bow)和TF-IDF

  • BOW和TF-IDF是帮助我们将文本句子转换为数字向量的技术。
  • BOW只是创建了一组载体,其中包含文档中单词出现的数量(评论),而TF-IDF技术则创建了一个归一化的计数,其中每个单词计数除以该单词出现的文档数量,它捕获了文档中单词的相关性和频率。
  • 对于BOW和TF-IDF而言,每个单词都是独立的方式捕获的,因此未捕获其发生的局部上下文(掩盖单词) ,因此他们俩都不考虑单词之间的语义关系

上下文可以从两种不同的角度看待,我们以后将解决

2- Word2VecGlove

  • Word2Vec是一个两层神经网,通过矢量化单词来处理文本。它的输入是文本语料库,其输出是一组向量:代表该语料库中单词的特征向量。
  • Word2Vec考虑相邻的单词以捕获单词的局部上下文,同时减少数据的大小。
  • 当使用Word2Vec时,如果我们认为我们有足够的数据,可以进行自定义矢量化,因为它将非常具体,或者可以使用经过预告片的单词嵌入在非常大的语料库中训练的单词嵌入(Gopgle News)(Gopgle News)
  • Word2Vec和手套的训练方式有所不同。 Glove通过计算全局单词单词共发生矩阵来扩展Word2Vec在文本语料库中捕获全局上下文信息的工作。如上所述,Word2Vec仅在训练过程中捕获单词的局部上下文,它仅考虑相邻的单词以捕获上下文。手套考虑了整个语料库,并创建一个大型矩阵,可以捕获整个语料库中单词的同时出现。
  • 这两个嵌入的验证模型易于使用,并且易于将其整合到Python代码中。

3- BERT

  • 虽然Word2Vec和Glove Word嵌入是独立的,但在某种意义上,这些模型仅输出每个单词的一个向量(嵌入),将单词的所有不同感官组合到一个向量中,Bert可以为同一单词生成不同的单词嵌入,以捕获单词上下文- 这是句子中的位置
  • Word2Vec和Glove在训练中不考虑单词顺序,而Bert会考虑单词顺序(Bert使用Transformer - 一种基于注意的位置编码的基于注意力的模型来表示单词位置)
    • 例如,对于以下句子,“他用手机去了监狱牢房,从囚犯那里提取血细胞样本”,伯特将为牢房生成三个不同的向量。第一个“牢房”(监狱案例)将更接近诸如监禁,犯罪等的词,而第二个“牢房”(电话案例)将更接近iPhone,Android等单词,第三个“细胞”(血细胞案例)将更接近诸如Platelets,hemoglobin,flicid,etce等,例如诸如诸如iPhone,Android等单词。
  • 上面提到的差异的一个实际含义是,我们可以将Word2Vec和手套向量直接用于下游任务,我们需要的只是单词的向量,不需要模型本身来训练这些向量。但是,在伯特(Bert)的情况下,由于它与上下文有关,因此我们需要用于训练向量的模型,因为这些模型基于上下文生成了一个单词的向量

4- Doc2Vec

  • doc2vec是Word2Vec的扩展,该扩展应用于整个文档/评论而不是单个单词。该模型旨在创建文档/评论而不是单词的数值表示(Le&Mikolov,2014)。 DOC2VEC基于逻辑,即单词的含义还取决于其发生的文档
  • 这些标签只是Doc-Vectors Collection的键,它们没有语义含义

Sentiment Analysis of the Restaurant Reviews from YELP Dataset

→我们需要从Yelp数据集中找到的两个数据集(评论业务)可以在此处找到

→您可以在这里学习如何在Google Cloud Platform中创建由用户管理的笔记本实例

  • 笔记本中执行的任务 - 关键点

1-预处理(此任务的整个笔记本)

2-TF -IDF

2.1-首先,阅读预处理阶段后存储在存储桶中的清洁数据集

2.2-进行火车/测试拆分,保持关注的两列,并保留每个班级中相同比例的示例,如原始数据集中所观察到的

2.3-建立基准逻辑回归具有默认参数SVM模型,该参数将用作基线模型评估

  • 注意:使用GridSearchCV,我发现了bowtf-idf ngram_range (((1,1),(2,2),(3,3),(1,2),(2,2),(2,3),(1,3))的性能更好地使用所选分类器logistic回归

2.4-逻辑回归和带有超参数调整SVM分类器(使用GridSeachCV )。评估

3 -Word2Vec

  • 注意尽管数据集不是很大,但我使用word2vec而不使用验证的单词嵌入式,因为我认为我有足够的数据可以进行自定义矢量化,因为这对语料库的上下文非常特定

3.1-在培训数据上学习单词嵌入

3.2-创建一个函数以获取将为分类器提供的向量

3.3-建立基准测试逻辑回归具有默认参数SVM分类器模型,该模型将用作基线模型

3.3.1-使用逻辑回归评估

3.3.2-使用SVM评估

3.4-高参数调整和评估

3.4.1-使用GridSearchCV进行逻辑回归高参数调谐评估

3.4.2-使用GridSearchCV进行SVM的超级参与者调谐评估

4- doc2vec

5-使用Pytorch框架(整个COLAB笔记本) Bert 。用于交互式预览

5.1-预处理

5.2-安装transformers

5.3-定义我们将要使用的预训练模型: bert-base-uncased

5.4-加载bert令牌

5.5-决定最大句子长度

5.6-数据集分为火车(70%),验证(15%)和测试(15%)集

5.7-转换为列表每个集合

5.8-为每个评论创建一系列令牌ID (输入ID)

5.9-填充截断截断我们的序列,使它们的长度相同

5.10-创建注意力面具

5.11-将所有输入ID,标签和注意力面膜的所有列表转换为火炬张量

5.12-创建一个DataLoader加载我们的数据集

5.13-构建情感分类器BertForSequenceClassification

5.14-实例化我们的模型

5.15-我们的模型移至GPU

5.16-优化器,学习率调度程序,损失功能和时期数量

注意

  • 微调我们的BERT分类器,我们需要创建一个optimizer 。考虑到Bert上的原始论文,我们将使用AdamW优化器,因为它实现了梯度偏置校正以及重量衰减。我们还将使用没有热身步骤的线性调度程序

  • 作者有一些有关微调的建议

    • 批量尺寸:16,32
    • 学习率(ADAM):5E-5,3E-5,2E-5
    • 时期数:2、3或4

我们分别选择了16、3e -52

5.17-培训验证

  • 注意:我们可以存储培训验证损失准确性值,然后绘制制作一个表格,以测量每个时期完成后火车验证集的性能,以便我们更清楚地看到训练循环进度

5.18-预测测试集

5.19-将预测转换为张量

5.20-在预测上应用软磁

5.21-转换为numpy数组

5.22-测试数据的混淆矩阵的热图

5.23-分类报告

5.24-结论

下载源码

通过命令行克隆项目:

git clone https://github.com/jose-jpm-alves/NLP_Sentiment_Analysis.git