实现基于LSTM的情感分析

2023-10-27

实现基于LSTM的情感分析

NLP中情感分析是一个比较常见的任务,涉及文本的情感特征提取、情感特征分类、情感特征检索与归纳等方面。

基于情感特征进行分类的方法主要有:

1.基于情感词典的方法

  • 人工构建情感词典(人工总结标注)
  • 自动构建情感词典(基于知识库)

在这里插入图片描述

  1. 基于机器学习的方法
  • 朴素贝叶斯
  • SVM分类器
  • 深度学习方法

在这里插入图片描述
项目详见GitHubhttps://github.com/SoulDGXu/Sentiment-Analysis-Chinese-pytorch

1. 【情感分析】常用的数据集及开源库

以下是一些我们最常用的的用于试验情绪分析和机器学习方法的情绪分析数据集。 它们开源且可以免费下载 。

1.1 常用数据集

1.1.1 亚马逊产品评价

产品评论: 此数据集包含数百万亚马逊客户评论,星级评级,对培训情绪分析模型非常有用。(https://www.kaggle.com/bittlingmayer/amazonreviews )

1.1.2 Yelp餐饮评价

餐饮评论:此数据集包含5,2百万条评论星级的Yelp评论。( https://www.kaggle.com/yelp-dataset/yelp-dataset)

1.1.3 电影评价

电影评论:此数据集包含1,000个正面和1,000个负面处理评论。 它还提供5,331个正面和5,331个负面处理句子/片段。( http://www.cs.cornell.edu/people/pabo/movie-review-data/)

1.1.4 亚马逊食品评价

精美食品评论:此数据集包含来自亚马逊的约500,000份食品评论。 它包括产品和用户信息,评级以及每个评论的纯文本版本。( https://www.kaggle.com/snap/amazon-fine-food-reviews)

1.1.5 航空公司Twitter评价

Kaggle上Twitter对航空公司的评论:该数据集包含约15,000条有关航空公司的标签推文(正面,中性和负面)。( https://www.kaggle.com/crowdflower/twitter-airline-sentiment)

1.1.6 共和党辩论Twitter评价

第一次共和党辩论Twitter情绪:这个数据集由关于2016年第一次共和党辩论的大约14,000条标记的推文(正面,中立和负面)组成。( https://www.kaggle.com/crowdflower/first-gop-debate-twitter-sentiment)

1.2 开源库

  • Sklearn
  • jieba
  • NLTK
  • spacy

2. Seq2Seq模型

在Seq2Seq(Encoder-Decoder)模型中,Encoder编码器的作用是把一个不定长的输入序列 x 1 , x 2 , … , x T x_1,x_2,\dots,x_T x1,x2,,xT变换成一个定长的背景变量 c = q ( h 1 , h 2 , … , h T ) c=q(h_1,h_2,\dots,h_T) c=q(h1,h2,,hT),并在该背景变量中编码输入序列 x 1 , x 2 , … , x T x_1,x_2,\dots,x_T x1,x2,,xT的信息。给定训练样本中的输出序列 y 1 , y 2 , … , y T ′ y_1,y_2,\dots,y_{T'} y1,y2,,yT,对每个时间步 t ′ t' t,Decoder解码器输出 y t ′ y_{t'} yt的条件概率将基于之前输出序列 y 1 , y 2 , … , y t ′ y_1,y_2,\dots,y_{t'} y1,y2,,yt和背景变量 c c c,即 P ( y t ′ ∣ y 1 , y 2 , … , y t ′ − 1 , c ) P(y_{t'}|y_1,y_2,\dots,y_{t'-1},c) P(yty1,y2,,yt1,c)

attention机制通过对Decoder编码器所有时间步的隐藏状态做加权平均来得到背景变量。Decoder在每一时间步调整这些权重,即注意力权重,从而能够在不同时间步分别关注输入序列中的不同部分并编码进相应时间步的背景变量。

加入attention机制后,Decoder每一时间步可以使用可变的背景变量 c t ′ c_{t'} ct。Encoder在时间步 t t t的隐藏状态为 h t h_t ht,且总时间步数为 T T T,Decoder在时间步 t ′ t' t的背景变量为所有Encoder隐藏状态的加权平均:
c t ′ = ∑ t = 1 T α t ′ t h t c_{t'}=\sum_{t=1}^{T}\alpha_{t't}h_t ct=t=1Tαttht
给定 t ′ t' t,权重 α t ′ t \alpha_{t't} αtt t = 1 , … , T t=1,\dots,T t=1,,T的值是一个概率分布。为了得到概率分布,可以使用softmax运算:
α t ′ t = e x p ( e t ′ t ) ∑ k = 1 T e x p ( e t ′ k ) , t = 1 , … , T \alpha_{t't}=\frac{exp(e_{t't})}{\sum_{k=1}^{T}exp(e_{t'k})},t=1,\dots,T αtt=k=1Texp(etk)exp(ett),t=1,,T
现在,我们需要定义如何计算上式中softmax运算的输入 e t ′ t e_{t't} ett,由于 e t ′ t e_{t't} ett同时取决于Decoder的时间步 t ′ t' t和Encoder的时间步 t t t,不妨以Decoder在时间步 t ′ − 1 t'-1 t1的隐藏状态 s t ′ − 1 s_{t'-1} st1与Encoder在时间步 t t t的隐藏状态 h t h_{t} ht为输入,并通过函数a计算 e t ′ t e_{t't} ett
e t ′ t = a ( s t ′ − 1 , h t ) e_{t't}=a(s_{t'-1},h_t) ett=a(st1,ht)
函数a有多种选择,如果两个输入向量长度相等,可以取內积 a ( s , h ) = s T h a(s,h)=s^Th a(s,h)=sTh。而最早提出注意力机制的论文则将输入连结后通过含单隐藏层的多层感知机变换:
a ( s , h ) = v T t a n h ( W s s + W h h ) a(s,h)=v^Ttanh(W_ss+W_hh) a(s,h)=vTtanh(Wss+Whh)
其中 v v v W s W_s Ws W h W_h Wh都是可以学习的模型参数。

在这里插入图片描述

3. 【情感分析】一个简单例子

这里会给一个情感分类的例子,使用的是BiLSTM+Attention的Seq2Seq模型。

项目详见GitHubhttps://github.com/SoulDGXu/Sentiment-Analysis-Chinese-pytorch

利用深度学习来解决情感分类问题,最重要的是考虑如何语义表征/如何融合信息,至于分类,其实很简单,一个线性层即可。

3.1 评价指标

  • Accuracy=(TP + TN) / (TP + FN + FP + FN)
  • Precision=TP /( TP + FP)
  • Recall=TP / (TP + FN)
  • F1=2 * Recall * Precision / (Recall + Precision)

3.2 实现Bi-LSTM+Attention

Pipeline流程:

  1. 拿到文本,分词,清洗数据(去掉停用词语)
  2. 建立word2index, index2word 表
  3. 准备好预训练好的 word embedding ( or start from one hot)
  4. 做好 Dataset / Dataloader,得到数据集的句子表示
  5. 建立模型. (soft attention. / hard attention/ self-attention/ scaled dot
    product self attention)
  6. 配置好参数
  7. 开始训练
  8. 测评
  9. 保存模型

注意:model保存为state_dict形式更好,重载model框架以及存在state_dict里的参数更稳定,不受pytorch和其他package的版本影响。

关于数据:

  • data文件夹:存放停用词,训练数据集、测试数据集、验证数据集。文本的数据集是由已分词的影评文本,以及对应的标签(2类,0表示正面评价,1表示负面评价)组成。其中,训练集含19998条评价(正面、负面评价各占一半);测试集含369条评价(正面评价:182,负面评价:187);验证集含5629条评价(正面评价:2817,负面评价:2812)。数据很平衡,故不用进行不平衡处理。
  • model文件夹:存放训练好的模型。
  • word2vec文件夹:存放预训练中文词向量(wiki_word2vec_50.bin),word2id词表,语料的词向量表示等。
  • paper文件夹:引入注意力机制的双向LSTM的文本分类论文。
  • images文件夹:README.md用到的一些图片。

关于代码:

  • Sentiment_Analysis_Config.py:配置数据处理、模型构建的参数等;
  • Sentiment_Analysis_DataProcess.py:读取数据集、构建word2id表、构建语料的word2vec词向量表示、获得文本句子和标签的的数字索引表示。
  • Sentiment_model.py:模型有2个:一个是普通的LSTM,一个是多层LSTM堆叠并引入attention机制的BiLSTM+Attention模型。
  • Sentiment_Analysis_eval.py:根据训练好的模型对测试集进行预测,由准确率、F1、Recall、混淆矩阵来评估模型性能。
  • Sentiment_Analysis_main.py:基于BiLSTM+Attention模型的情感分析全流程。

关于运行:

  1. Sentiment_Analysis_Config.py中配置相关参数;
  2. 运行Sentiment_Analysis_DataProcess.py生成相应的word2id,word2vec等文件;
  3. 运行主函数Sentiment_Analysis_main.py,得到训练好的模型,并保存模型;
  4. 运行Sentiment_Analysis_eval.py,读取模型,对给定的测试文本(pre.txt)给出评价。

运行示例:

Sentiment_Analysis_main.py运行效果:

在这里插入图片描述

Sentiment_Analysis_eval.py运行效果:

在这里插入图片描述

4. 参考

  • 文本情感分析方法小结 LeonG ( https://zhuanlan.zhihu.com/p/106588589)

  • Chineses-Sentiment Analysis-Pytorch :李狗嗨
    (https://github.com/Ligouhai-bigone/Sentiment-Analysis-Chinese-pytorch)

  • Recall . Precision
    (https://www.zhihu.com/question/19645541/answer/91694636)

  • Bilstm+attention(https://www.cnblogs.com/jiangxinyang/p/10208227.html)

  • Lstm (https://zybuluo.com/hanbingtao/note/581764)

欢迎各位关注我的个人公众号:HsuDan,我将分享更多自己的学习心得、避坑总结、面试经验、AI最新技术资讯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现基于LSTM的情感分析 的相关文章

  • 如何对德语文本进行词形还原?

    我有一篇德语文本 我想对其应用词形还原 如果不可能进行词形还原 那么我也可以接受词干提取 Data 这是我的德语文本 mails Hallo Ich spielte am fr hen Morgen und ging dann zu ein
  • gensim如何计算doc2vec段落向量

    我正在看这篇论文http cs stanford edu quocle paragraph vector pdf http cs stanford edu quocle paragraph vector pdf 它指出 段落向量和词向量被平
  • NLTK 中的 wordnet lemmatizer 不适用于副词 [重复]

    这个问题在这里已经有答案了 from nltk stem import WordNetLemmatizer x WordNetLemmatizer x lemmatize angrily pos r Out 41 angrily 这是 nl
  • Tensorflow 的 LSTM 输入

    I m trying to create an LSTM network in Tensorflow and I m lost in terminology basics I have n time series examples so X
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • 保存具有自定义前向功能的 Bert 模型并将其置于 Huggingface 上

    我创建了自己的 BertClassifier 模型 从预训练开始 然后添加由不同层组成的我自己的分类头 微调后 我想使用 model save pretrained 保存模型 但是当我打印它并从预训练上传时 我看不到我的分类器头 代码如下
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • Caffe 的 LSTM 模块

    有谁知道 Caffe 是否有一个不错的 LSTM 模块 我从 russel91 的 github 帐户中找到了一个 但显然包含示例和解释的网页消失了 以前是http apollo deepmatter io http apollo deep
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 使用 SciKit-learn 和大型数据集进行文本分类

    首先 我昨天开始学习Python 我正在尝试使用 SciKit 和大型数据集 250 000 条推文 进行文本分类 对于该算法 每条推文都将表示为 4000 x 1 向量 因此这意味着输入为 250 000 行和 4000 列 当我尝试在
  • 从 Penn Treebank 格式的文本中提取子句

    说我有一句话 After he had eaten the cheese Bill went to the grocery 在我的程序中 我得到以下输出 PARSE TREE ROOT S SBAR IN After S NP PRP he
  • Keras:嵌入/向量的附加层?

    我有 3 个词嵌入 嵌入 1 w11 w12 w13 w14 嵌入 2 w21 w22 w23 w24 嵌入 3 w31 w32 w33 w34 有没有办法通过添加所有三个向量来获得第四个嵌入 并使用所有向量的可训练权重 例如 嵌入 4 w
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • 如何从Python中的阿拉伯字符串中删除英文文本?

    我有一个带有英文文本和标点符号的阿拉伯字符串 我需要过滤阿拉伯文本 我尝试使用 sting 删除标点符号和英语单词 但是 我失去了阿拉伯语单词之间的空格 我哪里错了 import string exclude set string punc
  • 如何在带有 LSTM 层的 TensorFlow Hub 中使用嵌入模型?

    我正在学习 TensorFlow 2 通过 TF Hub 教程进行文本分类 它使用了 TF hub 的嵌入模块 我想知道是否可以修改模型以包含 LSTM 层 这是我尝试过的 train data validation data test d
  • 池化与随时间池化

    我从概念上理解最大 总和池中发生的情况作为 CNN 层操作 但我看到这个术语 随时间变化的最大池 或 随时间变化的总和池 例如 用于句子分类的卷积神经网络 https arxiv org pdf 1408 5882 pdfYoon Kim
  • 如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

    Scikit learn 具有相当用户友好的用于机器学习的 python 模块 我正在尝试训练用于自然语言处理 NLP 的 SVM 标记器 其中我的标签和输入数据是单词和注释 例如 词性标记 而不是使用双精度 整数数据作为输入元组 1 2

随机推荐

  • 电话号码对应英文单词 (python)

    在电话号码输入数字 输出他所有的单词组合 解法 1 循环法 这里假设电话号码只有3位 那么可以使用3个for循环来进行输出 c ABC DEF GHI JKL MNO PQRS TUV WXYZ 分别代表着0 1 2 3 4 5 6 7 8
  • 如何在C++中删除文件

    include
  • 浅析RPC与WebService

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 虽然现在非常火的RPC技术以SpringCloud和Dubbo为主流 但是如果做接口调用 还是逃不了要用一些较传统的技术 前几天在做接口调用时恰巧用到了WebService
  • SQL代码——数据库,数据表代码操作

    数据库 创建数据库Create database db library 查看数据库show databases 选择数据库ues db library 删除数据库drop database db library 注 除了use不用写data
  • 致远OA检测工具-SeeyonExploit-GUI

    致远OA综合利用工具 项目地址 https github com linshaoSec SeeyonExploit GUI 致远OA A8 漏洞综合工具 v1 0 by linshao 支持批量一件扫描 后续会持续更新其他漏洞 现支持漏洞
  • 精彩!Facebook开源RAG,绕开重新训练,轻松修改已训练模型丨NeurIPS 2020

    AMiner平台由清华大学计算机系研发 拥有我国完全自主知识产权 平台包含了超过2 3亿学术论文 专利和1 36亿学者的科技图谱 提供学者评价 专家发现 智能指派 学术地图等科技情报专业化服务 系统2006年上线 吸引了全球220个国家 地
  • springsecurity oauth2中refresh token模式需要注意的点

    oauth2官方只有4种授权方式 不过springsecurity oauth2把refresh token也归为authorizedGrantTypes的一种 因此 springsecurity的oauth2实现有5中模式 authori
  • 【封装丨优雅方法】

    封装是个老生常谈的话题了 那么如何优雅的封装呢 不要急 本文下面就讲一讲优雅封装的几种方式 如何优雅的封装 一 封装的含义 二 优雅的封装 1 使用接口和抽象类 2 使用私有变量和公有方法 3 使用静态方法和常量 4 使用注解 5 使用枚举
  • 如何从Numpy 数组通过索引获取元素或切片

    一 一维numpy数组 一层 其中的元素为标量 a np array 1 2 3 4 5 6 gt gt gt a 2 取一个元素 得到一个标量 3 gt gt gt a 2 通过列表取1个元素 得到一个包含1个元素的1维数组 1层 arr
  • 解决VsCode下LaTex编译文件输出问题

    解决VsCode下LaTex编译文件输出问题 默认情况下 VsCode编译Latex文档时会将生成的pdf及其它一系列的文件保存在同主tex文件相同的目录下 这样的排版看起来会很混乱 所以在VsCode的配置文件中对其进行相关设置 指定编译
  • java-mybaits-00402-Mapper-动态sql-if、where、foreach、sql片段

    1 动态sql 重点 通过mybatis提供的各种标签方法实现动态拼接sql 什么是动态sql mybatis核心 对sql语句进行灵活操作 通过表达式进行判断 对sql进行灵活拼接 组装 需求 用户信息综合查询列表和用户信息查询列表总数这
  • 张钜楷:3.15黄金原油晚间是否会上涨呢?今日最新策略及分析操作

    注意 合理控制好仓位 切勿重仓或满仓操作 做单严格止损止盈 想了解更多资讯可关注 张钜楷希望大家一定要记住 投资 首先要学会控制风险 才能保证利润 切记带好止盈止损 带一个关键点位止损 把风险降到最低 口末亻言 jc98948 很多朋友问我
  • 完美解决Application context not configured for this file

    问题含义是 未为此文件配置应用程序上下文 换句话说就是没有将该文件配置到项目中 解决方式 第一步 首先点击显示的提示信息 Create Spring facet 第二步 在点击后的弹出页面中可以明显看到下方有个感叹号 不要慌 我们按下图操作
  • 黑苹果hd630显存7m_一次黑苹果的折腾记录——修改缓冲帧,解决显存只有7M,正确驱动Intel核显...

    一次黑苹果的折腾记录 修改缓冲帧 解决显存只有7M 正确驱动Intel核显 2020 09 19 19 16 18 18点赞 97收藏 22评论 你是AMD Yes党 还是intel和NVIDIA的忠实簇拥呢 最新一届 装机大师赛 开始啦
  • 开源实时监控 HertzBeat v1.3.2 发布, 更稳定更易用

    HertzBeat 介绍 HertzBeat赫兹跳动 是一个拥有强大自定义监控能力 无需 Agent 的开源实时监控告警工具 致力于易用友好 全WEB页面操作 鼠标点一点就能监控告警 零上手学习成本 集 监控 告警 通知 为一体 支持对应用
  • JS实现网站密码复杂度设置

    1 密码长度不小于8 if password length lt 8 alert 密码长度不小于8 return false 2 密码包含大写 小写字母和数字 var reg new RegExp A Z a z 0 9 if reg te
  • 4211 序列重排(构造、思维题--双关键字排序)

    1 问题描述 给定一个长度为 n 的整数序列 a1 a2 an 请你对序列进行重新排序 也可以保持原序列 要求新序列满足每个元素 第 1 个除外 都恰好是前一个元素的两倍或前一个元素的三分之一 保证输入一定有解 输入格式 第一行包含整数 n
  • 微信小程序:更改 顶部状态栏( "window")

    摘要 更改顶部导航栏 通常是指更改顶部状态栏的标题内容 标题颜色以及背景颜色 如下图所示 上图中小程序的顶部导航栏的标题内容 小程序 标题颜色 黑色 背景颜色 白色 配置 更改顶部导航栏 要用到组件 window 1 如果小程序有多个页面
  • uniapp Vant Weapp使用van-dropdown 下拉菜单时,关闭后遮罩下面的盒子无法触发点击

    是 uni app 底层的问题 你可以将 vant weapp dropdown item index wxml 里面的 van popup 的事件改成驼峰写法 afterEnter 和 afterLeave 就可以了
  • 实现基于LSTM的情感分析

    文章目录 实现基于LSTM的情感分析 1 情感分析 常用的数据集及开源库 1 1 常用数据集 1 1 1 亚马逊产品评价 1 1 2 Yelp餐饮评价 1 1 3 电影评价 1 1 4 亚马逊食品评价 1 1 5 航空公司Twitter评价