国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

18143453325 在線咨詢 在線咨詢
18143453325 在線咨詢
所在位置: 首頁 > 營銷資訊 > 電子商務(wù) > 電商產(chǎn)品數(shù)據(jù)分析案例2-評(píng)論數(shù)據(jù)情感分析

電商產(chǎn)品數(shù)據(jù)分析案例2-評(píng)論數(shù)據(jù)情感分析

時(shí)間:2023-03-15 22:40:01 | 來源:電子商務(wù)

時(shí)間:2023-03-15 22:40:01 來源:電子商務(wù)

針對(duì)用戶在電商平臺(tái)上留下的評(píng)論數(shù)據(jù),對(duì)其進(jìn)行分詞、詞性標(biāo)注和去除停用詞等文本預(yù)處理?;陬A(yù)處理后的數(shù)據(jù)進(jìn)行情感分析,并使用LDA主題模型提取評(píng)論關(guān)鍵信息,以了解用戶的需求、意見、購買原因及產(chǎn)品的優(yōu)缺點(diǎn)等,最終提出改善產(chǎn)品的建議。

一、數(shù)據(jù)預(yù)處理

數(shù)據(jù)去重

一些電商平臺(tái)為了避免一些客戶長時(shí)間不進(jìn)行評(píng)論,往往會(huì)設(shè)置一道程序,如果用戶超過規(guī)定的時(shí)間仍然沒有做出評(píng)論,系統(tǒng)就會(huì)自動(dòng)替客戶做出評(píng)論,這類數(shù)據(jù)顯然沒有任何分析價(jià)值。由語言的特點(diǎn)可知,在大多數(shù)情況下,不同購買者之間的有價(jià)值的評(píng)論是不會(huì)出現(xiàn)完全重復(fù)的,如果不同購物者的評(píng)論完全重復(fù),那么這些評(píng)論一般都是毫無意義的。為了存留更多的有用語料,本節(jié)針對(duì)完全重復(fù)的語料下手,僅刪除完全重復(fù)部分,以確保保留有用的文本評(píng)論信息。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport reimport jieba.posseg as psgimport warningswarnings.filterwarnings("ignore")%matplotlib inlinepath = '/home/mw/input/data/emotion_analysi7147'reviews = pd.read_csv(path+'/reviews.csv')print(reviews.shape)reviews.head()# 刪除數(shù)據(jù)記錄中所有列值相同的記錄reviews = reviews[['content','content_type']].drop_duplicates()content = reviews['content']reviews.shapereviews數(shù)據(jù)清洗

通過人工觀察數(shù)據(jù)發(fā)現(xiàn),評(píng)論中夾雜著許多數(shù)字與字母,對(duì)于本案例的挖掘目標(biāo)而言,這類數(shù)據(jù)本身并沒有實(shí)質(zhì)性幫助。另外,由于該評(píng)論文本數(shù)據(jù)主要是圍繞京東商城中美的電熱水器進(jìn)行評(píng)價(jià)的,其中“京東”“京東商城”“美的”“熱水器”“電熱水器”等詞出現(xiàn)的頻數(shù)很大,但是對(duì)分析目標(biāo)并沒有什么作用,因此可以在分詞之前將這些詞去除,對(duì)數(shù)據(jù)進(jìn)行清洗。

# 去除英文、數(shù)字、京東、美的、電熱水器等詞語strinfo = re.compile('[0-9a-zA-Z]|京東|美的|電熱水器|熱水器|')content = content.apply(lambda x: strinfo.sub('',x))分詞、詞性標(biāo)注、去除停用詞

詞是文本信息處理的基礎(chǔ)環(huán)節(jié),是將一個(gè)單詞序列切分成單個(gè)單詞的過程。準(zhǔn)確地分詞可以極大地提高計(jì)算機(jī)對(duì)文本信息的識(shí)別和理解能力。相反,不準(zhǔn)確的分詞將會(huì)產(chǎn)生大量的噪聲,嚴(yán)重干擾計(jì)算機(jī)的識(shí)別理解能力,并對(duì)這些信息的后續(xù)處理工作產(chǎn)生較大的影響。中文分詞的任務(wù)就是把中文的序列切分成有意義的詞,即添加合適的詞串使得所形成的詞串反映句子的本意,中文分詞的關(guān)鍵問題為切分歧義的消解和未登錄詞的識(shí)別。

未登錄詞是指詞典中沒有登錄過的人名、地名、機(jī)構(gòu)名、譯名及新詞語等。當(dāng)采用匹配的辦法來切分詞語時(shí),由于詞典中沒有登錄這些詞,會(huì)引起自動(dòng)切分詞語的困難。

分詞最常用的工作包是jieba分詞包,jieba分詞是Python寫成的一個(gè)分詞開源庫,專門用于中文分詞,其有3條基本原理,即實(shí)現(xiàn)所采用技術(shù)。

  1. 基于Trie樹結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG)。
  2. 采用動(dòng)態(tài)規(guī)劃查找最大概率路徑,找出基于詞頻的最大切分組合。
  3. 對(duì)于未登錄詞,采用HMM模型,使用了Viterbi算法,將中文詞匯按照BEMS 4個(gè)狀態(tài)來標(biāo)記。
# 分詞worker = lambda s: [(x.word, x.flag) for x in psg.cut(s)] # 自定義簡單分詞函數(shù)seg_word = content.apply(worker)seg_word.head()# 將詞語轉(zhuǎn)為數(shù)據(jù)框形式,一列是詞,一列是詞語所在的句子ID,最后一列是詞語在該句子的位置n_word = seg_word.apply(lambda x: len(x)) # 每一評(píng)論中詞的個(gè)數(shù)n_content = [[x+1]*y for x,y in zip(list(seg_word.index), list(n_word))]# 將嵌套的列表展開,作為詞所在評(píng)論的idindex_content = sum(n_content, [])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))]# 評(píng)論類型content_type = sum(content_type, [])result = pd.DataFrame({"index_content":index_content, "word":word, "nature":nature, "content_type":content_type})result.head()# 刪除標(biāo)點(diǎn)符號(hào)result = result[result['nature'] != 'x'] # x表示標(biāo)點(diǎn)符號(hào)# 刪除停用詞stop_path = open(path+"/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)]result.head()# 構(gòu)造各詞在對(duì)應(yīng)評(píng)論的位置列n_word = list(result.groupby(by = ['index_content'])['index_content'].count())index_word = [list(np.arange(0, y)) for y in n_word]# 詞語在該評(píng)論的位置index_word = sum(index_word, [])# 合并評(píng)論idresult['index_word'] = index_wordresult.head()提取含名詞的評(píng)論

由于本案例的目標(biāo)是對(duì)產(chǎn)品特征的優(yōu)缺點(diǎn)進(jìn)行分析,類似“不錯(cuò),很好的產(chǎn)品”“很不錯(cuò),繼續(xù)支持”等評(píng)論雖然表達(dá)了對(duì)產(chǎn)品的情感傾向,但是實(shí)際上無法根據(jù)這些評(píng)論提取出哪些產(chǎn)品特征是用戶滿意的。評(píng)論中只有出現(xiàn)明確的名詞,如機(jī)構(gòu)團(tuán)體及其他專有名詞時(shí),才有意義,因此需要對(duì)分詞后的詞語進(jìn)行詞性標(biāo)注。之后再根據(jù)詞性將含有名詞類的評(píng)論提取出來。

# 提取含有名詞類的評(píng)論,即詞性含有“n”的評(píng)論ind = result[['n' in x for x in result['nature']]]['index_content'].unique()result = result[[x in ind for x in result['index_content']]]result.head()繪制詞云

繪制詞云查看分詞效果,詞云會(huì)將文本中出現(xiàn)頻率較高的“關(guān)鍵詞”予以視覺上的突出。首先需要對(duì)詞語進(jìn)行詞頻統(tǒng)計(jì),將詞頻按照降序排序,選擇前100個(gè)詞,使用wordcloud模塊中的WordCloud繪制詞云,查看分詞效果。

import matplotlib.pyplot as pltfrom wordcloud import WordCloudfrequencies = result.groupby('word')['word'].count()frequencies = frequencies.sort_values(ascending = False)backgroud_Image=plt.imread(path+'/pl.jpg')# 自己上傳中文字體到kescifont_path = '/home/kesci/work/data/fonts/MSYHL.TTC'wordcloud = WordCloud(font_path=font_path, # 設(shè)置字體,不設(shè)置就會(huì)出現(xiàn)亂碼 max_words=100, background_color='white', mask=backgroud_Image)# 詞云形狀my_wordcloud = wordcloud.fit_words(frequencies)plt.imshow(my_wordcloud)plt.axis('off') plt.show()由圖可以看出,對(duì)評(píng)論數(shù)據(jù)進(jìn)行預(yù)處理后,分詞效果較為符合預(yù)期。其中“安裝”“師傅”“售后”“物流”“服務(wù)”等詞出現(xiàn)頻率較高,因此可以初步判斷用戶對(duì)產(chǎn)品的這幾個(gè)方面比較重視。

# 將結(jié)果保存result.to_csv("./word.csv", index = False, encoding = 'utf-8')二、詞典匹配

評(píng)論數(shù)據(jù)情感傾向分析

匹配情感詞情感傾向也稱為情感極性。在某商品評(píng)論中,可以理解為用戶對(duì)該商品表達(dá)自身觀點(diǎn)所持的態(tài)度是支持、反對(duì)還是中立,即通常所指的正面情感、負(fù)面情感、中性情感。由于本案例主要是對(duì)產(chǎn)品的優(yōu)缺點(diǎn)進(jìn)行分析,因此只要確定用戶評(píng)論信息中的情感傾向方向分析即可,不需要分析每一評(píng)論的情感程度。

對(duì)評(píng)論情感傾向進(jìn)行分析首先要對(duì)情感詞進(jìn)行匹配,主要采用詞典匹配的方法,本案例使用的情感詞表是2007年10月22日知網(wǎng)發(fā)布的“情感分析用詞語集(beta版)”,主要使用“中文正面評(píng)價(jià)”詞表、“中文負(fù)面評(píng)價(jià)”“中文正面情感”“中文負(fù)面情感”詞表等。將“中文正面評(píng)價(jià)”“中文正面情感”兩個(gè)詞表合并,并給每個(gè)詞語賦予初始權(quán)重1,作為本案例的正面評(píng)論情感詞表。將“中文負(fù)面評(píng)價(jià)”“中文負(fù)面情感”兩個(gè)詞表合并,并給每個(gè)詞語賦予初始權(quán)重-1,作為本案例的負(fù)面評(píng)論情感詞表。

一般基于詞表的情感分析方法,分析的效果往往與情感詞表內(nèi)的詞語有較強(qiáng)的相關(guān)性,如果情感詞表內(nèi)的詞語足夠全面,并且詞語符合該案例場景下所表達(dá)的情感,那么情感分析的效果會(huì)更好。針對(duì)本案例場景,需要在知網(wǎng)提供的詞表基礎(chǔ)上進(jìn)行優(yōu)化,例如“好評(píng)”“超值”“差評(píng)”“五分”等詞只有在網(wǎng)絡(luò)購物評(píng)論上出現(xiàn),就可以根據(jù)詞語的情感傾向添加至對(duì)應(yīng)的情感詞表內(nèi)。將“滿意”“好評(píng)”“很快”“還好”“還行”“超值”“給力”“支持”“超好”“感謝”“太棒了”“厲害”“挺舒服”“辛苦”“完美”“喜歡”“值得”“省心”等詞添加進(jìn)正面情感詞表。將“差評(píng)”“貴”“高”“漏水”等詞加入負(fù)面情感詞表。讀入正負(fù)面評(píng)論情感詞表,正面詞語賦予初始權(quán)重1,負(fù)面詞語賦予初始權(quán)重-1。

