數據分析與挖掘實戰案例-電商產品評論數據情感分析
文章目錄
- 數據分析與挖掘實戰案例-電商產品評論數據情感分析
- 1. 背景與挖掘目標
- 2. 分析方法與過程
- 2.1 評論預處理
- 1. 評論去重
- 2. 數據清洗
- 2.2 評論分詞
- 1. 分詞、詞性標注、去除停用詞
- 2. 提取含名詞的評論
- 3. 繪制詞云查看分詞效果
- 3. 模型構建
- 3.1 評論數據情感傾向分析
- 1. 匹配感情詞
- 2. 修正情感傾向
- 3. 查看情感分析效果
- 3.2 使用LDA模型進行主題分析
- 1. 了解LDA主題模型
- 2. 尋找最有主題數
- 3. 評論主題分析結果
1. 背景與挖掘目標
隨著電子商務的迅速發展和網絡購物的流行,人們對于網絡購物的需求變得越來越高,也給電商企業帶來巨大的發展機遇,與此同時,這種需求也推動了更多電商企業的崛起,引發了激烈的競爭。而在這種激烈競爭的大背景下,除了提高商品質量、壓低價格外,了解更多消費者的心聲對電商企業來說也變得越來越有必要。其中非常重要的方式就是對消費者的評論文本數據進行內在信息的分析。
評論信息中蘊含著消費者對特定產品和服務的主觀感受,反應了人們的態度、立場和意見,具有非常寶貴的研宄價值。一方面,對企業來說,企業需要根據海量的評論文本數據去更好的了解用戶的個人喜好,從而提高產品質量,改善服務,獲取市場上的競爭優勢。另一方面,消費者需要在沒有看到真正的產品實體、做出購買決策之前,根據其他購物者的評論了解產品的質量、性價比等信息,為購物抉擇提供參考依據。
目標:
(1) 對京東商城中美的電熱水器的評論進行情感分析。
(2) 從評論文本中挖掘出用戶的需求、意見,購買原因以及產品的優缺點。
(3) 根據模型結果給出改善產品的建議。
2. 分析方法與過程
電商產品評論數據情感分析,主要步驟如下。
(1) 利用Python對京東商城中美的電熱水器的評論進行爬取。
(2) 利用Python爬取到的京東商城中美的電熱水器的評論數據,對評論文本數據進行數據清洗、分詞、停用詞過濾等操作。
(3) 對預處理后的數據進行情感分析,將評論文本數據按照情感傾向分為正面評論數據(好評)和負面評論數據(差評)。
(4) 分別對正、負面評價數據進行LDA主題分析,從對應的結果分析文本評論數據中有價值的內容。
2.1 評論預處理
對京東商城中美的熱水器評論數據進行預處理前,需要先對評論數據進行采集。利用Python網絡爬蟲技術對京東商城中美的熱水器評論數據進行采集。由于重點是對電商產品評論數據情感分析,且網絡數據的爬取具有時效性,因此,不再詳細介紹數據的采集過程。以下分析所使用的數據與分析結果。
1. 評論去重
一些電商平臺往往為了避免一些客戶長時間不進行評論,會設置一道程序,如果用戶超過規定的時間仍然沒有做出評論,系統會自動替客戶做出評論,這類數據顯然沒有任何分析價值。
由語言的特點可知,在大多數情況下,不同購買者之間的有價值的評論都不會出現完全重復,如果出現了不同購物者的評論完全重復,這些評論一般都是毫無意義的。這種評論顯然只有最早的評論才有意義(即只有第一條有作用)。
import pandas as pd
import re
import jieba.posseg as psg
import numpy as np# 去重,去除完全重復的數據
reviews = pd.read_csv("../tmp/reviews.csv")
reviews = reviews[['content', 'content_type']].drop_duplicates()
content = reviews['content']
2. 數據清洗
通過人工觀察數據發現,評論中夾雜許多數字與字母,對于挖掘目標而言,這類數據本身沒有實質性幫助。另外,由于該評論文本數據主要圍繞京東商城中美的電熱水器進行評價,其中“京東”“京東商城”“美的”“熱水器”“電熱水器”等詞出現的頻數很大,但是對分析目標并沒有什么作用,因此可以在分詞之前將這些詞去除,對數據進行清洗。
# 去除去除英文、數字等
# 由于評論主要為京東美的電熱水器的評論,因此去除這些詞語
strinfo = re.compile('[0-9a-zA-Z]|京東|美的|電熱水器|熱水器|')
content = content.apply(lambda x: strinfo.sub('', x))
2.2 評論分詞
1. 分詞、詞性標注、去除停用詞
(1) 對評論數據進行分詞
分詞是文本信息處理的基礎環節,是將一個單詞序列切分成一個一個單詞的過程。準確的分詞可以極大的提高計算機對文本信息的是被和理解能力。相反,不準確的分詞將會產生大量的噪聲,嚴重干擾計算機的識別理解能力,并對這些信息的后續處理工作產生較大的影響。
漢語的基本單位是字,由字可以組成詞,由詞可以組成句子,進而由一些句子組成段、節、章、篇。可見,如果需要處理一篇中文語料,從中正確的識別出詞是一件非常基礎且重要的工作。
然而,中文以字為基本書寫單位,詞與詞之間沒有明顯的區分標記。中文分詞的任務就是把中文的序列切分成有意義的詞,即添加合適的詞串使得所形成的詞串反映句子的本意。
(2) 去除停用詞
停用詞(Stop Words),詞典譯為“電腦檢索中的虛字、非檢索用字”。在SEO搜索引擎中,為節省存儲空間和提高搜索效率,搜索引擎在索引頁面或處理搜索請求時會自動忽略某些字或詞,這些字或詞即被稱為停用詞。
停用詞一定程度上相當于過濾詞(Filter Words),區別是過濾詞的范圍更大一些,包含情色、政治等敏感信息的關鍵詞都會被視做過濾詞加以處理,停用詞本身則沒有這個限制。通常意義上,停用詞大致可分為如下兩類。
一類是使用十分廣泛,甚至是過于頻繁的一些單詞。比如英的“i”“is”“what”,中文的“我”“就”等,這些詞幾乎在每個文檔上均會出現,查詢這樣的詞無法保證搜索引擎能夠給出真正相關的搜索結果,因此無法縮小搜索范圍來提高搜索結果的準確性,同時還會降低搜索的效率。因此,在搜索的時候,Google和百度等搜索引擎會忽略掉特定的常用詞,如果使用了太多的停用詞,有可能無法得到精確的結果,甚至可能得到大量毫不相關的搜索結果。
另一類是文本中出現頻率很高,但實際意義又不大的詞。這一類詞主要包括了語氣助詞、副詞、介詞、連詞等,通常自身并無明確意義,只有將其放入一個完整的句子中才有一定作用的詞語。常見的有“的”“在”“和”“接著”等,例如“泰迪教育研究院是最好的大數據知識傳播機構之一”這句話中的“是”“的”就是兩個停用詞。
# 分詞
worker = lambda s: [(x.word, x.flag) for x in psg.cut(s)] # 自定義簡單分詞函數
seg_word = content.apply(worker) # 將詞語轉為數據框形式,一列是詞,一列是詞語所在的句子ID,最后一列是詞語在該句子的位置
n_word = seg_word.apply(lambda x: len(x)) # 每一評論中詞的個數n_content = [[x+1]*y for x,y in zip(list(seg_word.index), list(n_word))]
index_content = sum(n_content, []) # 將嵌套的列表展開,作為詞所在評論的idseg_word = sum(seg_word, [])
word = [x[0] for x in seg_word] # 詞nature = [x[1] for x in seg_word] # 詞性content_type = [[x]*y for x,y in zip(list(reviews['content_type']), list(n_word))]
content_type = sum(content_type, []) # 評論類型result = pd.DataFrame({"index_content":index_content, "word":word,"nature":nature,"content_type":content_type}) # 刪除標點符號
result = result[result['nature'] != 'x'] # x表示標點符號# 刪除停用詞
stop_path = open("../data/stoplist.txt", 'r',encoding='UTF-8')
stop = stop_path.readlines()
stop = [x.replace('\n', '') for x in stop]
word = list(set(word) - set(stop))
result = result[result['word'].isin(word)]# 構造各詞在對應評論的位置列
n_word = list(result.groupby(by = ['index_content'])['index_content'].count())
index_word = [list(np.arange(0, y)) for y in n_word]
index_word = sum(index_word, []) # 表示詞語在改評論的位置# 合并評論id,評論中詞的id,詞,詞性,評論類型
result['index_word'] = index_word
2. 提取含名詞的評論
由于目標是對產品特征的優缺點進行分析,類似“不錯,很好的產品”,“很不錯,繼續支持”等評論雖然表達了對產品的情感傾向,但是實際上無法根據這些評論提取出哪些產品特征是用戶滿意的。評論中只有出現明確的名詞,如機構團體及其它專有名詞時,評論才有意義,因此需要對分詞后的詞語進行詞性標注。之后再根據詞性將含有名詞類的評論提取出來。
jieba關于詞典詞性標記,采用ICTCLAS的標記方法。ICTCLAS漢語詞性標注集如下表所示。
3. 繪制詞云查看分詞效果
進行數據預處理后,可繪制詞云查看分詞效果,詞云會將文本中出現頻率較高的“關鍵詞”予以視覺上的突出。
首先需要對詞語進行詞頻統計,將詞頻按照降序排序,選擇前100個詞,使用wordcloud模塊中的WordCloud繪制詞云,查看分詞效果。
import matplotlib.pyplot as plt
from wordcloud import WordCloudfrequencies = result.groupby(by = ['word'])['word'].count()
frequencies = frequencies.sort_values(ascending = False)
backgroud_Image=plt.imread('../data/pl.jpg')
wordcloud = WordCloud(font_path="STZHONGS.ttf",max_words=100,background_color='white',mask=backgroud_Image)
my_wordcloud = wordcloud.fit_words(frequencies)
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()# 將結果寫出
result.to_csv("../tmp/word.csv", index = False, encoding = 'utf-8')
由上圖可看出,對評論數據進行預處理后,分詞效果較為符合預期。其中“安裝”“師傅”“售后”“物流”,“服務”等詞出現頻率較高,因此可以初步判斷用戶對產品這幾個方面比較重視。
3. 模型構建
3.1 評論數據情感傾向分析
1. 匹配感情詞
情感傾向也稱為情感極性。在某商品評論中,可以理解為用戶對該商品表達自身觀點所持的態度是支持、反對還是中立,即通常所指的正面情感、負面情感、中性情感。由于本案例主要是對產品的優缺點進行分析,因此只要確定用戶評論信息中的情感傾向方向分析即可,不需要分析每一評論的情感程度。
對評論情感傾向進行分析首先對情感詞進行匹配,主要采用詞典匹配的方法,使用的情感詞表是2007年10月22日知網發布“情感分析用詞語集(beta版)”,主要使用“中文正面評價”詞表、“中文負面評價”“中文正面情感”“中文負面情感”詞表。將“中文正面評論”“中文正面情感”兩個詞表合并,并給每個詞語賦予初始權重1,作為正面評論情感詞表。將“中文負面評價”“中文負面情感”兩個詞表合并,并給每個詞語賦予初始權重-1,作為負面評論情感詞表。
import pandas as pd
import numpy as np
word = pd.read_csv("../tmp/word.csv")# 讀入正面、負面情感評價詞
pos_comment = pd.read_csv("../data/正面評價詞語(中文).txt", header=None,sep="\n", encoding = 'utf-8', engine='python')
neg_comment = pd.read_csv("../data/負面評價詞語(中文).txt", header=None,sep="\n", encoding = 'utf-8', engine='python')
pos_emotion = pd.read_csv("../data/正面情感詞語(中文).txt", header=None,sep="\n", encoding = 'utf-8', engine='python')
neg_emotion = pd.read_csv("../data/負面情感詞語(中文).txt", header=None,sep="\n", encoding = 'utf-8', engine='python') # 合并情感詞與評價詞
positive = set(pos_comment.iloc[:,0])|set(pos_emotion.iloc[:,0])
negative = set(neg_comment.iloc[:,0])|set(neg_emotion.iloc[:,0])
intersection = positive&negative # 正負面情感詞表中相同的詞語
positive = list(positive - intersection)
negative = list(negative - intersection)
positive = pd.DataFrame({"word":positive,"weight":[1]*len(positive)})
negative = pd.DataFrame({"word":negative,"weight":[-1]*len(negative)}) posneg = positive.append(negative)# 將分詞結果與正負面情感詞表合并,定位情感詞
data_posneg = posneg.merge(word, left_on = 'word', right_on = 'word', how = 'right')
data_posneg = data_posneg.sort_values(by = ['index_content','index_word'])
2. 修正情感傾向
情感方向修正主要根據情感詞前面2個位置的詞語是否存在否定詞而去判斷情感值的正確與否,由于漢語中存在多重否定現象,即當否定詞出現奇數次時,表示否定意思;當否定詞出現偶數次時,表示肯定意思。按照漢語習慣,搜索每個情感詞前2個詞語,若出現奇數否定詞,則調整為相反的情感極性
使用的否定詞表共有19個否定詞,分別為:不、沒、無、非、莫、弗、毋、未、否、別、無、休、不是、不能、不可、沒有、不用、不要、從沒、不太。
讀入否定詞表,對情感值的方向進行修正。計算每條評論的情感得分,將評論分為正面評論和負面評論,并計算情感分析的準確率。
3. 查看情感分析效果
使用wordcloud包下的WordCloud函數分別對正面評論和負面評論繪制詞云,查看情感分析效果,得正面情感評論詞云如下圖所示。
由上圖可知,“不錯”“滿意”“好評”等正面情感詞出現的頻數較高,并且沒有摻雜負面情感的詞語,可以看出情感分析能較好的將正面情感評論抽取出來。
負面情感評論詞云如下圖所示。
由上圖可知,“差評”“垃圾”“不好”“太差”等負面情感詞出現的頻數較高,并且沒有摻雜正面情感的詞語,可以看出情感分析能較好的將負面情感評論抽取出來。
為了進一步查看情感分析效果,假定用戶在評論時,不存在選了好評的標簽,而寫了差評內容的情況下,比較原評論的評論類型與情感分析得出的評論類型,繪制情感傾向分析混淆矩陣,如下表所示,查看詞表的情感分析的準確率。
neg | pos | |
---|---|---|
neg | 363 | 55 |
pos | 40 | 443 |
通過比較原評論的評論類型與情感分析得出的評論類型,基于詞表的情感分析的準確率達到了89.46%,證明通過詞表的情感分析去判斷某文本的情感程度是有效的。
3.2 使用LDA模型進行主題分析
1. 了解LDA主題模型
主題模型在自然語言處理等領域是用來在一系列文檔中發現抽象主題的一種統計模型。
傳統判斷兩個文檔相似性的方法是通過查看兩個文檔共同出現的單詞的多少,如TF(詞頻)、TF-IDF(詞頻-逆向文檔頻率)等,這種方法沒有考慮到文字背后的語義關聯,例如在兩個文檔共同出現的單詞很少甚至沒有,但兩個文檔是相似的,因此在判斷文檔相似性時,需要使用主題模型進行語義分析并判斷文檔相似性。
潛在狄利克雷分配,即LDA模型(Latent Dirichlet Allocation,LDA)是由Blei等人在2003年提出的生成式主題模型?。生成模型,即認為每一篇文檔的每一個詞都是通過“一定的概率選擇了某個主題,并從這個主題中以一定的概率選擇了某個詞語”。LDA模型也被稱為三層貝葉斯概率模型,包含文檔(d)、主題(z)、詞(w)三層結構,能夠有效對文本進行建模,和傳統的空間向量模型(VSM)相比,增加了概率的信息。
通過LDA主題模型,能夠挖掘數據集中的潛在主題,進而分析數據集的集中關注點及其相關特征詞。
LDA模型采用詞袋模型(Bag Of Words,BOW)將每一篇文檔視為一個詞頻向量,從而將文本信息轉化為易于建模的數字信息。
LDA主題模型是一種無監督的模式,只需要提供訓練文檔,它就可以自動訓練出各種概率,無需任何人工標注過程,節省大量人力及時間。它在文本聚類、主題分析、相似度計算等方面都有廣泛的應用,相對于其他主題模型,其引入了狄利克雷先驗知識。因此,模型的泛化能力較強,不易出現過擬合現象。
LDA主題模型可以解決多種指代問題,例如:在熱水器的評論中,根據分詞的一般規則,經過分詞的語句會將“費用”一詞單獨分割出來,而“費用”是指安裝費用,還是熱水器費用等其他情況,如果簡單的進行詞頻統計及情感分析,是無法識別的,這種指代不明的問題不能購準確的反應用戶情況,運用LDA主題模型,可以求得詞匯在主題中的概率分布,進而判斷“費用”一詞屬于哪個主題,并求得屬于這一主題的概率和同一主題下的其他特征詞,從而解決多種指代問題。
2. 尋找最有主題數
基于相似度的自適應最優LDA模型選擇方法,確定主題數并進行主題分析。實驗證明該方法可以在不需要人工調試主題數目的情況下,用相對少的迭代,找到最優的主題結構。具體步驟如下。
① 取初始主題數k值,得到初始模型,計算各主題之間的相似度(平均余弦距離)。
② 增加或減少k值,重新訓練模型,再次計算各主題之間的相似度。
③ 重復步驟②直到得到最優k值。
利用各主題間的余弦相似度來度量主題間的相似程度。從詞頻入手,計算它們的相似度,用詞越相似,則內容越相近。
3. 評論主題分析結果
根據主題數尋優結果,使用Python的gensim模塊對正、負面評論數據分別構建LDA主題模型,設置主題數為3經過LDA主題分析后,每個主題下生成10個最有可能出現的詞語以及相應的概率,
得LDA主題分析結果如下兩表所示。
Topic 1 | Topic 2 | Topic 3 |
---|---|---|
滿意 | 值得 | 安裝 |
師傅 | 太 | 很快 |
送貨 | 速度 | 不錯 |
服務 | 家里 | 信賴 |
好評 | 電話 | 東西 |
客服 | 態度 | 物流 |
售后 | 贊 | 購物 |
人員 | 收 | 送 |
差 | 收到 | 品牌 |
質量 | 服務態度 | 裝 |
上表反映了美的正面評價文本中的潛在主題,主題1中的高頻特征詞,即關注點主要是師傅、不錯、售后服務等,主要反映美的安裝師傅服務好等;主題2中的高頻特征詞,即關注點主要是物流、價格等,主要反映熱水器的發貨速度快,及品牌價格實惠等;主題3中的高頻特征詞,即不錯、滿意、質量、好評等,主要反映京東美的產品質量不錯。
Topic 1 | Topic 2 | Topic 3 |
---|---|---|
安裝 | 垃圾 | 師傅 |
差 | 售后 | 太 |
安裝費 | 人員 | 東西 |
裝 | 配件 | 客服 |
不好 | 服務 | 小時 |
貴 | 價格 | 收 |
燒水 | 送貨 | 收費 |
真的 | 只能 | 打電話 |
坑 | 遙控器 | 加熱 |
產品 | 速度 | 慢 |
上表反映了美的負面評價文本中的潛在主題,主題1中的高頻特征詞主要關注點在安裝、安裝費、收費這幾方面,可能存在安裝師傅收費過高等問題;主題2中的高頻特征詞主要與售后、服務這幾方面,反映該產品售后服務差等問題;主題3中的高頻特征詞主要與加熱功能有關,即主要反映的是美的熱水器加熱性能存在問題。
|
| 燒水 | 送貨 | 收費 |
| 真的 | 只能 | 打電話 |
| 坑 | 遙控器 | 加熱 |
| 產品 | 速度 | 慢 |
上表反映了美的負面評價文本中的潛在主題,主題1中的高頻特征詞主要關注點在安裝、安裝費、收費這幾方面,可能存在安裝師傅收費過高等問題;主題2中的高頻特征詞主要與售后、服務這幾方面,反映該產品售后服務差等問題;主題3中的高頻特征詞主要與加熱功能有關,即主要反映的是美的熱水器加熱性能存在問題。
綜合以上對主題及其中的高頻特征詞分析得出,美的熱水器的優勢有以下幾個方面:價格實惠、性價比高、外觀好看、服務好。相對而言,用戶對美的熱水器的抱怨點主要體現在美的熱水器安裝的費用高及售后服務差等。