1、BILSTM基本原理

前向的LSTM与后向的LSTM结合成BiLSTM。比如,我们对“我爱中国”这句话进行编码,模型如图1所示。

2、情感分析步骤

  • 收集数据:爬虫爬取
  • 数据预处理:特征:切词----停用词过滤----词嵌入(word2vec)        标签:类别数字化----onehot编码
  • 搭建模型:bilstm----cnn----选择参数(k折验证|随机森林|autoML等)----选择优化器
  • 训练:把词嵌入的结果输入模型设置迭代次数,批次的样本数量
  • 评估模型:召回率|准确率|RMSE|
  • 预测:输入新的样本,进行情感分析

可参考如下图,不一定网络规模一致:

3、代码实现

import numpy as np
from gensim.models.word2vec import Word2Vec
from gensim.corpora.dictionary import Dictionary
from gensim import models
import pandas as pd
import jieba
import logging
from keras import Sequential
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Bidirectional,LSTM,Dense,Embedding,Dropout,Activation,Softmax
from sklearn.model_selection import train_test_split
from keras.utils import np_utils
import pdb"""
物流快递  医疗服务  金融服务  食品餐饮  旅游住宿
"""# 读入数据
def read_data(data_path):# 两个标签,一个放句子,一个放标签senlist = []labellist = []  # 开始读入进行处理with open(data_path, "r",encoding='gb2312',errors='ignore') as f:for data in  f.readlines():data = data.strip()# 一行四个元素:文章序列、文本类型、文本、情感分类类型sen = data.split("\t")[2] label = data.split("\t")[3]if sen != "" and (label =="0" or label=="1" or label=="2" ) :senlist.append(sen)labellist.append(label) else:pass                    assert(len(senlist) == len(labellist))            return senlist ,labellist sentences,labels = read_data("./data_train.csv")""" 1、word2vec模型训练,后续使用直接加载即可
# 训练词向量,直接把句子放入,切词,训练成w2c向量,保存模型
def train_word2vec(sentences,save_path):sentences_seg = []# 使用'\n'连接句子sen_str = "\n".join(sentences)# 切词res = jieba.lcut(sen_str)# 使用空格连接好切好的词seg_str = " ".join(res)# 使用'\n'符号将切词分割开sen_list = seg_str.split("\n")# 构建列表添加切好的文本预料,仍然是以文本为单位,但已经是切词形态了for i in sen_list:sentences_seg.append(i.split())print("开始训练词向量") # logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)model = Word2Vec(sentences_seg,size=100,  # 词向量维度min_count=5,  # 词频阈值window=5)  # 窗口大小    model.save(save_path)return modelmodel =  train_word2vec(sentences,'./w2cmodel/word2vec.model')
# pdb.set_trace()
"""model = Word2Vec.load('./w2cmodel/word2vec.model')# 数据的预处理# 返回值:w2id ---- {word:索引}        embedding_weights ---- {索引:词向量}
# 逻辑就出来了:根据 word 查询 索引,根据索引查询词向量
def generate_id2wec(word2vec_model):gensim_dict = Dictionary()gensim_dict.doc2bow(model.wv.vocab.keys(), allow_update=True)w2id = {v: k + 1 for k, v in gensim_dict.items()}  # 词语的索引,从1开始编号 {word:索引}w2vec = {word: model[word] for word in w2id.keys()}  # 词语的词向量 {词:词向量}# 获取词的长度n_vocabs = len(w2id) + 1# 初始化一个空白词向量embedding_weights = np.zeros((n_vocabs, 100))for w, index in w2id.items():  # 从索引为1的词语开始,用词向量填充矩阵embedding_weights[index, :] = w2vec[w]return w2id,embedding_weightsdef text_to_array(w2index, senlist):  # 文本转为索引数字模式sentences_array = []for sen in senlist:new_sen = [ w2index.get(word,0) for word in sen]   # 单词转索引数字# pdb.set_trace()sentences_array.append(new_sen)return np.array(sentences_array)def prepare_data(w2id,sentences,labels,max_len=200):# 切分训练集和测试集样本X_train, X_val, y_train, y_val = train_test_split(sentences,labels, test_size=0.2)# 按照词典将文本转化为索引文本,每个索引对应词向量X_train = text_to_array(w2id, X_train)X_val = text_to_array(w2id, X_val)# 填充文本至统一长度max_lenX_train = pad_sequences(X_train, maxlen=max_len)X_val = pad_sequences(X_val, maxlen=max_len)# to_categorical()独热编码return np.array(X_train), np_utils.to_categorical(y_train) ,np.array(X_val), np_utils.to_categorical(y_val)# 是为了拿到传给后续情感分析模型的词典(w2id) 和 词向量矩阵(embedding_weights)
w2id,embedding_weights = generate_id2wec(model)# 传入词典、句子文本、标签、最大长度
# 返回两个文本的索引形式 两个文本标签的独热编码形式
x_train,y_trian, x_val , y_val = prepare_data(w2id,sentences,labels,200)# 定义了一个Sentiment类,封装了模型的构建,训练和预测方法
class Sentiment:# 初始化def __init__(self,w2id,embedding_weights,Embedding_dim,maxlen,labels_category):self.Embedding_dim = Embedding_dimself.embedding_weights = embedding_weightsself.vocab = w2idself.labels_category = labels_categoryself.maxlen = maxlenself.model = self.build_model()# 模型搭建,返回一个modeldef build_model(self):model = Sequential()#input dim(140,100)model.add(Embedding(output_dim = self.Embedding_dim, input_dim=len(self.vocab)+1, weights=[self.embedding_weights], input_length=self.maxlen))model.add(Bidirectional(LSTM(50),merge_mode='concat'))model.add(Dropout(0.3))model.add(Dense(self.labels_category))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam',  metrics=['accuracy'])model.summary()return modeldef train(self,X_train, y_train,X_test, y_test,n_epoch=1, model_load=1, model_path=None):if model_load:self.model.fit(X_train, y_train, batch_size=320, epochs=n_epoch, validation_data=(X_test, y_test))self.model.save('sentiment.h5')   else:model = self.modelmodel.load_weights(model_path)model.fit(X_train, y_train, batch_size=320, epochs=n_epoch, validation_data=(X_test, y_test))model.save('sentiment.h5')def predict(self,model_path,new_sen):model = self.modelmodel.load_weights(model_path)new_sen_list = jieba.lcut(new_sen)sen2id =[ self.vocab.get(word,0) for word in new_sen_list]sen_input = pad_sequences([sen2id], maxlen=self.maxlen)res = model.predict(sen_input)[0]return np.argmax(res)# 构建模型,同时传人词典和词向量矩阵
senti = Sentiment(w2id,embedding_weights,100,200,3)# 训练模型
# senti.train(x_train,y_trian, x_val ,y_val,n_epoch=2, model_load=0, model_path='./sentiment.h5')# 模型预测
label_dic = {0:"消极的",1:"中性的",2:"积极的"}
# sen_new = "现如今的公司能够做成这样已经很不错了,微订点单网站的信息更新很及时,内容来源很真实"
# sen_new = '一点都不好,我们同事那一桌只剩下了这个点,就扣了我们50元钱,味道也是一般'
# sen_new = '活动很精彩,人很多,学到很多'
# sen_new = '携程不怎么样,服务不好,价格贵杀熟,跟不上市场形势,不会分析需求'
# sen_new = "买的这个鞋子有一点破旧,鞋帮有一点开裂,总之物流也非常慢,就是讨厌"
sen_new = '味道不好吃,不喜欢,太辣了'
pre = senti.predict("./sentiment.h5",sen_new)
print("'{}'的情感是:\n{}".format(sen_new,label_dic.get(pre)))

NLP自然语言处理之基于BiLstm的短文本情感分析相关推荐

  1. 自然语言处理(NLP):10 基于WordAVGModel 增加Attention机制情感分析

    电影评论数据集进行情感分析 通过torchtext 数据预处理 定义WordAVGModel 引入Attention加权平均机制(参考transformer中attention中dot product ...

  2. 自然语言处理 | (6) 基于英文文本的简易情感分析

    在本片博客中我们结合之前讲的工具库.sklearn以及pandas,来构建一个简易的情感分析模型.情感分析属于分类任务,即为文本分配情感标签,我们将使用简单的逻辑回归模型来实现这个多分类任务. 目录 ...

  3. 基于IndRNN的微博短文本情感分析设计与实现

    目录 摘要 数据集描述 模型构建与实现 1.IndRNN模型原理 2. IndRNN代码实现 3.词嵌入特征实现(word2vec) 实验结果对比分析 实验环境: 实验设计: RNN模型实验结果: L ...

  4. 自然语言处理模型_ICLR 2020 「自然语言处理」【Prosus AI】金融情感分析FinBERT模型(含源码)!...

    来源:AINLPer微信公众号 编辑: ShuYini 校稿: ShuYini 时间: 2020-1-15 TILE: FinBERT: Financial Sentiment Analysis wi ...

  5. python毕业设计开题报告-基于python爬虫的影评情感分析研究开题报告

    论文(设计)题目 基于python爬虫的影评情感分析研究开题报告 选题的背景.意义及研究现状: 研究现状: 文本情感分析又称倾向性分析.情感挖掘,主观分析或评论挖掘,是对带有情感色彩的评论文本内容进行 ...

  6. 基于 CNN 的中文对话情感分析

    1 基于 CNN 的中文对话情感分析:https://www.jianshu.com/p/87ca0616f1a4 2 清华 ACL 2020 长文 | KdConv:多领域知识驱动的中文多轮对话数据 ...

  7. Moodlens:一个基于表情符号的中文微博情感分析系统(A3, SIGKDD2012)

    Moodlens: an emoticon-based sentiment analysis system for chinese tweets Moodlens:一个基于表情符号的中文微博情感分析系 ...

  8. 基于IMDB评论数据集的情感分析

    文章目录 前言 一.大型电影评论数据集介绍 二.环境配置 三.实验模型及流程 1.实验模型 2.实验流程 四.实验代码 1.多层感知器模型代码 2.递归神经网络模型代码 3.长短期记忆模型代码 五.实 ...

  9. 基于 Amazon SageMaker 构建细粒度情感分析应用【附部署视频】

    基于 Amazon SageMaker 构建细粒度情感分析应用 基于 Amazon SageMaker 构建细粒度情感分析应用 一.创建Sagemaker Notebook实例 输入名称.选择实例类型 ...

最新文章

  1. c++ 高通、低通、带通滤波器_射频/微波滤波器
  2. php下curl与file_get_contents性能对比
  3. WannaCry勒索软件还在继续传播和感染中
  4. Dubbo 新编程模型之外部化配置
  5. lacp静态和动态区别_lacp静态与动态区别
  6. Laravel 使用 Aliyun OSS 云存储
  7. msyql的FORMAT()函数设置小数位数,将小数位数保留到小数点后第n位,最后一位四舍五入
  8. mysql默认时间怎么不同步_MYSQL 更新时间自动同步与创建时间默认值共存问题
  9. Android Studio 3.4升级后的运行问题解决办法
  10. mysql查询时间提前五天_mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)...
  11. php常用的日期时间操作
  12. 少走弯路,给3~5年java程序员的唯一一条建议
  13. [Contrastive Learning] Improving Contrastive Learning by Visualizing Feature Transformation
  14. 清华大学计算机系学术委员会,蔡懿慈
  15. 关于2020年测绘资质新旧变化一览表
  16. 抖音同城怎么引流?抖音如何引流到线下实体店?
  17. 降低CSS特异性的策略
  18. 医学图像分割新网络:Boundary-aware Context Neural Network for Medical Image Segmentation
  19. Apollo自动驾驶50讲笔记
  20. 多线程在PyQt5中的应用记录

热门文章

  1. 开学季征文|我的2022,期待我的新生活
  2. atmega168p与328p_【图片】【经验分享】atmega 328p的定时器1的精确定时【arduino吧】_百度贴吧...
  3. 锁定应用,解锁应用,锁卡,解卡,更改密码指令
  4. ICLR 2023(投稿)|自然语言处理相关论文分类整理
  5. 利用MapTiler工具进行地图瓦片切图,适合用于在h5中显示手绘地图场景
  6. MD5或者SHA加密为32位字符的具体算法,值得学习,标准JAVA MD5方法
  7. 第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。
  8. 17.17. 多次搜索
  9. java10没人开发了吗,不愿看到Java开发者再做的10件事
  10. 使用Candance FPGA System Planner和Alitum Designer Scripting加速原理图设计