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

项目背景

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

项目需求

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

项目流程

爬取数据并导出

通过scrapy框架爬取多个电商平台近20w条数据,这里展示下具体代码框架,此篇就不重点介绍了。
在这里插入图片描述

数据分析及训练模型
导入所需模块
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))

在这里插入图片描述

项目结论

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

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

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

  • 13
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值