![]()
目錄
一、專案背景
二、專案目標
三、分析方法與分析程序
四、資料清洗
資料抓取
評論去重
分詞
停用詞
詞云圖繪制
五、 資料分析
評論資料情感傾向分析
匹配情感詞
修正情感傾向
LDA模型進行主題分析
尋找最優主題數
評價主題分析結果
六、 結論分析
一、專案背景
- 網上購物已經成為大眾生活的重要組成部分,人們在電商平臺上瀏覽商品并購物,產生了海量的用戶行為資料,用戶對商品的評論資料對商家具有重要的意義,利用好這些碎片化、非結構化的資料,將有利于企業在電商平臺上的持續發展,同時,對這部分資料進行分析,依據評論資料來優化現有產品也是大資料在企業經營中的實際應用,
- 分析產品:韶音 AfterShokz Aeropex AS800骨傳導藍牙耳機運動無線耳骨傳導耳機跑步騎行 環法特別版(Aeropex AS800是AfterShokz韶音的網紅新品,很多國內外的跑者都在使用,在Instagram上也有很高的熱度,)
- 分析平臺:京東
- 資料獲取量:由于京東對評論的設定只顯示前100頁資料,抓取前100頁最新評論資料和差評資料作為分析物件
- 使用的主要工具:python --jupyter notebook、阿里云資料庫、Navicat Premium(My SQL)
二、專案目標
- 隨著當今時代電子資訊技術的飛速發展,網購已經普及千家萬戶,給電商行業的發展帶來了巨大的機遇,與此同時,這種需求也推動了更多電商企業的崛起,引發了激烈的競爭,而在這種激烈競爭的大背景下,除了提高商品質量、壓低價格外,了解更多消費者的心聲對電商企業來說也變得越來越有必要,其中,一種非常重要的方式就是對消費者的評論文本資料進行內在資訊的分析,
- 評論資訊中蘊含著消費者對特點給產品的主管感受,反應了人們的態度、立場和意見,具有非常寶貴的研究價值,對企業來說分析評論資料可以更好的了解客戶的喜好,從而針對性的提高服務和產品質量,增加自身的競爭力,對于用戶自身來講可以為購物抉擇提供更多的參考依據,本次分析主要想實作以下目標:
- 對京東商城中韶音 AfterShokz Aeropex AS800骨傳導藍牙耳機的評論進行情感分析
- 從評論文本中挖掘用戶的需求、意見、購買原因及產品的優缺點等資訊
- 根據模型結果給出產品改善的建議
三、分析方法與分析程序
- 主要分析步驟如下:
- 使用python對韶音 AfterShokz Aeropex AS800骨傳導藍牙耳機在京東商城中的評論資訊進行爬取
- 使用python對爬取到的資料進行資料清洗、資料分詞、停用詞過濾的資料清洗作業
- 對處理后的資料進行情感分析,把評論文本根據情感傾向分為正面評論資料(好評)和反面評論資料(差評)
- 對正、負評論資料進行LDA主題分析,提取其中有價值的內容
-
?
四、資料清洗
資料抓取
本文主要目標是對資料進行分析,資料抓取具有時效性,在這里對抓取的方法不進行贅述,有不懂的可以看Python爬蟲-抓取資料到可視化全流程的實作
評論去重
從資料庫中取出資料,可以看到共有1260條評論資料,分為8列
#導包
import pandas as pd
import numpy as np
import pymysql
import matplotlib.pyplot as plt
import re
import jieba.posseg as psg
db_info={
'host':"***",
'user':"***",
'passwd':'***',
'database':'cx',# 這里說明我要連接哪個庫
'charset':'utf8'
}
conn = pymysql.connect(**db_info)
cursor = conn.cursor()
sql = 'select * from jdsppl'
result = pd.read_sql(sql,conn)
result
result.shape

部分電商平臺對長時間未完成訂單評價的客戶會進行默認評價,此類資料沒有分析價值,但是本次爬取的資料來自于京東,京東默認只保留前100頁的評論資料,其他資料歸為幫助不大的資料,因此在此次爬取的資料中,不存在這樣的情況,同時如果在某個商品的評論中出現了完全相同的評論,一次兩次或者多次,那么這種情況下的資料肯定是毫無意義的問題資料,這種評論資料只認為其第一條即首次出現時認為其存在一定價值,在評論中會出現一部分評論相似程度很高,但并不完全相同,個別詞語還存在明顯差異,對于這種情況,全部洗掉是不正確和不合適的,可以只洗掉重復的部分,保留有用的文本評論資訊,留下更多有用的語料,
reviews = reviews[['content', 'content_type']].drop_duplicates()
content = reviews['content']
reviews

