情感識別是一個典型的分類問題,可以使用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.2View 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=https://www.cnblogs.com/MikeZhang/p/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 獲得提取碼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271832.html
標籤:Python
上一篇:Java入門環境的搭建
