[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):
近幾年隨機森林非常受到青睞,被運用在大量的機器學習應用中,它的效能、預測能力都很強,而且非常容易使用,另外隨機森林還能更去觀察每一個特徵的重要度。直覺來說,你可以把隨機森林當作是多個決策樹組合而成的
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) 中最常使用的模型
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次,感謝!===