这个是一个帮弟弟调试的项目,调试过程中觉得这个还是比较全面的,文本数据的基础处理、分词、词云可视化、LDA主题挖掘、分类模型构建等等都包括,对于学习或者入门来说还是不错的。
项目全貌:
项目中使用到的文本评论数据截图如下所示:
首先加载数据:
删除数据记录中所有列值相同的记录
通过人工观察数据发现,评论中夹杂着许多数字与字母,对于本案例的挖掘目标而言,这类数据本身并没有实质性帮助。另外,由于该评论文本数据主要是围绕京东商城中美的电热水器进行评价的,其中“京东”“京东商城”“美的”“热水器”“电热水器”等词出现的频数很大,但是对分析目标并没有什么作用,因此可以在分词之前将这些词去除,对数据进行清洗。
# 去除英文、数字、京东、美的、电热水器等词语
strinfo = re.compile('[0-9a-zA-Z]|京东|美的|电热水器|热水器|')
content = content.apply(lambda x: strinfo.sub('',x))
词是文本信息处理的基础环节,是将一个单词序列切分成单个单词的过程。准确地分词可以极大地提高计算机对文本信息的识别和理解能力。相反,不准确的分词将会产生大量的噪声,严重干扰计算机的识别理解能力,并对这些信息的后续处理工作产生较大的影响。中文分词的任务就是把中文的序列切分成有意义的词,即添加合适的词串使得所形成的词串反映句子的本意,中文分词的关键问题为切分歧义的消解和未登录词的识别。
未登录词是指词典中没有登录过的人名、地名、机构名、译名及新词语等。当采用匹配的办法来切分词语时,由于词典中没有登录这些词,会引起自动切分词语的困难。
分词最常用的工作包是jieba分词包,jieba分词是Python写成的一个分词开源库,专门用于中文分词,其有3条基本原理,即实现所采用技术。
基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)。 采用动态规划查找最大概率路径,找出基于词频的最大切分组合。 对于未登录词,采用HMM模型,使用了Viterbi算法,将中文词汇按照BEMS 4个状态来标记。
分词结果数据格式转化处理,方便后续使用:
之后删除标点符号数据:
构造各词在对应评论的位置列
接下来提取含有名词的评论
由于本案例的目标是对产品特征的优缺点进行分析,类似“不错,很好的产品”“很不错,继续支持”等评论虽然表达了对产品的情感倾向,但是实际上无法根据这些评论提取出哪些产品特征是用户满意的。评论中只有出现明确的名词,如机构团体及其他专有名词时,才有意义,因此需要对分词后的词语进行词性标注。之后再根据词性将含有名词类的评论提取出来。
接下来基于wordcloud词云可视化:
import matplotlib.pyplot as plt
from wordcloud import WordCloud
frequencies = result.groupby('word')['word'].count()
frequencies = frequencies.sort_values(ascending = False)
backgroud_Image=plt.imread('pl.jpg')
# 自己上传中文字体到kesci
wordcloud = WordCloud(font_path='simhei.ttf', # 设置字体,不设置就会出现乱码
max_words=100,
background_color='white',
mask=backgroud_Image)# 词云形状
my_wordcloud = wordcloud.fit_words(frequencies)
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()
由图可以看出,对评论数据进行预处理后,分词效果较为符合预期。其中“安装”“师傅”“售后”“物流”“服务”等词出现频率较高,因此可以初步判断用户对产品的这几个方面比较重视。
接下来对文本数据情感倾向性进行分析:
分别绘制词云图:
基于支持向量机SVM来实现情感识别:
模型训练
准确率评估
最后基于LDA实现主题挖掘分析:
主题数寻优 基于相似度的自适应最优LDA模型选择方法,确定主题数并进行主题分析。实验证明该方法可以在不需要人工调试主题数目的情况下,用相对少的迭代找到最优的主题结构。 具体步骤如下: 取初始主题数k值,得到初始模型,计算各主题之间的相似度(平均余弦距离)。 增加或减少k值,重新训练模型,再次计算各主题之间的相似度。 重复步骤2直到得到最优k值。
LDA主题寻优过程可视化:
LDA主题结果:
最后基于pyLDAvis对LDA挖掘得到的主题进行可交互式可视化展示,截图如下所示:



