[Python機器學習]-自動判斷留言正負評(運用BERT model)with Colab pro GPU

本篇將以Google我的商家留言為範例.會簡單帶過文字分析的演進與工具,從最傳統運用詞頻矩陣到機器學習的方式,再到NLP(自然語言處理)的方式.如對各項工具有興趣,可以在google搜尋到非常多相關文章,本篇重點是在如何使用BERT模型來做Google我的商家的正負評猜測(準確度95%以上)

===============開始===============

全世界的許多資料科學家或是業餘愛好者(業餘不代表不厲害).花許多精力投入在如何做更精準的文字語意分析,文字情感分析.

而大家或許聽過,中文是全世界最難懂的語言(之一),這點對人類來說是正確的.對機器學習的領域也是如此.中文的分析是全世界(主要可能在華人圈)機器學習專家一直想要攻破的領域.

文字探勘可以分兩部分:文字分群與語意情感分析.文字分群可用於 客戶屬性分群,商品推薦,假新聞偵測,或者是相似新聞文章推薦等.情感分析可以針對文字的語意,作出合適的反應,或猜測.

目前文字探勘的幾種工具:

1.1 詞頻矩陣法

把文字運用Term Frequency — Inverse Document Frequency (TF-IDF)建立成詞頻矩陣,再用cosine_distances(餘弦距離)或是cosine_similarity(餘弦相似度) 來判斷兩段文字的關聯.

1.2 k-means clustering分群與 Louvain 演算法分群法:

從詞頻矩陣進一步去找出各詞之間的關係,並分類

1.3LogisticRegression(羅吉斯迴歸 或稱 邏輯迴歸)法

線性回歸是用來預測一個連續的值,羅吉斯回歸是用來分類。線性回歸輸出是一個連續的實數,但羅吉斯回歸就是用線性回歸的輸出來判斷這個資料屬不屬於target(二分類問題: target和non-target)

1.4決策樹:

有別於LogisticRegression是一條線劃二分(target, or non-target),決策樹可以劃分多分類,決策數是一個解釋性能力很強的模型。

1.5隨機森林(Random Forest):

近幾年隨機森林非常受到青睞,被運用在大量的機器學習應用中,它的效能、預測能力都很強,而且非常容易使用,另外隨機森林還能更去觀察每一個特徵的重要度。直覺來說,你可以把隨機森林當作是多個決策樹組合而成的

Source

1.6貝式分類法:

貝氏分類法是以貝氏定理(Bayes’ theorem)為基礎。 單純貝氏分類法希望能透過機率的計算,用以判斷未知類別的資料應該屬於那一個類別。 透過貝氏定理的計算,我們可以知道在已知的資料下哪個目標的發生機率最大,由此去做分類。在資料量夠多的情況下,單純貝氏分類器是一個相當好用的模型,簡單且有效,又不容易產生過度擬和(overfit)。

1.7支援向量機(Support Vector Machine):

SVM是一種監督式的學習方法,用統計風險最小化的原則來估計一個分類的超平面(hyperplane),其基礎的概念非常簡單,就是找到一個決策邊界(decision boundary)讓兩類之間的邊界(margins)最大化,使其可以完美區隔開來。 簡單說就是把2D資料用3D角度去看,用一個平面去把資料切成二群

以上算是屬於ML(MachineLearning機器學習)的範疇,接著 以下屬於NLP(自然語言處理 ,Natural Language Processing)範疇.而NLP主要就是運用語言模型 Language Model(LM)來套討文字間關係.語言模型 Language Model(LM):

基本上,LM就是在研究與探討一個字詞,產生字詞的詞向量後,大量運算,預測其他可能會在那個字詞附近出現的詞彙的機率

2.1 Gensim方式+Word2Vec:

2.2 RNN遞歸神經網路神經方式:

LSTM,LSTM是目前RNN (Recurrent Neural Network) 中最常使用的模型

可參考這個頁面:讓 AI 寫點金庸:如何用 TensorFlow 2.0 及 TensorFlow.js 寫天龍八部