word = pd.read_csv("./word.csv")# 讀入正面、負(fù)面情感評(píng)價(jià)詞pos_comment = pd.read_csv(path+"/正面評(píng)價(jià)詞語(中文).txt", header=None,sep="/n", encoding = 'utf-8', engine='python')neg_comment = pd.read_csv(path+"/負(fù)面評(píng)價(jià)詞語(中文).txt", header=None,sep="/n", encoding = 'utf-8', engine='python')pos_emotion = pd.read_csv(path+"/正面情感詞語(中文).txt", header=None,sep="/n", encoding = 'utf-8', engine='python')neg_emotion = pd.read_csv(path+"/負(fù)面情感詞語(中文).txt", header=None,sep="/n", encoding = 'utf-8', engine='python') # 合并情感詞與評(píng)價(jià)詞positive = set(pos_comment.iloc[:,0])|set(pos_emotion.iloc[:,0])negative = set(neg_comment.iloc[:,0])|set(neg_emotion.iloc[:,0])# 正負(fù)面情感詞表中相同的詞語intersection = positive&negativepositive = 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)# 將分詞結(jié)果與正負(fù)面情感詞表合并,定位情感詞data_posneg = posneg.merge(word, left_on = 'word', right_on = 'word', how = 'right')data_posneg = data_posneg.sort_values(by = ['index_content','index_word'])data_posneg.head()修正情感傾向

情感傾向修正主要根據(jù)情感詞前面兩個(gè)位置的詞語是否存在否定詞而去判斷情感值的正確與否,由于漢語中存在多重否定現(xiàn)象,即當(dāng)否定詞出現(xiàn)奇數(shù)次時(shí),表示否定意思;當(dāng)否定詞出現(xiàn)偶數(shù)次時(shí),表示肯定意思。按照漢語習(xí)慣,搜索每個(gè)情感詞前兩個(gè)詞語,若出現(xiàn)奇數(shù)否定詞,則調(diào)整為相反的情感極性。

本案例使用的否定詞表共有19個(gè)否定詞,分別為:不、沒、無、非、莫、弗、毋、未、否、別、無、休、不是、不能、不可、沒有、不用、不要、從沒、不太。

讀入否定詞表,對(duì)情感值的方向進(jìn)行修正。計(jì)算每條評(píng)論的情感得分,將評(píng)論分為正面評(píng)論和負(fù)面評(píng)論,并計(jì)算情感分析的準(zhǔn)確率。

# 載入否定詞表notdict = pd.read_csv(path+"/not.csv")# 構(gòu)造新列,作為經(jīng)過否定詞修正后的情感值data_posneg['amend_weight'] = data_posneg['weight']data_posneg['id'] = np.arange(0, len(data_posneg))# 只保留有情感值的詞語only_inclination = data_posneg.dropna().reset_index(drop=True)index = only_inclination['id']for i in np.arange(0, len(only_inclination)): # 提取第i個(gè)情感詞所在的評(píng)論 review = data_posneg[data_posneg['index_content'] == only_inclination['index_content'][i]] review.index = np.arange(0, len(review)) # 第i個(gè)情感值在該文檔的位置 affective = only_inclination['index_word'][i] if affective == 1: ne = sum([i in notdict['term'] for i in review['word'][affective - 1]])%2 if ne == 1: data_posneg['amend_weight'][index[i]] = -data_posneg['weight'][index[i]] elif affective > 1: ne = sum([i in notdict['term'] for i in review['word'][[affective - 1, affective - 2]]])%2 if ne == 1: data_posneg['amend_weight'][index[i]] = -data_posneg['weight'][index[i]] # 更新只保留情感值的數(shù)據(jù)only_inclination = only_inclination.dropna()# 計(jì)算每條評(píng)論的情感值emotional_value = only_inclination.groupby(['index_content'], as_index=False)['amend_weight'].sum()# 去除情感值為0的評(píng)論emotional_value = emotional_value[emotional_value['amend_weight'] != 0]查看情感分析效果

# 給情感值大于0的賦予評(píng)論類型(content_type)為pos,小于0的為negemotional_value['a_type'] = ''emotional_value['a_type'][emotional_value['amend_weight'] > 0] = 'pos'emotional_value['a_type'][emotional_value['amend_weight'] < 0] = 'neg'emotional_value.head()# 查看情感分析結(jié)果result = emotional_value.merge(word, left_on = 'index_content', right_on = 'index_content', how = 'left')result.head()result = result[['index_content','content_type', 'a_type']].drop_duplicates()result.head()假定用戶在評(píng)論時(shí)不存在“選了好評(píng)的標(biāo)簽,而寫了差評(píng)內(nèi)容”的情況,比較原評(píng)論的評(píng)論類型與情感分析得出的評(píng)論類型,繪制情感傾向分析混淆矩陣,查看詞表的情感分析的準(zhǔn)確率。

# 交叉表:統(tǒng)計(jì)分組頻率的特殊透視表confusion_matrix = pd.crosstab(result['content_type'], result['a_type'], margins=True)confusion_matrix.head()(confusion_matrix.iat[0,0] + confusion_matrix.iat[1,1])/confusion_matrix.iat[2,2]# 提取正負(fù)面評(píng)論信息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 pltfrom wordcloud import WordCloud# 正面情感詞詞云freq_pos = posdata.groupby('word')['word'].count()freq_pos = freq_pos.sort_values(ascending = False)backgroud_Image=plt.imread(path+'/pl.jpg')wordcloud = WordCloud(font_path=font_path, 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()# 負(fù)面情感詞詞云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()# 將結(jié)果寫出,每條評(píng)論作為一行posdata.to_csv("./posdata.csv", index = False, encoding = 'utf-8')negdata.to_csv("./negdata.csv", index = False, encoding = 'utf-8')由圖正面情感評(píng)論詞云可知,“不錯(cuò)”“滿意”“好評(píng)”等正面情感詞出現(xiàn)的頻數(shù)較高,并且沒有摻雜負(fù)面情感詞語,可以看出情感分析能較好地將正面情感評(píng)論抽取出來。

由圖負(fù)面情感評(píng)論詞云可知,“差評(píng)”“垃圾”“不好”“太差”等負(fù)面情感詞出現(xiàn)的頻數(shù)較高,并且沒有摻雜正面情感詞語,可以看出情感分析能較好地將負(fù)面情感評(píng)論抽取出來。

三、LinearSVC模型預(yù)測情感

將數(shù)據(jù)集劃分為訓(xùn)練集和測試集(8:2),通過TfidfVectorizer將評(píng)論文本向量化,在來訓(xùn)練LinearSVC模型,查看模型在訓(xùn)練集上的得分,預(yù)測測試集

reviews.head()reviews['content_type'] = reviews['content_type'].map(lambda x:1.0 if x == 'pos' else 0.0)reviews.head()from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF # 原始文本轉(zhuǎn)化為tf-idf的特征矩陣from sklearn.svm import LinearSVCfrom sklearn.calibration import CalibratedClassifierCVfrom sklearn.model_selection import train_test_split# 將有標(biāo)簽的數(shù)據(jù)集劃分成訓(xùn)練集和測試集train_X,valid_X,train_y,valid_y = train_test_split(reviews['content'],reviews['content_type'],test_size=0.2,random_state=42)train_X.shape,train_y.shape,valid_X.shape,valid_y.shape# 模型構(gòu)建model_tfidf = TFIDF(min_df=5, max_features=5000, ngram_range=(1,3), use_idf=1, smooth_idf=1)# 學(xué)習(xí)idf vectormodel_tfidf.fit(train_X)# 把文檔轉(zhuǎn)換成 X矩陣(該文檔中該特征詞出現(xiàn)的頻次),行是文檔個(gè)數(shù),列是特征詞的個(gè)數(shù)train_vec = model_tfidf.transform(train_X)# 模型訓(xùn)練model_SVC = LinearSVC()clf = CalibratedClassifierCV(model_SVC)clf.fit(train_vec,train_y)# 把文檔轉(zhuǎn)換成矩陣valid_vec = model_tfidf.transform(valid_X)# 驗(yàn)證pre_valid = clf.predict_proba(valid_vec)pre_valid[:5]pre_valid = clf.predict(valid_vec)print('正例:',sum(pre_valid == 1))print('負(fù)例:',sum(pre_valid == 0))from sklearn.metrics import accuracy_scorescore = accuracy_score(pre_valid,valid_y)print("準(zhǔn)確率:",score)四、LDA模型

LDA是一種文檔主題生成模型,包含詞、主題和文檔三層結(jié)構(gòu)。

  1. 主題模型在自然語言處理等領(lǐng)域是用來在一系列文檔中發(fā)現(xiàn)抽象主題的一種統(tǒng)計(jì)模型。判斷兩個(gè)文檔相似性的傳統(tǒng)方法是通過查看兩個(gè)文檔共同出現(xiàn)的單詞的多少,如TF(詞頻)、TF-IDF(詞頻—逆向文檔頻率)等,這種方法沒有考慮文字背后的語義關(guān)聯(lián),例如,兩個(gè)文檔共同出現(xiàn)的單詞很少甚至沒有,但兩個(gè)文檔是相似的,因此在判斷文檔相似性時(shí),需要使用主題模型進(jìn)行語義分析并判斷文檔相似性。如果一篇文檔有多個(gè)主題,則一些特定的可代表不同主題的詞語就會(huì)反復(fù)出現(xiàn),此時(shí),運(yùn)用主題模型,能夠發(fā)現(xiàn)文本中使用詞語的規(guī)律,并且把規(guī)律相似的文本聯(lián)系到一起,以尋求非結(jié)構(gòu)化的文本集中的有用信息。例如,在美的電熱水器的商品評(píng)論文本數(shù)據(jù)中,代表電熱水器特征的詞語如“安裝”“出水量”“服務(wù)”等會(huì)頻繁地出現(xiàn)在評(píng)論中,運(yùn)用主題模型,把熱水器代表性特征相關(guān)的情感描述性詞語與對(duì)應(yīng)特征的詞語聯(lián)系起來,從而深入了解用戶對(duì)電熱水器的關(guān)注點(diǎn)及用戶對(duì)于某一特征的情感傾向
  2. LDA主題模型潛在狄利克雷分配,即LDA模型(Latent Dirichlet Allocation,LDA)是由Blei等人在2003年提出的生成式主題模型。所謂生成模型,就是說,我們認(rèn)為一篇文章的每個(gè)詞都是通過“以一定概率選擇了某個(gè)主題,并從這個(gè)主題中以一定概率選擇某個(gè)詞語”這樣一個(gè)過程得到。文檔到主題服從多項(xiàng)式分布,主題到詞服從多項(xiàng)式分布。LDA模型也被稱為3層貝葉斯概率模型,包含文檔(d)、主題(z)、詞(w)3層結(jié)構(gòu),能夠有效對(duì)文本進(jìn)行建模,和傳統(tǒng)的空間向量模型(VSM)相比,增加了概率的信息。通過LDA主題模型,能夠挖掘數(shù)據(jù)集中的潛在主題,進(jìn)而分析數(shù)據(jù)集的集中關(guān)注點(diǎn)及其相關(guān)特征詞。LDA模型采用詞袋模型(Bag of Words,BOW)將每一篇文檔視為一個(gè)詞頻向量,從而將文本信息轉(zhuǎn)化為易于建模的數(shù)字信息。定義詞表大小為L,一個(gè)L維向量(1,0,0,…,0,0)表示一個(gè)詞。由N個(gè)詞構(gòu)成的評(píng)論記為d=(w1,w2,…,wN)。假設(shè)某一商品的評(píng)論集D由M篇評(píng)論構(gòu)成,記為D=(d1,d2,…,dM)。M篇評(píng)論分布著K個(gè)主題,記為Zi=(i=1,2,…,K)。記a和b為狄利克雷函數(shù)的先驗(yàn)參數(shù),q為主題在文檔中的多項(xiàng)分布的參數(shù),其服從超參數(shù)為a的Dirichlet先驗(yàn)分布,f為詞在主題中的多項(xiàng)分布的參數(shù),其服從超參數(shù)b的Dirichlet先驗(yàn)分布。
import reimport itertoolsfrom gensim import corpora, models# 載入情感分析后的數(shù)據(jù)posdata = pd.read_csv("./posdata.csv", encoding = 'utf-8')negdata = pd.read_csv("./negdata.csv", encoding = 'utf-8')# 建立詞典pos_dict = corpora.Dictionary([[i] for i in posdata['word']]) # 正面neg_dict = corpora.Dictionary([[i] for i in negdata['word']]) # 負(fù)面# 建立語料庫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']]] # 負(fù)面五、主題數(shù)尋優(yōu)

基于相似度的自適應(yīng)最優(yōu)LDA模型選擇方法,確定主題數(shù)并進(jìn)行主題分析。實(shí)驗(yàn)證明該方法可以在不需要人工調(diào)試主題數(shù)目的情況下,用相對(duì)少的迭代找到最優(yōu)的主題結(jié)構(gòu)。

具體步驟如下:

  1. 取初始主題數(shù)k值,得到初始模型,計(jì)算各主題之間的相似度(平均余弦距離)。
  2. 增加或減少k值,重新訓(xùn)練模型,再次計(jì)算各主題之間的相似度。
  3. 重復(fù)步驟2直到得到最優(yōu)k值。
# 余弦相似度函數(shù)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)) # 主題數(shù)尋優(yōu)def lda_k(x_corpus, x_dict): # 初始化平均余弦相似度 mean_similarity = [] mean_similarity.append(1) # 循環(huán)生成主題并計(jì)算主題間相似度 for i in np.arange(2,11): # LDA模型訓(xùn)練 lda = models.LdaModel(x_corpus, num_topics = i, id2word = x_dict) for j in np.arange(i): term = lda.show_topics(num_words = 50) # 提取各主題詞 top_word = [] for k in np.arange(i): top_word.append([''.join(re.findall('"(.*)"',i)) / for i in term[k][1].split('+')]) # 列出所有詞 # 構(gòu)造詞頻向量 word = sum(top_word,[]) # 列出所有的詞 unique_word = set(word) # 去除重復(fù)的詞 # 構(gòu)造主題詞列表,行表示主題號(hào),列表示各主題詞 mat = [] for j in np.arange(i): top_w = top_word[j] mat.append(tuple([top_w.count(k) for k in unique_word])) p = list(itertools.permutations(list(np.arange(i)),2)) l = len(p) top_similarity = [0] for w in np.arange(l): vector1 = mat[p[w][0]] vector2 = mat[p[w][1]] top_similarity.append(cos(vector1, vector2)) # 計(jì)算平均余弦相似度 mean_similarity.append(sum(top_similarity)/l) return(mean_similarity)# 計(jì)算主題平均余弦相似度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)fig = plt.figure(figsize=(10,8))ax1 = fig.add_subplot(211)ax1.plot(pos_k)ax1.set_xlabel('正面評(píng)論LDA主題數(shù)尋優(yōu)', fontproperties=font)ax2 = fig.add_subplot(212)ax2.plot(neg_k)ax2.set_xlabel('負(fù)面評(píng)論LDA主題數(shù)尋優(yōu)', fontproperties=font)由圖可知,對(duì)于正面評(píng)論數(shù)據(jù),當(dāng)主題數(shù)為2或3時(shí),主題間的平均余弦相似度就達(dá)到了最低。因此,對(duì)正面評(píng)論數(shù)據(jù)做LDA,可以選擇主題數(shù)為3;對(duì)于負(fù)面評(píng)論數(shù)據(jù),當(dāng)主題數(shù)為3時(shí),主題間的平均余弦相似度也達(dá)到了最低。因此,對(duì)負(fù)面評(píng)論數(shù)據(jù)做LDA,也可以選擇主題數(shù)為3。

六、評(píng)價(jià)主題分析結(jié)果

根據(jù)主題數(shù)尋優(yōu)結(jié)果,使用Python的Gensim模塊對(duì)正面評(píng)論數(shù)據(jù)和負(fù)面評(píng)論數(shù)據(jù)分別構(gòu)建L3,經(jīng)過LDA主題分析后,每個(gè)主題下生成10個(gè)最有可能出現(xiàn)的詞語以及相應(yīng)的概率。

# LDA主題分析pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict) neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict)pos_lda.print_topics(num_words = 10)
[(0,
'0.031*"服務(wù)" + 0.025*"好評(píng)" + 0.021*"信賴" + 0.020*"售后" + 0.019*"人員" + 0.016*"太" + 0.016*"送" + 0.015*"品牌" + 0.014*"電話" + 0.013*"質(zhì)量"'),
(1,
'0.029*"很快" + 0.028*"不錯(cuò)" + 0.026*"值得" + 0.023*"客服" + 0.017*"物流" + 0.017*"差" + 0.014*"速度" + 0.012*"態(tài)度" + 0.012*"贊" + 0.011*"收到"'),
(2,
'0.115*"安裝" + 0.050*"滿意" + 0.038*"師傅" + 0.028*"送貨" + 0.017*"東西" + 0.013*"購物" + 0.012*"家里" + 0.011*"裝" + 0.010*"真的" + 0.010*"預(yù)約"')]
neg_lda.print_topics(num_words = 10)
[(0,
'0.022*"東西" + 0.019*"裝" + 0.016*"加熱" + 0.016*"燒水" + 0.015*"漏水" + 0.013*"真的" + 0.011*"產(chǎn)品" + 0.010*"錢" + 0.009*"電話" + 0.009*"價(jià)格"'),
(1,
'0.140*"安裝" + 0.033*"師傅" + 0.032*"太" + 0.019*"收費(fèi)" + 0.019*"打電話" + 0.018*"貴" + 0.017*"慢" + 0.016*"太慢" + 0.012*"材料" + 0.011*"高"'),
(2,
'0.031*"垃圾" + 0.029*"售后" + 0.027*"差" + 0.023*"安裝費(fèi)" + 0.019*"客服" + 0.018*"小時(shí)" + 0.017*"不好" + 0.017*"收" + 0.012*"人員" + 0.012*"坑人"')]
七、可視化模型訓(xùn)練結(jié)果

import pyLDAvisvis = pyLDAvis.gensim.prepare(pos_lda,pos_corpus,pos_dict)# 需要的三個(gè)參數(shù)都可以從硬盤讀取的,前面已經(jīng)存儲(chǔ)下來了# 在瀏覽器中心打開一個(gè)界面# pyLDAvis.show(vis)# 在notebook的output cell中顯示pyLDAvis.display(vis)綜合以上對(duì)主題及其中的高頻特征詞的分析得出,美的電熱水器有價(jià)格實(shí)惠、性價(jià)比高、外觀好看、服務(wù)好等優(yōu)勢。相對(duì)而言,用戶對(duì)美的電熱水器的抱怨點(diǎn)主要體現(xiàn)在安裝的費(fèi)用高及售后服務(wù)差等方面。因此,用戶的購買原因可以總結(jié)為以下幾個(gè)方面:美的是大品牌值得信賴、美的電熱水器價(jià)格實(shí)惠、性價(jià)比高。

根據(jù)對(duì)京東平臺(tái)上美的電熱水器的用戶評(píng)價(jià)情況進(jìn)行LDA主題模型分析,對(duì)美的品牌提出以下兩點(diǎn)建議:

  1. 在保持熱水器使用方便、價(jià)格實(shí)惠等優(yōu)點(diǎn)的基礎(chǔ)上,對(duì)熱水器進(jìn)行加熱功能上的改進(jìn),從整體上提升熱水器的質(zhì)量。
  2. 提升安裝人員及客服人員的整體素質(zhì),提高服務(wù)質(zhì)量,注重售后服務(wù)。建立安裝費(fèi)用收取的明文細(xì)則,并進(jìn)行公布,以減少安裝過程中亂收費(fèi)的現(xiàn)象。適度降低安裝費(fèi)用和材料費(fèi)用,以此在大品牌的競爭中凸顯優(yōu)勢。

關(guān)鍵詞:數(shù)據(jù),分析,評(píng)論,情感,產(chǎn)品

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