可以看到有17條重復資料已經被洗掉
通過人工觀察資料發現,評論中夾雜著許多數字與字母,對于本案例的挖掘目標而言,這類資料本身并沒有實質性幫助,另外,由于該評論文本資料主要是圍繞京東商城中韶音 AfterShokz Aeropex AS800骨傳導藍牙耳機進行評價的,其中“京東”“京東商城”“韶音”“耳機”“藍牙耳機”等詞出現的頻數很大,但是對分析目標并沒有什么作用,因此可以在分詞之前將這些詞去除,對資料進行清洗
# 去除去除英文、數字等
# 由于評論中不重要詞語
strinfo = re.compile('[0-9a-zA-Z]|京東|京東商城|韶音|耳機|藍牙耳機|')
content=result['評價內容']
content = content.apply(lambda x: strinfo.sub('', x))
content

欄位已經去除
分詞
- 分詞是文本資訊處理的基礎環節,是將一個單詞序列切分成單個單詞的程序,漢語的基本單位是字,由字可以組成詞,由詞可以組成句子,進而由一些句子組成段、節、章、篇,可見,如果需要處理一篇中文語料,從中正確地識別出詞是一件非常基礎且重要的作業,然而,中文以字為基本書寫單位,詞與詞之間沒有明顯的區分標記,
- 當使用基于詞典的中文分詞方法進行中文資訊處理時,不得不考慮未登錄詞的處理,未登錄詞是指詞典中沒有登錄過的人名、地名、機構名、譯名及新詞語等,當采用匹配的辦法來切分詞語時,由于詞典中沒有登錄這些詞,會引起自動切分詞語的困難,常見的未登陸詞有命名物體,如“張三”“北京”“聯想集團”“酒井法子”等;專業術語,如“貝葉斯演算法”“模態”“萬維網”;新詞語,如“卡拉 OK”“美刀”“啃老族”等,另外,中文分詞還存在切分歧義問題,如“當結合成分子時”這個句子可以有以下切分方法:“當/結合/成分/子時”“當/結合/成/分子/時”“當/結/合成/分子/時”“當/結/合成分/子時”等,可以說,中文分詞的關鍵問題為切分歧義的消解和未登錄詞的識別,分詞最常用的作業包是jieba分詞包,jieba分詞是Python寫成的一個分詞開源庫,專門用于中文分詞,
停用詞
- 停用詞( Stop Words),詞典譯為“電腦檢索中的虛字、非檢索用字”,在SEO搜索引擎中,為節省存盤空間和提高搜索效率,搜索引擎在索引頁面或處理搜索請求時會自動忽略某些字或詞,這些字或詞即被稱為停用詞,通常來講,停用詞大體可以分為兩類,一種是使用過于廣泛和頻繁的詞語,比如英文的i、is,中文的“我”“你”等等,另一種是出現頻率很高,但是意義不大的詞,這種單詞一般包括語氣助詞、副詞、介詞、連詞等等,自身本身并無意義,在經過分詞后,評論由一個字串的形式轉換成了多個由文字或詞語組成的字串形式,用來判斷評論中的詞語是否是停用詞,
-
# 分詞 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, []) # 將嵌套的串列展開,作為詞所在評論的id seg_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 result處理后表格樣式
?
提取含有名詞的評論
-
由于本次分析的目標是對產品特征的優缺點進行分析,類似“不錯,很好的產品”“很不錯,繼續支持”等評論雖然表達了對產品的情感傾向,但是實際上無法根據這些評論提取出哪些產品特征是用戶滿意的,評論中只有出現明確的名詞,如機構團體及其他專有名詞時,才有意義,因此需要對分詞后的詞語進行詞性標注,之后再根據詞性將含有名詞類的評論提取出來,jieba關于詞典詞性標記,采用ICTCLAS 的標記方法,對于詞性標注大家可以看:ICTCLAS漢語詞性標注集
提取評論中詞性含有“n”(名詞)的評論,
# 提取含有名詞類的評論
ind = result[['n' in x for x in result['nature']]]['index_content'].unique()
result = result[[x in ind for x in result['index_content']]]
詞云圖繪制
進行資料預處理后,可繪制詞云查看分詞效果,詞云會將文本中出現頻率較高的“關鍵詞”予以視覺上的突出,首先需要對詞語進行詞頻統計,將詞頻按照降序排序,選擇前100個詞,使用wordcloud模塊中的WordCloud繪制詞云,查看分詞效果(常用字體代碼)
import matplotlib.pyplot as plt
from wordcloud import WordCloud
frequencies = result.groupby(by = ['word'])['word'].count()
frequencies = frequencies.sort_values(ascending = False)
backgroud_Image=plt.imread('../data/pl.jpg')
wordcloud = WordCloud(font_path="simkai.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()

?從生成的詞云圖中可以初步判斷用戶比較在意的是音質、質感、續航、舒適度等關鍵詞
五、 資料分析
評論資料情感傾向分析
匹配情感詞
- 情感傾向也稱為情感極性,在某商品評論中,可以理解為用戶對該商品表達自身觀點所持的態度是支持、反對還是中立,即通常所指的正面情感、負面情感、中性情感,對評論情感傾向進行分析首先要對情感詞進行匹配,使用知網發布的“情感分析用詞語集 ( beta版)"中的“中文正面評價”詞表、“中文負面評價”“中文正面情感”“中文負面情感”詞表等,將“中文正面評價”“中文正面情感”兩個詞表合并,并給每個詞語賦予初始權重1,作為正面評論情感詞表,將“中文負面評價”“中文負面情感”兩個詞表合并,并給每個詞語賦予初始權重-1,作為負面評論情感詞表,
- 讀入正負面評論情感詞表,正面詞語賦予初始權重1,負面詞語賦予初始權重-1,使用merge函式按照詞語情感詞表與分詞結果進行匹配,
import pandas as pd
import numpy as np
word = pd.read_csv("../tmp/result.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'])
修正情感傾向
- 情感傾向修正主要根據情感詞前面兩個位置的詞語是否存在否定詞而去判斷情感值的正確與否,由于漢語中存在多重否定現象,即當否定詞出現奇數次時,表示否定意思;當否定詞出現偶數次時,表示肯定意思,按照漢語習慣,搜索每個情感詞前兩個詞語,若出現奇數否定詞,則調整為相反的情感極性,
# 根據情感詞前時候有否定詞或雙層否定詞對情感值進行修正
# 載入否定詞表
notdict = pd.read_csv("../data/not.csv")
# 處理否定修飾詞
data_posneg['amend_weight'] = data_posneg['weight'] # 構造新列,作為經過否定詞修正后的情感值
data_posneg['id'] = np.arange(0, len(data_posneg))
only_inclination = data_posneg.dropna() # 只保留有情感值的詞語
only_inclination.index = np.arange(0, len(only_inclination))
index = only_inclination['id']
for i in np.arange(0, len(only_inclination)):
review = data_posneg[data_posneg['index_content'] ==
only_inclination['index_content'][i]] # 提取第i個情感詞所在的評論
# 更新只保留情感值的資料
only_inclination = only_inclination.dropna()
# 計算每條評論的情感值
emotional_value = only_inclination.groupby(['index_content'],
as_index=False)['amend_weight'].sum()
# 去除情感值為0的評論
emotional_value = emotional_value[emotional_value['amend_weight'] != 0]
使用wordcloud包下的 WordCloud 函式分別對正面評論和負面評論繪制詞云,以查看情感分析效果,
# 給情感值大于0的賦予評論型別(content_type)為pos,小于0的為neg emotional_value['a_type'] = '' emotional_value['a_type'][emotional_value['amend_weight'] > 0] = 'pos' emotional_value['a_type'][emotional_value['amend_weight'] < 0] = 'neg' # 查看情感分析結果 result = emotional_value.merge(word, left_on = 'index_content', right_on = 'index_content', how = 'left') result = result[['index_content','content_type', 'a_type']].drop_duplicates() confusion_matrix = pd.crosstab(result['content_type'], result['a_type'], margins=True) # 制作交叉表 (confusion_matrix.iat[0,0] + confusion_matrix.iat[1,1])/confusion_matrix.iat[2,2] # 提取正負面評論資訊 ind_pos = list(emotional_value[emotional_value['a_type'] == 'pos']['index_content']) ind_neg = list(emotional_value[emotional_value['a_type'] == 'neg']['index_content']) posdata = word[[i in ind_pos for i in word['index_content']]] negdata = word[[i in ind_neg for i in word['index_content']]] # 繪制詞云 import matplotlib.pyplot as plt from wordcloud import WordCloud # 正面情感詞詞云 freq_pos = posdata.groupby(by = ['word'])['word'].count() freq_pos = freq_pos.sort_values(ascending = False) backgroud_Image=plt.imread('../data/pl.jpg') wordcloud = WordCloud(font_path="simkai.ttf", max_words=100, background_color='white', mask=backgroud_Image) pos_wordcloud = wordcloud.fit_words(freq_pos) plt.imshow(pos_wordcloud) plt.axis('off') plt.show() # 負面情感詞詞云 freq_neg = negdata.groupby(by = ['word'])['word'].count() freq_neg = freq_neg.sort_values(ascending = False) neg_wordcloud = wordcloud.fit_words(freq_neg) plt.imshow(neg_wordcloud) plt.axis('off') plt.show() # 將結果寫出,每條評論作為一行 posdata.to_csv("../tmp/posdata.csv", index = False, encoding = 'utf-8') negdata.to_csv("../tmp/negdata.csv", index = False, encoding = 'utf-8')

可以看到在正面情感評論詞云圖中可以發現:“不錯”、“喜歡”、“滿意”、“舒服”等詞出現的詞頻較高,且沒有出現負面情感的詞語,從負面情感評論中可以發現:“做工”、“客服”、“差”等出現詞頻較高,沒有發現摻雜正面情感的詞語,由此可以正面通過詞表來分析文本的情感程度是有效的,
LDA模型進行主題分析
- 主題模型在自然語言處理等領域是用來在一系列檔案中發現抽象主題的一種統計模型,判斷兩個檔案相似性的傳統方法是通過查看兩個檔案共同出現的單詞的多少,如TF(詞頻)、TF-IDF(詞頻—逆向檔案頻率)等,這種方法沒有考慮文字背后的語意關聯,例如,兩個檔案共同出現的單詞很少甚至沒有,但兩個檔案是相似的,因此在判斷檔案相似性時,需要使用主題模型進行語意分析并判斷檔案相似性,如果一篇檔案有多個主題,則一些特定的可代表不同主題的詞語就會反復出現,此時,運用主題模型,能夠發現文本中使用詞語的規律,并且把規律相似的文本聯系到一起,以尋求非結構化的文本集中的有用資訊,
- LDA主題模型:潛在狄利克雷分配,即LDA模型(Latent Dirichlet Allocation,LDA)是由Blei等人于2003年提出的生成式主題模型生成模型,即認為每一篇檔案的每一個詞都是通過“一定的概率選擇了某個主題,并從這個主題中以一定的概率選擇了某個詞語”,LDA模型也被稱為3層貝葉斯概率模型,包含檔案(d)、主題(z)、詞(w)3層結構,能夠有效對文本進行建模,和傳統的空間向量模型(VSM)相比,增加了概率的資訊,通過LDA主題模型,能夠挖掘資料集中的潛在主題,進而分析資料集的集中關注點及其相關特征詞,
- LDA主題模型是一種無監督的模式,只需要提供訓練檔案,就可以自動訓練出各種概率,無須任何人工標注程序,節省了大量的人力及時間,它在文本聚類、主題分析、相似度計算等方面都有廣泛的應用,相對于其他主題模型,其引人了狄利克雷先驗知識,因此,模型的泛化能力較強,不易出現過擬合現象,建立LDA主題模型,首先要建立詞典及語料庫
import pandas as pd import numpy as np import re import itertools import matplotlib.pyplot as plt # 載入情感分析后的資料 posdata = pd.read_csv("../data/posdata.csv", encoding = 'utf-8') negdata = pd.read_csv("../data/negdata.csv", encoding = 'utf-8') from gensim import corpora, models # 建立詞典 pos_dict = corpora.Dictionary([[i] for i in posdata['word']]) # 正面 neg_dict = corpora.Dictionary([[i] for i in negdata['word']]) # 負面 # 建立語料庫 pos_corpus = [pos_dict.doc2bow(j) for j in [[i] for i in posdata['word']]] # 正面 neg_corpus = [neg_dict.doc2bow(j) for j in [[i] for i in negdata['word']]] # 負面
尋找最優主題數
- 基于相似度的自適應最優LDA模型選擇方法,確定主題數并進行主題分析,實驗證明該方法可以在不需要人工除錯主題數目的情況下,用相對少的迭代找到最優的主題結構,具體步驟如下:
- 1)取初始主題數k值,得到初始模型,計算各主題之間的相似度(平均余弦距離),
- 2)增加或減少k值,重新訓練模型,再次計算各主題之間的相似度,
- 3 )重復步驟2直到得到最優k值,
- 利用各主題間的余弦相似度來度量主題間的相似程度,從詞頻入手,計算它們的相似度,用詞越相似,則內容越相近,
構造主題數尋優函式 def cos(vector1, vector2): # 余弦相似度函式 dot_product = 0.0; normA = 0.0; normB = 0.0; for a,b in zip(vector1, vector2): dot_product += a*b normA += a**2 normB += b**2 if normA == 0.0 or normB==0.0: return(None) else: return(dot_product / ((normA*normB)**0.5)) # 計算主題平均余弦相似度 pos_k = lda_k(pos_corpus, pos_dict) neg_k = lda_k(neg_corpus, neg_dict) # 繪制主題平均余弦相似度圖形 from matplotlib.font_manager import FontProperties font = FontProperties(size=14) #解決中文顯示問題 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig = plt.figure(figsize=(10,8)) ax1 = fig.add_subplot(211) ax1.plot(pos_k) ax1.set_xlabel('正面評論LDA主題數尋優', fontproperties=font) ax2 = fig.add_subplot(212) ax2.plot(neg_k) ax2.set_xlabel('負面評論LDA主題數尋優', fontproperties=font)
從圖中可以發現,當主題數為2時,主題間的余弦相似度達到最低,因此選擇主題數為2
評價主題分析結果
根據主題數尋優結果,使用Python的Gensim模塊對正面評論資料和負面評論資料分別構建LDA主題模型,選取主題數為2,經過LDA主題分析后,每個主題下生成10個最有可能出現的詞語及相應的概率
# LDA主題分析
pos_lda = models.LdaModel(pos_corpus, num_topics = 2, id2word = pos_dict)
neg_lda = models.LdaModel(neg_corpus, num_topics = 2, id2word = neg_dict)
pos_lda.print_topics(num_words = 10)
neg_lda.print_topics(num_words = 10)

