Python:電商產品評論數據情感分析,jieba分詞,LDA模型


本節涉及自然語言處理(NLP),具體涉及文本數據采集、預處理、分詞、去停用詞、詞頻分析、LDA主題模型

代碼部分

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Mon Oct  1 12:13:11 2018
 4 
 5 @author: Luove
 6 """
 7 
 8 import os
 9 import pandas as pd
10 import jieba
11 from gensim import corpora, models
12 
13 os.chdir('D:\Analyze\Python Matlab\Python\BookCodes\Python數據分析與挖掘實戰\圖書配套數據、代碼\chapter15\demo\code')
14 filepath='../data/huizong.csv'
15 data=pd.read_csv(filepath)
16 data.head()
17 data_target=data[['評論']][data['品牌']=='美的']
18 #set(data['品牌'])
19 count_1=len(data_target)  # 55774
20 data_target=pd.DataFrame(data_target['評論'].unique())  # 去重后返回時array,需要DataFrame化
21 count_2=len(data_target)  # 53049
22 same_comment_count=count_1-count_2  # 2725,5%
23 
24 inputfile1 = '../data/meidi_jd_process_end_負面情感結果.txt'  # 來之ROSTCM6軟件,情感傾向性分析,負面、中性、正面,這里只研究負面、正面
25 inputfile2 = '../data/meidi_jd_process_end_正面情感結果.txt'
26 
27 with open(inputfile1,'r',encoding='UTF-8') as data1: # 針對含中文名的文件的讀取方式,重編碼成utf-8
28     data1 = pd.read_csv(data1,header = None) #讀入數據
29 with open(inputfile2,'r',encoding='UTF-8') as data2:
30     data2 = pd.read_csv(data2,header = None) #讀入數據    
31 data1 = pd.DataFrame(data1[0].str.replace('.*?\d+?\\t ', '')) #用正則表達式修改數據,非貪婪模式:*?,0個或多個非\n字符  +?,1個或多個數字
32 data2 = pd.DataFrame(data2[0].str.replace('.*?\d+?\\t ', ''))
33 # jieba分詞
34 mycut = lambda s: ' '.join(jieba.cut(s)) #自定義簡單分詞函數,分詞結果通過空格鏈接
35 data1 = data1[0].apply(mycut) #通過“廣播”形式分詞,加快速度。
36 data2 = data2[0].apply(mycut)
37 # 去停用詞
38 stopfilepath='../data/stoplist.txt'
39 stop = pd.read_csv(stopfilepath, encoding = 'utf-8', header = None, sep = 'tipdm')  # 這里sep分割符 非停用詞符均可,這里選的是競賽站名
40 #sep設置分割詞,由於csv默認以半角逗號為分割詞,而該詞恰好在停用詞表中,因此會導致讀取出錯
41 #所以解決辦法是手動設置一個不存在的分割詞,如tipdm。
42 stop = [' ', ''] + list(stop[0]) #Pandas自動過濾了空格符,這里手動添加
43 neg=pd.DataFrame(data1.copy())
44 pos=pd.DataFrame(data2.copy())
45 neg[1] = neg[0].apply(lambda s: s.split(' ')) #定義一個分割函數,然后用apply廣播,每行按空格分隔,每行由str轉變為list
46 neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐詞判斷是否停用詞,思路同上
47 pos[1] = pos[0].apply(lambda s: s.split(' '))
48 pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
49 
50 
51 # =============================================================================
52 # ldamodel = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=3, id2word = dictionary, passes=20) 
53 # corpus: 必須。語料庫
54 # num_topics: 必須。LDA 模型要求用戶決定應該生成多少個主題。由於我們的文檔集很小,所以我們只生成三個主題;
55 # id2word:必須。LdaModel 類要求我們之前的 dictionary 把 id 都映射成為字符串;
56 # passes:可選。模型遍歷語料庫的次數。遍歷的次數越多,模型越精確。但是對於非常大的語料庫,遍歷太多次會花費很長的時間。
57 # 調整模型的主題數和遍歷次數對於得到一個好的結果是很重要的
58 # =============================================================================
59 #負面主題分析
60 neg_dict = corpora.Dictionary(neg[2]) #建立詞典
61 neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立語料庫
62 neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型訓練,一種主題模型,它基於一組文檔中的詞頻生成主題
63 for i in range(3):  # num_topics = 3
64   print(neg_lda.print_topic(i)) #輸出每個主題
65 
66 #正面主題分析
67 pos_dict = corpora.Dictionary(pos[2])
68 pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
69 pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
70 for i in range(3):
71   print(pos_lda.print_topic(i)) #輸出每個主題
72 print(pos_lda.print_topic(num_topics = 3, num_words = 3))

主題分析結果

#負面評價潛在主題
#  聚成3個主題,每個主題下生成10個最可能出現的詞及其概率
0.033*"安裝" + 0.017*"加熱" + 0.014*"" + 0.012*"美的" + 0.011*"" + 0.011*"不錯" + 0.010*"熱水器" + 0.009*"售后" + 0.008*"一個" + 0.007*"速度"
0.037*"安裝" + 0.029*"不錯" + 0.027*"" + 0.018*"熱水器" + 0.017*"" + 0.016*"知道" + 0.013*"師傅" + 0.011*"美的" + 0.011*"京東" + 0.010*"送貨"
0.049*"安裝" + 0.024*"熱水器" + 0.011*"師傅" + 0.011*"" + 0.010*"知道" + 0.008*"有點" + 0.008*"安裝費" + 0.007*"n" + 0.006*"使用" + 0.006*""
#正面評價潛在主題
0.043*"" + 0.032*"不錯" + 0.024*"" + 0.022*"美的" + 0.012*"京東" + 0.012*"一個" + 0.012*"加熱" + 0.011*"熱水器" + 0.010*"熱水" + 0.009*"保溫"
0.099*"不錯" + 0.093*"" + 0.025*"東西" + 0.020*"" + 0.018*"速度" + 0.016*"熱水器" + 0.016*"很快" + 0.016*"價格" + 0.015*"加熱" + 0.015*"質量"
0.094*"安裝" + 0.029*"師傅" + 0.023*"" + 0.016*"送貨" + 0.014*"熱水器" + 0.013*"不錯" + 0.012*"安裝費" + 0.011*"美的" + 0.010*"售后" + 0.008*"很快"
# 從上可以分析主題及其中高頻詞的特征

 

 

 

 

 

Ref:

用 Python 實現 LDA

《數據分析與挖掘實戰》:源代碼及數據需要可自取:https://github.com/Luove/Data

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM