Chinese-sentiment-analysis-with-Doc2Vec
簡介
中文語料的情感分析基本步驟如下:
- 爬取相關的語料或者下載相關語料(本文使用了對于賓館評價的相關語料作為例子)
- 將語料進行預處理并分詞
- 用某種量化的表達形式來對語料進行數(shù)字化處理
- 基于監(jiān)督學習的分類器訓練
開發(fā)環(huán)境Python-v3(3.6)
:
gensim==3.0.1
jieba==0.39
scikit-learn==0.19.1
tensorflow==1.2.1
numpy==1.13.1+mkl
示例代碼參考Chinese-sentiment-analysis-with-Doc2Vec
https://github.com/lybroman/Chinese-sentiment-analysis-with-Doc2Vec
在repo中有兩個zip文件分別為train.zip
和test.zip
數(shù)據(jù)瓣蛀,當然你也可以直接在加載語料時將部分數(shù)據(jù)用作測試數(shù)據(jù)(詳見后文)。
數(shù)據(jù)預處理(preprocess.py)
- zip數(shù)據(jù)中為大量的txt文檔进苍,每一個的后綴是評分腹纳,例如
72_1380108_2006-11-9_1.0.txt
掖棉,那么該評分為1.0分(其實就是差評啦)。我們需要做的是將所有評分劃分為1、2拗胜、3灵汪、4,5檔檀训,顧名思義就是評價由到壞到好。這里用了一些簡單的字符串處理來獲取分數(shù)并使用round
函數(shù)來對分數(shù)取整享言。 - 將不同的評分txt按folder分類放好
分詞(words_segment.py)
- 分詞是通過第三方的jieba實現(xiàn)的峻凫。
- 分詞之前需要做一些簡單的處理,比如過濾一些不感興趣的字符担锤。
filter_chars = "\r\n蔚晨,肛循。铭腕;多糠!,.:;:、"
trans_dict = dict.fromkeys((ord(_) for _ in filter_chars), '')
line = line.translate(trans_dict)
- 將分完詞的語料按照分數(shù)歸并到同一個文本做為訓練做準備
文本向量化模型(main.py:step 1-3)
- 這里只要使用到了
gensim.models.doc2vec
夹孔,該模塊提供了將不定長的文本映射到維度大小固定的向量的功能被盈。這對于計算相似度還是用作后續(xù)的CNN分類器訓練(后續(xù)有時間的話會實現(xiàn)基于TensorFlow的分類器)都是十分有幫助的。 - 具體的原理可以參考distributed-representations-of-sentences-and-documents
- gensim doc2vec
- 本文旨在通過簡單的示例介紹如何通過訓練模型來自動判斷某個新的輸入評價是好評(5分)還是差評(1分)搭伤,所以在后續(xù)的代碼中,使用的樣本就來自于這兩類樣本的集合(后續(xù)有時間的話會繼續(xù)實現(xiàn)多分類問題)
訓練分類器(main.py:step 4-5)
- 這里使用了
sklearn
中的分類器(LR身堡、SVM、決策樹等等拍鲤,最新版本的sklearn還提供了NN的實現(xiàn))贴谎。具體參考scikit-learn汞扎。 - 數(shù)據(jù)的標記十分簡單,將5分的訓練集標記為1擅这,1分的訓練集標記為0即可(如果實現(xiàn)多分類,按照分數(shù)標記即可痹扇。)
- 其中我把20%的訓練集抽出作為測試數(shù)據(jù):
train, test, train_label, test_label = ms.train_test_split(
train_arrays, train_labels, test_size=0.2)
- 最后進行驗證,一般>0.6就認為是一個有不錯預測能力的模型了
新樣本預測(prediction.py)
- 通過加載之前訓練的model和分類器對測試樣本進行預測
- 同時記錄了每一個測試樣本最近似的訓練樣本
后續(xù)工作
實現(xiàn)多分類
基于TF的CNN分類器