基于keras的文本情感识别
流程描述
Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好的模型对新来的数据进行分类。
该过程主要由训练流程和分类流程构成,这里以LSTM模型为例对文本情感分类进行描述。
训练流程
训练流程的输入是大量的已打标签文本数据,输出是最终的训练模型。
整体流程如下:

流程解释如下:
1、 评论数据分类
将原始评论数据进行分类,并打标签。该过程可以由多人同时进行,标签数据以最高得分为准(即少数服从多数)。
2、 数据预处理
计算机无法理解人类的自然语言,需要将人类的自然语言转换为计算机能理解的机器语言。该过程可以使用Word2Vec、jieba分词等工具实现,预处理的最终数据是词向量形式。
3、 模型训练过程
训练过程使用LSTM网络进行,数据经过嵌入层、LSTM层,最终到达输出层。不断重复以上过程至预期准确率。
4、 输出训练模型
当训练过程达到预期准确率时,终止训练过程,并将训练好的模型输出到文件。
分类流程
训练流程结束后,会输出最终的模型文件,分类过程需要预先加载该文件,将模型加载到内存,然后使用该模型对新输入的数据进行分类。
具体如下:

流程描述如下:
1、 启动程序,并加载模型;
2、 预处理文本数据,得到词向量数据;
3、 使用模型对词向量进行分类;
4、得到分类结果。
Keras安装
可参考:
https://www.cnblogs.com/MikeZhang/p/createKerasEnv-20210228.html
操作系统 : Ubuntu1804_x64
Python 版本 : 3.6.8
keras + tensorflow 环境搭建,使用cpu,安装命令如下:
virtualenv -p /usr/bin/python3.6 py36env source py36env/bin/activate pip install -r req.txt
req.txt 文件内容如下:

absl-py==0.7.1
astor==0.8.0
attrs==19.1.0
backcall==0.1.0
bleach==3.1.0
cycler==0.10.0
decorator==4.4.0
defusedxml==0.6.0
entrypoints==0.3
et-xmlfile==1.0.1
gast==0.2.2
google-pasta==0.1.7
graphviz==0.11.1
grpcio==1.22.0
h5py==2.9.0
interval==1.0.0
ipykernel==5.1.1
ipython==7.6.1
ipython-genutils==0.2.0
ipywidgets==7.5.0
jdcal==1.4.1
jedi==0.14.1
jieba==0.39
Jinja2==2.10.1
joblib==0.13.2
jsonschema==3.0.1
jupyter==1.0.0
jupyter-client==5.3.1
jupyter-console==6.0.0
jupyter-core==4.5.0
Keras==2.2.4
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.0
kiwisolver==1.1.0
Markdown==3.1.1
MarkupSafe==1.1.1
matplotlib==3.1.1
mistune==0.8.4
nbconvert==5.5.0
nbformat==4.4.0
notebook==6.0.0
numpy==1.16.2
openpyxl==2.6.2
pandas==0.24.2
pandocfilters==1.4.2
parso==0.5.1
pexpect==4.7.0
pickleshare==0.7.5
prometheus-client==0.7.1
prompt-toolkit==2.0.9
protobuf==3.9.0
ptyprocess==0.6.0
pydot==1.4.1
Pygments==2.4.2
pyparsing==2.4.0
pyrsistent==0.15.3
python-dateutil==2.8.0
pytz==2019.1
PyYAML==5.1.1
pyzmq==18.0.2
qtconsole==4.5.1
scikit-learn==0.21.2
scipy==1.3.0
Send2Trash==1.5.0
six==1.12.0
sklearn==0.0
tensorboard==1.14.0
tensorflow==1.14.0
tensorflow-estimator==1.14.0
termcolor==1.1.0
terminado==0.8.2
testpath==0.4.2
traitlets==4.3.2
wcwidth==0.1.7
webencodings==0.5.1
Werkzeug==0.15.4
widgetsnbextension==3.5.0
wrapt==1.11.2
使用方法
1、 激活虚拟环境
source py36env/bin/activate
2、 准备数据
准备用于训练及测试的文本数据,可以直接使用百度情感分析的样本数据。
3、 启动训练程序
比如: python cnn_bdt1.py
启动使用cnn模型的训练及测试流程。
测试结果
分词的情况决定最终的测试结果,以下结果基于百度情感分析里面的样本数据:
|
算法 |
训练 |
测试 |
|
cnn |
99% |
87% |
|
lstm |
98% |
86% |
|
cnn_lstm |
99% |
89% |
|
fasttext |
95% |
83% |
测试代码

