VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > python入门教程 >
  • 基于keras的文本情感识别

情感识别是一个典型的分类问题,可以使用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 文件内容如下:

 View Code

 

使用方法

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

出  处:https://www.cnblogs.com/MikeZhang/p/KerasEmotionRecognition20210331.html



相关教程