爬取京东评论数据进行情感分类
本文作者:王 彤,中南财经政法大学统计与数学学院
本文编辑:杨婉清
技术总编:陈 鼎
Stata&Python云端课程来啦!
好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
导读
近年来,文本的情感分析一直是自然语言处理领域研究的热点。随着电子商务的迅速发展,人们在享受便捷购物的同时,也为购物网站提供了大量的评论数据,如何利用好这些非结构化数据是个值得思考的问题。本文爬取了一部分京东商城上用户关于华为手机的评论,使用朴素贝叶斯算法对评论数据进行简单情感分类介绍。
数据获取
京东商城手机评论数据的传输使用了js格式,所以爬取思路非常简单,只需要找到存放我们想要的信息的具体地址即可。
打开京东商城网站,进入一个具体商品的网页,找到商品评论板块,Ctrl+U
查看网页源代码并不能找到评论信息,说明网页是动态加载设计。可以使用F12快捷键打开开发者人员工具,依次选中Network
、JS
,筛选出js类型文件,点击下一页
可以筛选出每一页存放信息的js文件。
点开任意一个js文件,可以发现具体的真实URL地址,请求方式以及请求头和请求参数等信息。请求参数中,score参数规定了评论的类型,score=3
说明是好评数据;page
参数说明了当前查看的页数。
对真实地址发起get请求,从而得到json形式,实质为字符串的内容,使用json.loads()
函数将字符串转换为python可以处理的json格式。
def get_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'}
html = requests.get(url = url,
headers = headers).text
json_html = json.loads(html.split('fetchJSON_comment98(')[1][:-2])
return json_html
json格式的数据有着严格名称与数值相对应的格式,类似于python的字典格式,所以取值比较方便。具体可以写成如下的函数,注意作者在爬取数据时按照评论的类型存入到MySQL数据库不同的表中,所以在定义函数时添加了一个type
参数。
def parse_page(json_html,type):
comments_dict = {}
comments_list = []
for comment in json_html['comments']:
comments_dict['referenceName'] = comment['referenceName']
comments_dict['creationTime'] = comment['creationTime']
comments_dict['nickname'] = comment['nickname']
comments_dict['content'] = comment['content']
comments_dict['type'] = type
comments_list.append(list(comments_dict.values()))
return comments_list
数据读入
爬取到好评、中评、差评的数据存入到MySQL数据库,接下来需要将数据读入到python中进行处理。以好评数据为例,使用以下代码进行数据读取。
import pymysql
import pandas as pd
db = pymysql.connect('localhost','root','你的数据库密码','jddb',charset='utf8')
cursor = db.cursor()
sel_01 = 'select * from good_comments;'
df1 = pd.read_sql(sel_01,con=db)
读取数据如下:
数据预处理
评论数据,作为非结构化的文本数据,需要对其进行一定的预处理操作。本文主要对数据进行简单的去重操作,对数据集中中重复的数据进行删除,只保留第一次出现的文本;另外删除文本中一些经常出现但是对分析用处不大的词语。经过处理后的数据集可以对文本进行分词,并打乱原始数据以生成更加可靠的数据集。
df.drop_duplicates(subset='content',keep='first',inplace=True)
df['content'] = df['content'].str.replace('[A-Za-z0-9]+|京东|手机|华为手机|华为','')
#分词,去除停用词
import jieba
#读入停用词文件
stop_list = list(pd.read_csv('./jd/stoplist.txt',sep='\r\n',names=['a'],encoding='utf-8').a)
def m_cut(contence):
words = [i for i in jieba.lcut(contence) if i not in stop_list and len(i)>1]
result = ' '.join(words)
return(result)
df['cut_content'] = df['content'].apply(m_cut)
df = df.reset_index()
#随机打乱数据
from sklearn.utils import shuffle
df = shuffle(df)
特征提取
对文本提取词袋模型作为模型的输入特征。词袋模型并没有考虑句子的语法和语序问题,只是将每个词语看做独立的,将所有的词装进一个袋子,计算一个句子中每个词出现的次数进行文本的向量化表示。
contents = df['content'].apply(m_cut)
from sklearn.feature_extraction.text import CountVectorizer
#计算每个词在各评论中出现的次数,并将稀疏度为99%以上的词删除
vec = CountVectorizer(min_df = 0.01)
#文档词条矩阵
dtm = vec.fit_transform(contents).toarray()
#矩阵的列名
columns = vec.get_feature_names()
#将矩阵转化为数据框,即X变量
X = pd.DataFrame(dtm,columns=columns)
#情感标签变量
y = df['type']
伯努利贝叶斯分类器
将原始数据集划分为训练集与测试集,构建伯努利分类器,并将模型在训练集上进行拟合。
#划分训练集和测试集
from sklearn.model_selection import train_test_split
from sklearn import naive_bayes,metrics
x_train,x_test,y_train,y_test = train_test_split(X, y, test_size=0.3,random_state=123456)
#构建伯努利贝叶斯分类器
bnb = naive_bayes.BernoulliNB()
#模型在训练集数据上拟合
bnb.fit(x_train,y_train)
#模型在测试集上预测
bnb_pred = bnb.predict(x_test)
#模型预测的准确率
print('模型的准确率为:\n',metrics.accuracy_score(y_test,bnb_pred))
计算模型预测的准确率为0.9328,说明模型拟合效果还比较好。
本文爬取了一些评论数据进行了简单的分类介绍,对文本分析感兴趣的伙伴赶快自己动手尝试一下吧!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
Stata与音乐之间的酷炫连接
这些年,爬虫俱乐部走出的博士们!看这里,近五年各校高被引论文上榜名单!
高校经管类核心期刊发文排行榜
疯狂的科研创新加速器——Stata!
可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!
好玩有趣的手绘图形库——cutecharts
爬虫实战|摩尔庄园微博话题讨论
一季度财报出炉,哪些公司最烧钱?
一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》 数据可视化利器——Matplotlib从第七次人口普查看中国人口变化|Stata与Python交互绘图
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
零值太多怎么办?解锁Stata17新命令ziologit
Stata17新功能之Python API 小罗肥归升级啦|解锁Stata17之新命令xtmlogit 初识PyStata
辞旧迎新——Stata17之Do-file编辑器优化
Stata17新亮点——解放表格输出生产力
【爬虫+可视化】链家网北京租房信息
手把手教你如何获取股票数据和可视化
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。