整理:
正面評價潛在主題:
| 1 | 2 | 1 | 2 |
| 音質 | 耳朵 | 感覺 | 傳到 |
| 喜歡 | 不錯 | 骨 | 運動 |
| 做工 | 質感 | 舒適度 | 音效 |
| 滿意 | 聽 | 舒服 | 續航 |
| 耳朵 | 跑步 | 很快 | 值得 |

負面評價潛在主題:
| 1 | 2 | 1 | 2 |
| 客服 | 耳朵 | 幾天 | 差 |
| 傳導 | 骨 | 新 | 贈品 |
| 音質 | 快遞 | 理解 | 做工 |
| 壞 | 不好 | 產品 | 找 |
| 聲音 | 太 | 回來 | 中 |
六、 結論分析
- 綜合以上對主題及其中的高頻特征詞的分析得出,韶音 AfterShokz Aeropex AS800的優點主要集中為兩類,第一耳機自身的質量和舒適度產品本身的性能訪方面,第二也就是產品的定位即功能性,韶音 AfterShokz Aeropex AS800主打的就是運動耳機,從用戶的評價情感詞上來看韶音 AfterShokz Aeropex AS800的宣傳是很到位的,相對而言,用戶對韶音 AfterShokz Aeropex AS800的抱怨點主要在售后服務差及贈品質量不高物流速度等方面,
- 因此,用戶的購買原因可以總結為以下幾個方面:產品定位明確、性能可靠、性價比高
- 根據對京東平臺上韶音 AfterShokz Aeropex AS800耳機用戶評價情況進行LDA主題模型分析,對美的品牌提出以下兩點建議:
- 1、在保持主產品質量和性能的基礎上,對贈品和音質等方面進一步加強;
- 2、繼續保持產品定位明確的優點,固定客戶群體;
- 3、提升客服人員的整體素質,提高服務質量,注重售后服務,建立售后服務的明文細則,做好產品的全程序服務,增加產品的核心競爭力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/416158.html
標籤:AI

