運用 Python 處理 Amazon 評論的情感分析 NLP — Naive Bayes, TF-IDF

Elaine Yang
6 min readJun 29, 2021

--

Amazon E-commerce是一個在線購物網站,現在為世界各地的數百萬人提供服務。亞馬遜提供了超過 34,000 條消費者對 Kindle、Fire TV Stick 等亞馬遜品牌產品的評論。

本系列概述:

Task 1:

Text Preprocessing: NLTK + WordNet(資料介紹及前處理-前篇)

Task 2:

Convert the reviews in TF-IDF score and Run multinomial Naive Bayes classifier(資料向量轉換及 Baseline Model -本篇)

Task 3:

Select model : Random Forest, XGBoost, LSTM

Task 4:

Tackle Class Imbalance Problem by oversampling or undersampling

Multinomial Naive Bayes:

首先我們先做貝氏分類器(Naive Bayes)為一個 Baseline Model,若連續型資料我們會使用高斯貝氏分類,而分類的離散資料問題我們採用的是多項式貝氏分類器。在上述的文字處理前和處理後的資料,套用多項式貝氏分類器後,準確率分別來到了 0.937 及 0.94。

資料尚未前處理的準確率 Accuracy:0.937

資料處理後的準確率 Accuracy:0.94

資料的前處理的過程可以參考前篇 《運用 Python 處理Amazon評論的情感分析NLP — 資料前處理(Pre-Processing)》以及本次加入貝氏分類器的代碼實作如下:

資料前處理及貝氏分類過程

由下圖的 Confusion Matrix 和 f1-score(如圖一),可以看出,模型在Neutral 和 Negative 完全沒有抓出任何一筆資料,並且由 f1-score 來平衡演算法的精確度,同時考量精確率(precision)和召回率(recall),而 f1-score 在 Neutral 和 Negative 都為 0,可以看出資料全部猜 Positive,準確率(Accuracy)也可以高達 0.94,因此貝氏分類的結果只能做為 Baseline Model,我們更需要觀測 Confusion Matrix 的值和 f1-score 值來綜合衡量模型的好壞。(後續我們會用 Random Forest, XGBoost, LSTM 來 trian 模型)

透過 Confusion Matrix 可以檢測實際預測出來的三類別情形如下:

圖一:紅框為後續重點關注數值

轉換文字為 TF-IDF score:

利用 TF-IDF 來分析重要單詞的頻率,簡單來說這個算法就是計算在每一則評論(文本)中最高頻出現的詞( TF:Term Frequency ),再去換算這些字詞在每一則評論中是否都高頻出現(IDF:Inverted Document Frequency),若都出現那麼其實這些字詞不重要。而將 TF 的值和 IDF 的值相乘,就可以得出我們的 TF-IDF score,並且可以從這個值看出對應的字詞對於文本的關鍵重要程度。

TF-IDF 的實際計算例子可以參考下圖:

資料來源:簡書 安琪拉的小迷妹

我們可以挑出重要的字詞特徵再轉成向量,後續餵進其他分類器,而我們找出 TF-IDF score 值最高的前 400 項特徵,實際操作如下:

# TFIDF# train
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
import pickle
tv = TfidfVectorizer(
ngram_range = (1,1), #一次提取多少詞為一個 feature 最多一次提取 1 個 最少 1 個
max_features = 400) #找出最多出現的 400 個詞
analyzer = tv.build_analyzer()title_train = tv.fit_transform(df_title_train['review_title'])pickle.dump(tv.vocabulary_,open("TFIDF_feature_title.pkl","wb"))vocab_titrain = tv.get_feature_names()
dist = np.sum(title_train, axis=0)
checking_train = pd.DataFrame(dist,columns = vocab_titrain)
#checking_train.sort_values(by = 0, axis = 1, ascending = False)
checking_train

這邊做個 pickle 的補充,可以把 pickle 想像成一個存放檔案的容器,在做機器學習時,是很好用的模型存放工具,把訓練好的模型存入,需要讀取時不需重新訓練模型,大幅減少訓練及計算時間。這邊把train 評論的 TF-IDF 字典整個打包存放到 pickle 容器中,在後續 test data 的 TFIDF 要比對的時候再把此字典檔案讀取出來。

# In[] 產生 test data 的 TFIDFtransformer = TfidfTransformer()
loaded_vec = CountVectorizer(vocabulary=pickle.load(open(“TFIDF_feature.pkl”, “rb”)))
X_test = transformer.fit_transform(loaded_vec.fit_transform(test_review)).toarray()

以上,我們就把文字轉成 TF-IDF 的數值向量形式了,接著在下一篇章,我們將介紹 Random Forest, XGBoost, LSTM 等三種分類器的分類過程及效果。

如果你喜歡我的分享,請幫我拍拍手👏👏👏

我會更加努力產出文章的喔,你們的喜歡是我的動力!如果你對我在祕魯做志工(領導力老師)和背包客的故事感興趣,也歡迎來我的粉專看看:

粉專:帶著衝動去旅行,Elaine流浪趣

--

--

Elaine Yang

半導體業雲端數位轉型產品經理。畢業於北京大學計算機技術碩士。曾任職中國美團總部產品經理、微軟亞洲研究院用戶研究員、亞馬遜電商/雲計算商業運營全職實習。關注UI、UX、產品經理、互聯網趨勢,歡迎交流成長!臉書粉專: https://pse.is/RKH42