python文本分析 __机器学习之LDA模型

客户评论分析

  • 项目背景
  • 项目需求
  • 项目流程
        • 爬取数据并导出
        • 数据分析及训练模型
          • 导入所需模块
          • 数据预处理
          • 情感分析
          • 分词
          • 训练模型
  • 项目结论
          • 差评

项目背景

现在大家在进行网购过程中,肯定会看商品的相关评论,然后再综合衡量,最后决定是否购买相关产品。甚至不少消费者会先略过详情页直接看评论,然后决定是否下单,那么商品评论就成为了用户是否购买的核心因素之一了,因此了解商品给用户的体验尤为重要。

项目需求

对指定某一/类商品,生产商,卖家需要了解用户认同的优点和不认同的缺点。

项目流程

爬取数据并导出

通过scrapy框架爬取多个电商平台近20w条数据,这里展示下具体代码框架,此篇就不重点介绍了。
python文本分析 __机器学习之LDA模型_第1张图片

数据分析及训练模型

导入所需模块
import pandas as pd
import numpy as np
import csv
import codecs
from snownlp import SnowNLP
import jieba
from pandas import Series,DataFrame
from gensim import corpora,models
数据预处理

数据预处理包括数据去重以及机械压缩去词
由于代码不是同一天编写,所以我习惯性运行一步就导出一步,后面再导入数据,以免多次运行浪费时间。

# 文本去重
data = pd.read_csv('huizong.csv',encoding = 'utf-8')
data = data.dropna() # 删除空值
l1 = len(data)
data = pd.DataFrame(data['评论'].unique()) # 删除重复值
l2 = len(data)
data.to_csv('pinglun.csv',index = False,encoding='utf-8')
print(f'删除了{l1 - l2}条评论')
# 机械压缩去词
f = codecs.open('pinglun2.csv' ,'w','utf-8')
def cutword(strs,reverse = False):
    for A_string in strs: 
        temp1= A_string[0].strip('\n')       #去掉每行最后的换行符'\n' 
        temp2 = temp1.lstrip('\ufeff') 
        temp3= temp2.strip('\r')
        char_list=list(temp3)   
        list1=['']
        list2=['']
        del1=[]
        flag=['']
        i=0
        while(i<len(char_list)):
            if (char_list[i]==list1[0]):
                if (list2==['']):
                    list2[0]=char_list[i]
                else:
                    if (list1==list2):
                        t=len(list1)
                        m=0
                        while(m<t):
                            del1.append( i-m-1)
                            m=m+1
                        list2=['']
                        list2[0]=char_list[i]
                    else:
                        list1=['']
                        list2=['']
                        flag=['']
                        list1[0]=char_list[i]
                        flag[0]=i       
            else:
                if (list1==list2)and(list1!=[''])and(list2!=['']):
                    if len(list1)>=2:
                        t=len(list1)
                        m=0
                        while(m<t):
                            del1.append( i-m-1)
                            m=m+1  
                        list1=['']
                        list2=['']
                        list1[0]=char_list[i]
                        flag[0]=i
                else:
                    if(list2==['']):
                        if(list1==['']):
                            list1[0]=char_list[i]
                            flag[0]=i
                        else:
                            list1.append(char_list[i])
                            flag.append(i)
                    else:
                        list2.append(char_list[i])
            i=i+1
            if(i==len(char_list)):
                if(list1==list2):
                        t=len(list1)
                        m=0
                        while(m<t):
                            del1.append( i-m-1)
                            m=m+1 
                        m=0
                        while(m<t):
                            del1.append(flag[m])
                            m=m+1                 
        a=sorted(del1)
        t=len(a)-1
        while (t>=0):
            #print(char_list[a[t]])
            del char_list[a[t]]
            t=t-1
        str1 = "".join(char_list)  
        str2=str1.strip() #删除两边空格
        if len(str2)>4: # 短句过滤
            f.writelines(str2+'\r\n')
    f.close()
    return  
data1 = pd.read_csv('pinglun.csv',encoding = 'utf-8')
data2 = cutword(data1.values)
情感分析

通过SnowNLP模块对词性进行情感系数分析

# 情感分析
data3 = pd.read_csv('pinglun2.csv',encoding = 'utf-8',delimiter='\t')
index = []
values = []
for i in range(len(data3.评论)):
    s = SnowNLP(str(data3.评论[i]))
    for j in s.sentences:
        # 将每个评论序号放在列表,以便后续分组
        index.append(i)
        print(i)
        # 将评分放到另外一个列表
        values.append(SnowNLP(j).sentiments)
# 将序号和评分存放在列表中
huizong = DataFrame({'序号':index,'评分':values})
# 求其每条评论均值,并添加到表中
junzhi = huizong.groupby('序号').评分.mean()
data3['评分系数'] = junzhi
# 保存
data3.to_csv('pinglun3.csv',index = False,encoding='utf-8')
分词

使用jieba模块分别对好差评进行处理,这里评级标准根据不同行业各有不同。

# jieba分词
data4 = pd.read_csv('pinglun3.csv',encoding = 'utf-8')
# 区分差好评
good = data4[data4['评分系数']>0.7]
bad = data4[data4['评分系数']<=0.3]

# 分词过后,遍历一下停用词表,去掉停用词
def stopwordslist(filepath):  
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]  
    return stopwords  

# 对句子进行分词  
def seg_sentence(sentence):  
    sentence_seged = jieba.cut(sentence.strip())  
    stopwords = stopwordslist('stoplist.txt')  # 这里加载停用词的路径  
    outstr = ''  
    for word in sentence_seged:  
        if word not in stopwords:  
            if word != '\t':  
                outstr += word  
                outstr += " "  
    return outstr

# 读取数据输出字符串格式
def import1(o):
    list1 = []
    for line in o:
        l = seg_sentence(line)
        n = l.split(' ')
        for i in n:
            list1.append(i)
    return list1

good2 = import1(good.评论)
bad2 = import1(bad.评论)
训练模型

LDA模型训练,其中分析维度可以自己设定,这里使用的是3组,分别得出不同好差评信息。

# LDA主题分析
good3 = pd.DataFrame(good2)
bad3 = pd.DataFrame(bad2)
# 正面主题分析
neg_dict = corpora.Dictionary(good3.values) # 建立词典
neg_corpus = [neg_dict.doc2bow(i) for i in good3.values] # 建立词料库
neg_lda = models.LdaModel(neg_corpus,num_topics = 3,id2word = neg_dict) # LDA模型训练
for i in range(3):
    print(str(i))
    print(neg_lda.print_topic(i))

    
# 负面主题分析
pos_dict = corpora.Dictionary(bad3.values) # 建立词典
pos_corpus = [pos_dict.doc2bow(i) for i in bad3.values] # 建立词料库
pos_lda = models.LdaModel(neg_corpus,num_topics = 3,id2word = pos_dict) # LDA模型训练
for i in range(3):
    print(str(i))
    print(pos_lda.print_topic(i))

python文本分析 __机器学习之LDA模型_第2张图片

项目结论

模型搭建完成,解读结果也是很重要的一步,这里不难可以发现各个维度好差评的原因以及对应的频数,这里我大致提炼了下差评关键字。

差评
term1 term2 term3
电热水器 插座 便宜
客服 师傅 不好
热水 装修 信任
验货 型号 安装

?????????????????感谢观看??????????????????

你可能感兴趣的:(数据分析—机器学习,python,数据分析,jieba,LDA,SnowNLP)