1. 程式人生 > >NLP實戰|如何用280多萬條豆瓣影評預測電影評分?

NLP實戰|如何用280多萬條豆瓣影評預測電影評分?

 

 

為了預測電影評分,我們收集了豆瓣電影網站上2.8萬名使用者對5萬多部電影的280萬條評論...

 

真實目的,其實是為了讓大家能夠通過這次的教程,更加了解自然語言處理。

 

所以,使用電影評論來預測電影評分,到底需要分幾步?

 

 

 專案簡介 

本專案只使用電影評論來預測電影評分。

由於豆瓣電影網站的評分為1-5的整數,因此將該問題轉化為5個輸出類別的分類問題。

 

 資料集 

此資料集包含豆瓣電影網站上2.8萬名使用者對5萬多部電影的280萬條評論。資料共有6列,包括使用者名稱,電影名,時間戳,電影評論,電影評分和評論被點贊數。

具體可在https://www.flyai.com 專案中查詢

 

 專案過程 

資料處理

搭建神經網路

定義損失函式,選擇優化器

訓練神經網路並儲存最優的網路

 

 資料處理 

為了將電影評論輸入到神經網路中,需要將原始的評論句子進行分詞,然後將詞轉化為詞向量。本專案使用了清華大學開發的thulac分詞器。要使用此分詞器,首先使用pip安裝thulac庫:

在python中建立分詞器例項,設定分詞器模式為僅分詞,對每條評論 (comment) 進行分詞:

 

將分好的詞與預處理的詞嵌入模型 (vocab) 比對,並獲得詞向量,詞向量維度為200。

 

為了使每個batch的輸入大小一致,需要對句子長度進行統一,設定句子最大長度為20,若句子長度超過20個詞則保留前20個詞,否則將空餘的詞補零。

 

輸入的評分 (rating) 為1-5的整型數字,而pytorch進行分類時,類別索引必須從0開始,因此對輸入評分做簡單處理:

 

 搭建神經網路 

本專案使用了LSTM + 全連線層 來解決句子的分類問題。在PyTorch中搭建LSTM網路非常簡單,只需要定義輸入詞向量維度,LSTM隱單元個數,LSTM層數即可。在LSTM層後,使用兩個全連線層將LSTM輸出的所有整個句子對映到5個類別上:

 

 定義損失函式和優化 

由於此專案為分類問題,使用CrossEntropy交叉熵作為損失函式,並選用Adam優化器。設定學習速率為0.001。

 

 訓練神經網路並儲存最優的網路 

為了讓程式碼能夠同時在cpu和gpu上執行,首先判斷gpu是否可用,並由此設定pytorch計算所使用的硬體:

 

完整的訓練過程如下所示,當訓練集上準確率高於當前最高的準確率時,儲存當前網路模型:

 

其中,eval()的作用為計算訓練集上的準確率:

 

 

 結語 

本專案基於PyTorch框架,完成了根據漢語文字評論預測評分的任務。其中使用的網路簡單,高效,適合NLP初學者進行學習。

 

獲取更多相關專案程式碼 請訪問:https://www.flyai.com

 

— END —

完整程式碼請訪問:https://www.flyai.com/d/MovieRatings