文件说明如下:
senta_data : 训练及测试数据
testResult.csv : 测试结果
cnn_test1.py : CNN示例代码
cnn_lstm_test1.py : CNN_LSTM示例代码
fasttext_test1.py : fasttext示例代码
lstm_test1.py : LSTM示例代码
1、cnn示例
fillArr(x_train,y_train,"senta_data/train.tsv")
fillArr(x_test,y_test,"senta_data/test.tsv")
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
model = Sequential()
model.add(Embedding(max_features,embedding_dims,input_length=maxlen))
model.add(Dropout(0.2))
model.add(Conv1D(filters,kernel_size,padding='valid',activation='relu',strides=1))
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
2、lstm示例
fillArr(x_train,y_train,"senta_data/train.tsv")
fillArr(x_test,y_test,"senta_data/test.tsv")
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
model = Sequential()
model.add(Embedding(max_features, 128))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
3、cnn_lstm示例
fillArr(x_train,y_train,"senta_data/train.tsv")
fillArr(x_test,y_test,"senta_data/test.tsv")
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
model = Sequential()
model.add(Embedding(max_features, embedding_size, input_length=maxlen))
model.add(Dropout(0.25))
model.add(Conv1D(filters,kernel_size,padding='valid',activation='relu',strides=1))
model.add(MaxPooling1D(pool_size=pool_size))
model.add(LSTM(lstm_output_size))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
4、fasttext示例
fillArr(x_train,y_train,"senta_data/train.tsv")
fillArr(x_test,y_test,"senta_data/test.tsv") if ngram_range > 1:
ngram_set = set()
for input_list in x_train:
for i in range(2, ngram_range + 1):
set_of_ngram = create_ngram_set(input_list, ngram_value=i)
ngram_set.update(set_of_ngram)
start_index = max_features + 1
token_indice = {v: k + start_index for k, v in enumerate(ngram_set)}
indice_token = {token_indice[k]: k for k in token_indice}
max_features = np.max(list(indice_token.keys())) + 1
x_train = add_ngram(x_train, token_indice, ngram_range)
x_test = add_ngram(x_test, token_indice, ngram_range) x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
model = Sequential()
model.add(Embedding(max_features,embedding_dims,input_length=maxlen))
model.add(GlobalAveragePooling1D())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))
score, acc = model.evaluate(x_test, y_test,batch_size=batch_size)
print('Test score:', score)
print('Test accuracy:', acc)
本文涉及完整代码及资源下载地址:https://pan.baidu.com/s/182ZP5cBdA7QYk8lAj72mEA
可关注微信公众号(聊聊博文)后回复 2021033101 获得提取码。
基于keras的文本情感识别的更多相关文章
- 基于 Spark 的文本情感分析
转载自:https://www.ibm.com/developerworks/cn/cognitive/library/cc-1606-spark-seniment-analysis/index.ht ...
- NLP之基于TextCNN的文本情感分类
TextCNN @ 目录 TextCNN 1.理论 1.1 基础概念 最大汇聚(池化)层: 1.2 textCNN模型结构 2.实验 2.1 实验步骤 2.2 算法模型 1.理论 1.1 基础概念 在 ...
- 基于Bert的文本情感分类
详细代码已上传到github: click me Abstract: Sentiment classification is the process of analyzing and reaso ...
- 基于keras实现的中文实体识别
1.简介 NER(Named Entity Recognition,命名实体识别)又称作专名识别,是自然语言处理中常见的一项任务,使用的范围非常广.命名实体通常指的是文本中具有特别意义或者指代性非常强 ...
- NLP之基于Bi-LSTM和注意力机制的文本情感分类
Bi-LSTM(Attention) @ 目录 Bi-LSTM(Attention) 1.理论 1.1 文本分类和预测(翻译) 1.2 注意力模型 1.2.1 Attention模型 1.2.2 Bi ...
- LSTM 文本情感分析/序列分类 Keras
LSTM 文本情感分析/序列分类 Keras 请参考 http://spaces.ac.cn/archives/3414/ neg.xls是这样的 pos.xls是这样的neg=pd.read_e ...
- pytorch 文本情感分类和命名实体识别NER中LSTM输出的区别
文本情感分类: 文本情感分类采用LSTM的最后一层输出 比如双层的LSTM,使用正向的最后一层和反向的最后一层进行拼接 def forward(self,input): ''' :param inpu ...
- 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速
这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...
- BERT实战——基于Keras
1.keras_bert 和 kert4keras keras_bert 是 CyberZHG 大佬封装好了Keras版的Bert,可以直接调用官方发布的预训练权重. github:https://g ...
- 基于Deep Learning 的视频识别方法概览
深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会 ...
随机推荐
- 云网络智慧课堂-Qt程序代码开发规范
序言: 编程规范可以提升代码可读性,提高可维护性. 目录: 一.命名规范 二.内存管理规范 三.函数方法规范 四.控制语句规范 五.注释规范 六.排版规范 七.版本管理规范 八.界面编程 词义解释:强 ...
- Hystrix 源码解读
转载请注明出处: 1.引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <art ...
- 项目启动一直 DruidDataSource inited,启动很慢
解决方案: 由于在调试过程中,代码中设置了断点,在启动的时候,服务就一直卡住了,当关闭断点,重新启动就ok了.
- 09-Verilog-并发线程
Verilog-线程 并发线程 verilog和C语言有一个最大的不同就是并发性 并发--同时进行的过程 module tb_test; int a; initial begin a = 1; a = ...
- Laravel - 创建项目
1,创建目录 ( 路径不要带有中文 ) 2,进入目录,执行下列命令 composer create-project --prefer-dist laravel/laravel project
- [转帖]KVM调整磁盘大小
https://www.jianshu.com/p/5ca598424eb9 一台win10的虚拟机磁盘空间不足了,需要调整磁盘的大小.上网搜索KVM调整磁盘大小,结果得出的博客都说只有raw格式的能 ...
- [转帖]oracle 11g 分区表创建(自动按年、月、日分区)
https://www.cnblogs.com/yuxiaole/p/9809294.html 前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G ...
- [转帖]手摸手搭建简单的jmeter+influxdb+grafana性能监控平台
我安装的机器是阿里云的centos8机器,其他的系统暂未验证 1.安装influxdb influxdb 下载地址https://portal.influxdata.com/downloads/,也可 ...
- [转帖]金仓数据库KingbaseES 数据库参数优化
目录 一.数据库应用类型 二.主要参数 max_connections shared_buffers effective_cache_size maintenance_work_mem checkpo ...
- [转帖]基本系统调用性能lmbench测试方法和下载
简介 Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具.一般来说,它衡量两个关键特征:反应时间和带宽. Lmbench旨在使系统开发者深入了解关键操作 ...