4

基于keras的文本情感识别

 3 years ago
source link: https://www.cnblogs.com/MikeZhang/p/KerasEmotionRecognition20210331.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
基于keras的文本情感识别 - Mike_Zhang - 博客园
情感识别是一个典型的分类问题,可以使用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 文件内容如下:

ContractedBlock.gifExpandedBlockStart.gif

View Code

1、 激活虚拟环境

source py36env/bin/activate

2、 准备数据

准备用于训练及测试的文本数据,可以直接使用百度情感分析的样本数据。

3、 启动训练程序

比如: python cnn_bdt1.py

启动使用cnn模型的训练及测试流程。

分词的情况决定最终的测试结果,以下结果基于百度情感分析里面的样本数据:

cnn_lstm

fasttext

文件说明如下:

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 获得提取码。 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK