1. 程式人生 > 其它 >電商產品評論資料感情分析

電商產品評論資料感情分析

抽取資料 我們這裡先抽取出美的品牌的評論資訊:

   import pandas as pd

inputfile = 'huizong.csv' #評論彙總檔案
outputfile = 'meidi_jd.txt' #評論提取後儲存路徑
data = pd.read_csv(inputfile,encoding = 'gb18030')#python3上面匯入中文經常會出錯,utf-8不行要用gb18030

#提取出美的品牌的資料
data = data[data[u'品牌'] == u'美的']
#提取出美的品牌的評論
data = data[u'評論']
#儲存為txt模式,去掉索引號,
data.to_csv(outputfile, index = False, header = False)

評論資訊預處理 很多評論是沒有價值的,如果將這些評論也引入進行分詞,詞頻統計,情感分析,會對結果的準確性造成很程度的影響,所以要需要預處理:

  1. 文字去重

要去出什麼樣的評論: 同一個人的重複評論; 系統自動評論; 複製他人的評論

這裡處理方法是:比較刪除法,直接刪除完全相同的評論:

   import pandas as pd

inputfile = 'meidi_jdzuixin.txt' #評論檔案
outputfile = 'meidi_jd_process_1.txt' #評論處理後儲存路徑
data = pd.read_csv(inputfile, encoding = 'utf-8',header = None)

l1 = len(data)#還沒有比較刪除之前的資料長度
data = pd.DataFrame(data[0].unique())
l2 = len(data)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')

print('刪除了%s條評論。' %(l1 - l2))

刪除了2725條評論。

  1. 機械壓縮去詞

將重複詞刪除掉,只刪除開頭或者結尾的重複詞

  1. 語句刪除

刪除掉小於四個字的無用評論比如所“很不錯”這些的

模型構建 這裡我們假設已經利用COSTCM6把評論分成了“正面情感結果”,“負面情感結果”,“中性情感結果”三類,這裡拋棄“中性情感結果”得到的文字名:‘meidi_jd_process_end_neg.txt’和’meidi_jd_process_end_pos.txt’

基於LDA模型的主題分析: 首先,對於COSTCM6得到的結果,有評分字首: 我們先去除字首:

   import pandas as pd

#引數初始化
inputfile1 = 'meidi_jd_process_end_neg.txt'
inputfile2 = 'meidi_jd_process_end_pos.txt'
outputfile1 = 'meidi_jd_negitive123.txt'
outputfile2 = 'meidi_jd_positive123.txt'

data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None)
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)

data1 = pd.DataFrame(data1[0].str.replace('.*?\d+?\\t ', '')) #用正則表示式修改資料
data2 = pd.DataFrame(data2[0].str.replace('.*?\d+?\\t ', ''))

data1.to_csv(outputfile1, index = False, header = False, encoding = 'utf-8') #儲存結果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')

用jieba分詞:

   import pandas as pd
import jieba #匯入結巴分詞,需要自行下載安裝

#引數初始化
inputfile1 = 'meidi_jd_negitive123.txt'
inputfile2 = 'meidi_jd_positive123.txt'
outputfile1 = 'meidi_jd_neg_cut123.txt'
outputfile2 = 'meidi_jd_pos_cut123.txt'

data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #讀入資料
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)

mycut = lambda s: ' '.join(jieba.cut(s)) #自定義簡單分詞函式,用空格去分詞
data1 = data1[0].apply(mycut) #通過“廣播”形式分詞,加快速度。
data2 = data2[0].apply(mycut)

data1.to_csv(outputfile1, index = False, header = False, encoding = 'utf-8') #儲存結果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')

通過LDA主題分析:

   import pandas as pd

#引數初始化
negfile = 'meidi_jd_neg_cut123.txt'
posfile = 'meidi_jd_pos_cut123.txt'
stoplist = 'stoplist.txt'

neg = pd.read_csv(negfile, encoding = 'utf-8', header = None) #讀入資料
pos = pd.read_csv(posfile, encoding = 'utf-8', header = None)
stop = pd.read_csv(stoplist, encoding = 'utf-8', header = None, sep = 'tipdm',engine = 'python')
#sep設定分割詞,由於csv預設以半形逗號為分割詞,而該詞恰好在停用詞表中,因此會導致讀取出錯
#所以解決辦法是手動設定一個不存在的分割詞,如tipdm。

stop = [' ', ''] + list(stop[0]) #Pandas自動過濾了空格符,這裡手動新增

neg[1] = neg[0].apply(lambda s: s.split(' ')) #定義一個分割函式,然後用apply廣播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐詞判斷是否停用詞,思路同上
pos[1] = pos[0].apply(lambda s: s.split(' '))
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])

from gensim import corpora, models

#負面主題分析
"""問題與編號之間的對映,我們稱其為字典(Dictionary)。
我們利用gensim.corpora.dictionary.Dictionary類為每個出現在語料庫中的單詞分配了一個獨一無二的整數編號。這個操作收集了單詞計數及其他相關的統計資訊。
如果想要檢視單詞與編號之間的對映關係:>>> print(dictionary.token2id)
"""
neg_dict = corpora.Dictionary(neg[2]) #建立詞典
print(neg_dict.token2id) #檢視單詞與編號之間的對映關係
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立語料庫
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型訓練
# ldamodel = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=3, id2word = dictionary, passes=20)
# corpus: 必須。語料庫
# num_topics: 必須。LDA 模型要求使用者決定應該生成多少個主題。由於我們的文件集很小,所以我們只生成三個主題;
# id2word:必須。LdaModel 類要求我們之前的 dictionary 把 id 都對映成為字串;
# passes:可選。模型遍歷語料庫的次數。遍歷的次數越多,模型越精確。但是對於非常大的語料庫,遍歷太多次會花費很長的時間。
# 調整模型的主題數和遍歷次數對於得到一個好的結果是很重要的
for i in range(3):
neg_lda.print_topic(i)
print(neg_lda.print_topic(i)) #輸出每個主題


#正面主題分析
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
for i in range(3):
pos_lda.print_topic(i) #輸出每個主題
print(pos_lda.print_topic(i))

評論文字被聚成三個主題,每個主題下有十個最可能出現的詞: 0.025“安裝” + 0.022“不錯” + 0.020“熱水器” + 0.018“買” + 0.015“知道” + 0.014“美的” + 0.014“好” + 0.009“問題” + 0.007“京東” + 0.006“師傅”

0.024“不錯” + 0.019“安裝” + 0.019“加熱” + 0.018“熱水器” + 0.016“買” + 0.013“有點” + 0.010“好” + 0.009“速度” + 0.009“一個” + 0.008“熱水”

0.059“安裝” + 0.015“買” + 0.015“好” + 0.014“師傅” + 0.013“熱水器” + 0.011“美的” + 0.010“京東” + 0.008“東西” + 0.008“知道” + 0.008“送貨”

0.105“好” + 0.086“不錯” + 0.034“安裝” + 0.023“東西” + 0.022“送貨” + 0.022“買” + 0.021“挺” + 0.019“京東” + 0.016“美的” + 0.015“服務”

0.068“安裝” + 0.020“買” + 0.019“師傅” + 0.015“熱水器” + 0.015“安裝費” + 0.014“不錯” + 0.012“高” + 0.011“美的” + 0.009“一個” + 0.009“材料”

0.032“加熱” + 0.022“不錯” + 0.015“速度” + 0.013“保溫” + 0.013“安裝” + 0.012“很快” + 0.012“熱水器” + 0.011“好” + 0.010“熱水” + 0.009“美的”

從正面評論的第一個主題中的詞可以看出,美的品牌較好,質量不錯,且京東平臺不錯;而從第二個主題可以看出美的品牌安裝不錯;第三個主題中除了安裝還體現了加熱快這個優點。 負面評論是,安裝的問題,主題顯示其實很像是優勢,這應該跟ROSTCM6的情感分析有關。