本章主要实战目的是对京东平台上的热水器评论进行文本挖掘分析,包括分析其用户情感倾向、从评论文本中挖掘出该品牌热水器的优点与不足和提炼不同品牌热水器的卖点。
本文主要包括以下几个部分:
评论数据抽取旨在选择某一个具体品牌进行评论分析,按照书中步骤选择抽取美的品牌的评论数据。
代码如下:
import pandas as pd
inputfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/huizong.csv'
outputfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd.txt'
data=pd.read_csv(inputfile,encoding='utf-8')
data=data[[u'评论']][data[u'品牌']==u'美的']
data.to_csv(outputfile,index=False,header=False,encoding='utf-8')
评论数据抽取完成后,需要对数据进行预处理,预处理包括文本去重、机械压缩去词以及短句删除。
由于机械压缩去词还没有摸索出来,因此这里暂时只进行文本去重。
文本去重,即去掉评论数据中重复的部分,比如一些默认评论、同一个人购买多件商品所出现的重复评论、不同用户为了省事复制粘贴的评论等等。
书中没有用到复杂的文本去重算法,只用了简单的unique()方法。
代码如下:
import pandas as pd
inputfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd.txt'
outputfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_process1.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,encoding='utf-8',header=False,index=False)
print u'删除了%s条评论。'%(l1-l2)
利用这种方法,最后删除了2725条评论。
在构建模型之前,先利用武汉大学的内容分析工具ROSTCM6对文本进行了情感分析,得出了积极样本和消极样本,然后需要对两者进行删除前缀评分处理和分词处理。
之前写论文的时候曾经对这个工具进行过使用,是比较便捷的内容分析工具,很容易上手,此处不另外说明了。
删除前缀评分
用工具得出来的最后结果前面是有情感得分的,需要删除这个前缀。
代码如下:
import pandas as pd
#参数初始化
inputfile1='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/meidi_jd_process_end_negtive.txt'
inputfile2='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/meidi_jd_process_end_positive.txt'
outputfile1='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_neg.txt'
outputfile2='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_pos.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')
分词
文本分词是将连续的字序列按照一定的规范重新组合成词序列的过程。书中采用python的中文分词包——jieba对评论数据进行分词。
代码如下:
import pandas as pd
import jieba
#参数初始化
inputfile1='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_neg.txt'
inputfile2='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_pos.txt'
outputfile1='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_neg_cut.txt'
outputfile2='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data2/meidi_jd_pos_cut.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,encoding='utf-8',header=False,index=False)
data2.to_csv(outputfile2,encoding='utf-8',header=False,index=False)
本章所用模型为LDA主题模型。该模型是由Blei等人在2003年提出的生成式主题模型,模型认为每一篇文档的每一个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”。LDA具体原理可参考主题模型-LDA浅析。
python中的自然语言处理包-gensim中有LDA算法。
关于模型构建的代码如下:
#-*-coding:utf-8 -*-
import pandas as pd
#参数初始化
negfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/meidi_jd_neg_cut.txt'
posfile='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/meidi_jd_pos_cut.txt'
stoplist='D:/ProgramData/PythonDataAnalysiscode/chapter15/demo/data/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')
#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])
#从自然语言处理包中导入程序包,其中corpora代表原始文本的集合(语料),models代表各个主题模型
from gensim import corpora,models
#负面主题分析
#训练语料预处理
neg_dict=corpora.Dictionary(neg[2])#建立词典
neg_corpus=[neg_dict.doc2bow(i) for i in neg[2]]#建立语料库
#LDA模型训练
neg_lda=models.LdaModel(neg_corpus,num_topics=3,id2word=neg_dict)
for i in range(3):
neg_lda.print_topic(i)#输出每个主题
#正面主题分析
#训练语料预处理
pos_dict=corpora.Dictionary(pos[2])#建立词典
pos_corpus=[pos_dict.doc2bow(i) for i in pos[2]]
#LDA模型训练
pos_lda=models.LdaModel(pos_corpus,num_topics=3,id2word=pos_dict)
for i in range(3):
pos_lda.print_topic(i)#输出每个主题
经过LDA主题分析后,聚成三个主题,按理应该输出每个主题下生成的10个最有可能出现的词语及其概率,代表评论文本中的潜在主题。但不知道为什么没有输出内容,因此本文又用show_topics()方法来展示正面评论和负面评论每个主题的情况。
代码如下:
pos_lda.show_topics()
neg_lda.show_topics()
正面评论的潜在主题如下所示:
负面评论的潜在主题则如下所示:
从正面评论的第一个主题中的词可以看出,美的品牌较好,质量不错,且京东平台不错;而从第二个主题可以看出美的品牌安装不错;第三个主题中除了安装还体现了加热快这个优点。
而分析负面评论的三个主题,则三个主题明显都跟安装有关系(主题显示其实很像是优势,这应该跟ROSTCM6的情感分析有关,但通过观察负面评价的原数据发现是蛮正常的,所以不知道是什么情况……)。
所以美的品牌的主要优势在于品牌优势、质量好、加热速度快等,而劣势则主要在于安装。
文本分析、自然语言处理是非常庞大而且重要的知识点,肯定不能单凭这样一个实战就搞清楚,但通过这个实践,对LDA主题模型、文本分析的整体流程以及python中所涉及到的程序包都有了一定了解,也算是一个不错的收获。
————————————————————————————————————
自此,关于《Python数据分析与数据挖掘实战》这本书的整理就结束了。