2.3 BERT:

最後今天的主角,BERT是目前當紅,準確度也很高的模型!

BERT 全名為 Bidirectional Encoder Representations from Transformers,是 2019年Google 以無監督的方式利用大量無標註文本「煉成」的語言代表模型,其架構為 Transformer 中的 Encoder。BERT 提供了一個 pre-trained 的 fine-tuning based language representation。是可以理解上下文的語言模型.

現在我們就直接進入主題吧!

第一步:

首先,讀入所有google評論資料.(延續上一篇:[Python網路爬蟲]運用API 抓取Google我的商家評論

接著我們要把分數1~5,轉換成好評跟壞評, 4,5分算好評,1,2分 歸類壞評

總共有上萬筆評論資料

畫個Bar圖看一下分佈:正評數遠大於負評

google['評等'].value_counts().plot(kind='bar')

正確做法應該是把正評跟負評數量平衡,才能得到最佳的模型效果.

不過我測試過,直接拿一萬筆分析的結果,正評/負評跟整體準確率差不多.但是負評準確率確達85% (如果拿一樣數量的正負評去分析,負評準確率只有78%)

===============補充內容==================

但為了教學示範,放上正評與負評取數量一樣的方式,

bad_df = google[google['status'] ==0]
bad_df.shape

可以看到上萬評論裡,負評只佔1025則,這時我們一樣隨機從正評取出1025則:

good_df = google[   google['status'] ==1]
good_df = good_df.sample(n=1025)

最後我們把正負評論整合一起:

google = pd.concat([good_df,bad_df],ignore_index=True)
google.shape

=============補充內容結束===============

現在把資料都準備好了後,可以開始運用模型分析了:

第二步:

我們先把資料分為測試跟訓練集兩部分

(訓練集就是拿來給模型學習用,等到學習好了,就拿測試集來測試效果準確度)

一般來說會用7:3或者8:2, 這邊用8:2 .訓練集佔80%,測試集佔20%

from sklearn.model_selection import train_test_splittrain_df, test_df = train_test_split(google, test_size = 0.2, random_state = 927)

第三步:

導入想要使用的模型, 這邊是用BERT 模型的實現套件simpletransformers)

from simpletransformers.classification import ClassificationModel#?ClassificationModelmodel = ClassificationModel('bert', 'hfl/chinese-bert-wwm')
model.train_model(train_df, args = {'overwrite_output_dir': True})

我們用“ hfl/chinese-bert-wwm-ext’ 這個模型參數.也可以用“ hfl/chinese-bert-wwm” 或是 “ hfl/chinese-bert” , 可以自行實驗比較差異

接著就是讓電腦去跑training了,因為我使用Macbook pro with AMD graphic card,而Tensorflow沒有支援AMD GPU, 所以我用Google Colab pro 來運算.這次分配到的GPU是 Telsa P100(有時可以分配到頂規V100)

運算時間大概2~3分,如果沒有用GPU運算,單用CPU時間可能要幾十分鐘~一小時

訓練完model,我們把測試資料集放進去測試

result, model_output, wrong_predictions = model.eval_model(test_df)
result

從上方的result中可以看出confusion matrix為:

[
TruePostive, FalsePostive
FalseNegative, True Negative
]
#1901 73
#18 119

#整體預測準確率:

(1901+119)/(1901+73+18+119) = 0.95262

95%的準確率,有沒有覺得很神奇(文章一開始提到的其他模型,準確率大概落在70~85%內)

好評跟負評分別準確率:

希望本篇內容對大家有幫助,歡迎分享你的想法交流!

===喜歡這篇文章的話,請在文章下方按『拍手』,長按可以拍50次,感謝!===

--

--

行銷科技與資料科學研究室-Foresight Martech&Data Science Studio

Marteck 行銷科技專家,商業分析與決策科學專家,資料分析師,大數據與AI機器學習.曾任美國 University of Colorado Denver研究員,與丹佛市政府執行過交通大數據分析專案,與Tesla特斯拉共同執行過專案 .遊歷世界100多個城市