流程描述
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 获得提取码。