20行程式碼實現電影評論情感分析
背景
情感分析有很多的應用場景,比如做一個電商網站,賣家需要時刻關心使用者對於商品的評論是否是正面的。再比如做一個電影的宣傳和策劃,電影在鍵盤俠們中的口碑也至關重要。網際網路上關於任何一個事件或物品都有可能產生成千上萬的文字評論,如何定義每一個文字的情緒是正面或是負面的,是一個很有挑戰的事情。挑戰體現在以下幾個方面,區別於結構化資料,評論資料的長短不一,很難限定到固定的維度。另外很難通過某個詞判斷使用者的情緒,舉個極端的例子,fu*k通常被認為是貶義詞,但是如果一條評論是“傲海 is fu*kinghandsome”,那麼其實就是一個正向的意義。本文我要使用IMDB資料集,通過20行的Tensorflow程式碼實現一個電影評論預測模型,準確率可以超過百分之九十五,裡面涉及到一些詞袋模型以及embedding的概念,這些我等下一篇文章再講,這一次我們就講實踐。
資料
介紹下本文用到的訓練資料IMDB,完全開源的一個電影評價資料集,有好幾萬條真實的電影評論資料。
每一個數據都被儲存為txt檔案存放,其中pos資料夾就存放正面評論的資料,neg資料夾存放負面情緒的資料。這些資料可以通過一些簡單的程式碼提取出來,並且標記。資料集下載地址:http://ai.stanford.edu/~amaas/data/sentiment/
簡單來說,在資料預處理階段,需要把這些文字按照正向和負向打標,並且把文字向量化,比如“Aohai is fuc*inggentle”這種話要怎麼變成數值向量,下一篇文章會具體說明。
程式碼
程式碼其實不止20行,但是真正建模並訓練的就是隻有20行,簡單介紹下哈:
trainX = pad_sequences(trainX, maxlen=100, value=0.) testX = pad_sequences(testX, maxlen=100, value=0.) # Converting labels to binary vectors trainY = to_categorical(trainY, nb_classes=2) testY = to_categorical(testY, nb_classes=2) # Network building net = tflearn.input_data([None, 100]) net = tflearn.embedding(net, input_dim=vocabulary_size, output_dim=128) net = tflearn.lstm(net, 128, dropout=0.8) net = tflearn.fully_connected(net, 2, activation='softmax') net = tflearn.regression(net, optimizer='adam', learning_rate=0.001, loss='categorical_crossentropy') # Training model = tflearn.DNN(net, tensorboard_verbose=0) model.fit(trainX, trainY,n_epoch=1, validation_set=(testX, testY), show_metric=True, batch_size=32) predictions = model.predict(trainX) print(predictions)
前4行應該比較容易懂
- pad_sequences把輸入的詞向量轉成矩陣,不夠的用0補
- to_categorical:把目標列分成0和1,0是負樣本,1是正樣本
- 用的是Tensorflow的high level的庫tflearn去構建神經網路計算圖
- embedding下次講,大家可以理解為把每個詞表示成向量
- 用的是lstm模型,好處就是這種網路結構比較適合做上下文關聯的分析,適合NLP的場景
- full connect加regression,分類的標準組合
- 然後fit一下,開啟訓練,n_epoch是迭代的輪數,為了快速出結果我就寫的1
- 利用模型對訓練資料做一次predict,大家也可以換成自己的資料
執行結果
程式碼層級是這樣的:
執行檔案emotional.py和下載的IMDB資料放到同一級目錄,train資料夾下有pos和neg兩個資料夾,分別存放正向和負向的評論~
算了,大家直接clone我的專案,我放一些資料在裡面,直接執行:
python emotional.py就行
需要安裝Tensorflow和tflearn這兩個庫,當然也可以用阿里雲機器學習PAI的notebook,這樣就不用安裝了,下圖就是我用PAI跑出來的截圖。
執行結果:
epoch表示的是迭代次數,程式碼裡只設置了迭代一次。最下面的這一串矩陣一共有兩列,每一行對應一個需要預測的評論資料,每一行的第一列表示這個評論屬於負向的概率,每一行的第二列表示這個評論屬於正向的概率。
程式碼地址
與網上的案例不同,其它案例都缺少自定義資料集的功能,限制在了IMDB,使用本文的code可以任意修改預測資料集
參考:http://blog.csdn.net/aliceyangxi1987/article/details/76176746