運用 Python 處理 Amazon 評論的情感分析 NLP - 資料前處理(Pre-Processing)

Elaine Yang
7 min readJun 28, 2021

--

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

Amazon 官網評論

本系列概述:

Task 1:

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

Task 2:

Convert the reviews in TF-IDF score and Run multinomial Naive Bayes classifier

Task 3:

Select model : Random Forest, XGBoost, LSTM

Task 4:

Tackle Class Imbalance Problem by oversampling or undersampling

題目描述:

Amazon E-commerce是一個在線購物網站,現在為世界各地的數百萬人提供服務。亞馬遜提供了超過 34,000 條消費者對 Kindle、Fire TV Stick 等亞馬遜品牌產品的評論。 該數據集具有品牌、類別、主要類別、評論.標題、評論.文本和情緒等屬性。 Sentiment 是一個分類變量,分為“Positive”、“Negative”和“Neutral”三個級別。對於給定的未見數據,需要預測情緒。 我們需要根據多個功能和評論文本來預測購買的情緒或滿意度。

題目來源:

本次題目來自於知名的數據建模和數據分析競賽平台-Kaggle上的資料集,資料集的訓練資料及測試資料如下。

EDA:

首先我們要先觀察現有數據,觀察評論中為 positive, negative, neutral 三種分類。並且檢查是否有分類不平衡的問題。要怎麼檢查呢?首先我們可以先用使用 data.groupby 來排序資料,並用Python 函數 size 來計算資料筆數。

data = pd.read_csv(“train_data.csv”)sentiment = data.groupby(“sentiment”).size()

結果如下:

結論:

我們可以看到數據中 positive 的評論量幾乎佔了94%,確實有分類不平衡(Data Imblance)的問題。

資料前處理:

為了讓計算機更好的理解資料及運算,這邊我們先做資料前處理(Data Pre-Processing)。

  1. 欄位的數值轉換部分,先 Drop 掉空值。
  2. 把欄位名“name” 做 one hot encode,因為最後可能會在同品類的不同商品中,尋找正評最多的商品,因此“name”是有用的特徵,但為了方便計算機計算,我們會把類別 mapping 轉換成一個整數值,而針對有序的資料我們會做 label encode,但商品名稱是無序的離散資料,所以我們這邊使用 one hot encode
  3. 把欄位名“brand”資料數值都是 Amazon,沒有差異可以比較,因此這邊remove 掉。
  4. 把欄位名“Categories”和欄位名“Primary Categories”一起觀察,發現“Primary Categories”是“Categories” 擷取出關鍵字,因此我們把“Categories” remove 掉,總共只有四類,因此把 Primary Categories 再做 one hot encode,方便計算機計算實際操作如下:
dummy_train = pd.get_dummies(train_data_copy.primaryCategories, prefix= ‘cate’)
dummy_test = pd.get_dummies(test_data_copy.primaryCategories, prefix= ‘cate’)
  1. 把欄位“reviews.date”依春夏秋冬四季做 label encode。
  2. 去除掉 Stop Words:針對消費者的評論內容,是我們本次分析最重要的部分,那麼 NLP 文本的處理上,我們從 nltk 下載 stop word 的字典並進行移除,因為這些字詞可能出現的非常頻繁,但卻不是評論要分析的重點,譬如說“a”, “the”, “is”, “are”, “in”, “on”這些詞,這邊的作法如下:
# remove stop word
import nltk.corpus
nltk.download(‘stopwords’)
from nltk.corpus import stopwords
stop = stopwords.words(‘english’)

7. 對欄位 review.text / reviews.title 中文本做詞性的還原,要做這件事首先我們要把一句話中的每一個字詞獨立出來,這邊使用 Word Tokenize,並且再使用 Lemmatizer 把每一個字詞轉換成最原始的型態。比如下圖所示:”purchased” 被轉換成原型 ”purchase”,而 ”even off sale” 被轉換成 ”even sale”, “off” 被當成無用的字詞而被取出。

8. 最後就是我們最重要的 “sentiment”欄位,我們把所有評論的sentiment”轉換為“Positive” 為 1(正向評論),”Neutral” 為 0(中性評論),”Negative” 為 -1(負向評論),這邊作法如下:

repro_train[“sentiment”] = prepro_train[“sentiment”].map({“Positive”:1,”Neutral”:0,”Negative”:-1})
prepro_test[“sentiment”] = prepro_test[“sentiment”].map({“Positive”:1,”Neutral”:0,”Negative”:-1})

下篇介紹:

以上,就是資料前處理的過程,把所有文本轉換成方便運算的數值型資料後,為了要讓評論分類,我們會使用文本轉向量的方式,把資料餵進我們的分類器。下一篇,《運用 Python 處理 Amazon 評論的情感分析 NLP — Naive Bayes, TF-IDF 》就來介紹基於統計的文字加權演算法 TF-IDF 以及我們這次分析的 Baseline Model Naive Bayes 分類器。

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

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

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

--

--

Elaine Yang

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