随着网上购物愈来愈流行,人们对于网上购物的需求变得愈来愈高,这让京东,淘宝等电商平台获得了很大的发展机遇。可是,这种需求也推进了更多的电商平台的发展,引起了激烈的竞争。在这种电商平台激烈竞争的大背景下,除了提升商品质量,压低商品价格外,了解更多的消费者心声对于电商平台来讲也愈来愈重要。其中很是重要的一种方式就是针对消费者的文本评论数据进行内在信息的数据挖掘分析。而获得这些信息,也有利于对应商品的生产自身竞争力的提升。前端
#-*- coding: utf-8 -*-
import pandas as pd
inputfile = 'huizong.csv' #评论汇总文件
outputfile = 'meidi_jd.txt' #评论提取后保存路径
data = pd.read_csv(inputfile, encoding = 'utf-8')
data.head()
复制代码
data['品牌'].unique()
复制代码
结果:array(['AO', '海尔', '美的', '格兰仕', '万和', '万家乐'], dtype=object)
咱们发现这一份数据中有AO、海尔、美的、格兰仕、万和、万家乐共6个品牌,咱们这里只对‘美的’品牌的文本评论数据进行分析。python
# 这里咱们只提取”美的“品牌的评论
import os
import importlib
import sys
importlib.reload (sys)
# 默认编码
sys.getdefaultencoding() # 查看当前编码格式
data = data[[u'评论']][data[u'品牌'] == u'美的']
# 把数据保存为csv文件
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')
outdata_1 = pd.read_csv(outputfile, encoding = 'utf-8', header = None)
outdata_1.head()
复制代码
取到文本后,首先要进行文本评论数据的预处理,文本评论数据中存在大量价值含量很低甚至没有价值含量的条目,若是将这些评论也引入进行分词,词频统计,甚至情感分析,必然对分析形成很大的影响,获得的结果质量也必然存在问题。那么,在利用这些评论数据以前就必须对这些文本进行预处理,把大量的此类无价值含量的评论去除。git
文本去重就是去除文本评论数据中重复的部分,一些电商平台为了不一些客户长时间不进行评论,每每设置一道程序,若是用户超过规定的时间仍然没有作出评论,系统就会自动代替客户作出评论,每每这些评论大都是好评。可是,这些评论显然没有任何分析价值,并且,这些评论是大量重复出现的,必须去除。github
outputfile = 'meidi_jd_process_1.txt' #评论处理后保存路径
l1 = len(outdata_1)
data_unique = pd.DataFrame(outdata_1[0].unique())
l2 = len(data_unique)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')
print(u'共%s条评论,删除了%s条评论。' %(l1,l1 - l2))
复制代码
结果:共55400条评论,删除了2352条评论。
咱们使用 value_counts 函数统计重复的评论,能够获得重复评论文本的重复数量,数量最大的评论文本多是系统默认评论。app
series_data = pd.Series(outdata_1[0])
fre_data = pd.DataFrame(series_data.value_counts())
fre_data.head(20)
复制代码
这里咱们仅仅打印出来前20行,能够看出 “很是满意,五星”出现频率最高,一共出现 107 次,它应该是系统默认评论。而“长度在5-200个字之间 填写您对此商品的使用心得,例如该商品或某功能为您带来的帮助,或使用过程当中遇到的问题等。最多可输入200字”一共出现75次,是默认评论数第二大的,这应该也是系统提示评论或者用户直接使用系统提示进行评论。机器学习
在中文中只有字,句和段落可以经过明显的分界符进行简单的划界,而对于”词“与”词组“来讲,它们的边界模糊,没有一个形式上的分界符。所以,在进行中文文本挖掘时,首先对文本进行分词,即将连续的字序列按照必定的规范进行从新组合成词序列的过程。这里咱们使用 jieba 分词器。函数
import jieba #导入结巴分词,须要自行下载安装
inputfile1 = 'meidi_jd_neg.txt'
inputfile2 = 'meidi_jd_pos.txt'
outputfile1 = 'meidi_jd_neg_cut.txt'
outputfile2 = '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, index = False, header = False, encoding = 'utf-8') #保存结果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')
data1.head()
复制代码
停用词(Stop Words) ,词典译为“电脑检索中的虚字、非检索用字”。在SEO中,为节省存储空间和提升搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这些字或词即被称为Stop Words(停用词)。在天然语言处理中,停用词通常不携带有价值的信息,咱们选择去除掉这些词。学习
import os
import sys
sys.getdefaultencoding() # 查看当前编码格式
import importlib
importlib.reload(sys)
stoplist = 'stoplist.txt'
neg = pd.read_csv(outputfile1, encoding = 'utf-8', header = None) #读入数据
pos = pd.read_csv(outputfile2, 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])
neg.head()
复制代码
主题模型在机器学习和天然语言处理等领域是用来在一系列文档中发现抽象主题的一种的统计模型。对于一篇文档,若是它有多个主题,则这些特定的可表明不一样主题的词语反复出现,此时,运用主题模型,可以发现文本中使用词语的规律,而且规律类似的文本联系到一块儿,以寻求非结构化的文本集中的有用信息。LDA 模型做为其中的一种主题模型,属于无监督的生成式主题几率模型。大数据
# 没有安装 gensim ,能够试用 !pip install gensim 进行安装
from gensim import corpora, models
#负面主题分析
neg_dict = corpora.Dictionary(neg[2]) #创建词典
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #创建语料库
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练
#正面主题分析
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
复制代码
pos_theme = pos_lda.show_topics()#展现主题
pos_theme
复制代码
import re
# 匹配中文字符
pattern = re.compile(r'[\u4e00-\u9fa5]+')
# 主题一的特征词
pattern.findall(pos_theme[0][1])
复制代码
而后取得每一个主题的特征词并转换为 DataFrame 格式网站
# 取得每一个主题的特征词
pos_key_words=[]
for i in range(3):
pos_key_words.append(pattern.findall(pos_theme[i][1]))
复制代码
# 变成 DataFrame 格式
pos_key_words = pd.DataFrame(data=pos_key_words,index=['主题1',"主题2","主题3"])
pos_key_words
复制代码
本文针对京东商城上“美的”品牌的热水器的消费者的文本评论数据进行建模,在对文本进行基本的预处理、中文分词、停用词过滤后,经过创建 LDA 主题模型的数据挖掘模型,实现对文本评论数据的倾向性判断以及将关于主题的高频特征词以 DataFrame 格式呈现。
你们能够在项目源码地址 fork 这个项目 momodel.cn/explore/5d3…
参考资料:
github.com/goto456/sto…
github.com/fxsjy/jieba
Mo(网址:momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。
Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于下降人工智能开发与使用门槛的俱乐部。团队具有大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具有从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。
目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不按期进行论文分享与学术交流。但愿能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推进人工智能民主化、应用普及化。