1 问题描述
对于网购的评价,既可能存在好评,又可能存在差评。我们这里可以分别将好评的评论内容和差评的评论内容爬取下来,并分别绘制好评和差评的词云,对比差评和好评的词语,从而对购物者的评价进行情感分析。
网购评论中本身存在好评和差评的情感标签。对于一些纯内容的文本(如一篇小说)进行情感分析,则需要借助情感词库来对内容进行统计分,目前这类方法主要受制于情感词库的优劣,这里不再演示。
2 爬取京东商品的评论数据(动态网页)
2.1 安装并加载RCurl包
> install.packages('RCurl')
> library(RCurl)
> library(tidyverse) #处理字符串
2.2 定义该网页的网址
注意:网页评论的地址并不是商品网页的地址,需要采用如下形式获取网址信息。
第一步:打开浏览器的“检查元素”功能,切换到network选项。
第二步:刷新整个商品网页
第三步:点击页面上的商品评价按钮,然后再点击好评!
第四步:点击“检查元素”工具栏以“productPageComments...”开头的条目(这一步不同购物网站不一样,需要尝试、摸索、寻找)。右侧的Request URL就是商品评价的网络地址信息。可以看到,对于好评的评论,URL中score=3。
说明:该网址中有“fetchJSON”的字样,因而其请求的不是html的网页内容,而是JSON数据文件(JSON是存放数据的一种文件格式)。
第五步:切换到差评
第六步:点击“检查元素”工具栏以“productPageComments...”开头的条目(这一步不同购物网站不一样,需要尝试、摸索、寻找)。右侧的Request URL就是商品评价的网络地址信息。可以看到,对于好评的评论,URL中score=1。
2.3 获取好评和差评的评论内容数据
在脚本文件中运行如下程序脚本,获取前21页的评论信息:
comment_pos=NULL
comment_neg=NULL
for(i in 0:20){
url_neg = paste0('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100016799352&score=1&sortType=5&page=',i,'&pageSize=10&isShadowSku=0&fold=1')
web_neg = getURL(url_neg,.encoding='GBK')
web_neg = substr(web_neg,nchar("fetchJSON_comment98")+2,nchar(web_neg)-2)
JSONData_neg=jsonlite::fromJSON(web_neg)
cmt_neg=JSONData_neg$comments$content %>% str_remove_all("\\n") %>% str_remove_all(" ")
comment_neg=c(comment_neg,cmt_neg)
}
for(i in 0:20){
url_pos = paste0('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100016799352&score=3&sortType=5&page=',i,'&pageSize=10&isShadowSku=0&fold=1')
web_pos = getURL(url_pos,.encoding='GBK')
web_pos = substr(web_pos,nchar("fetchJSON_comment98")+2,nchar(web_pos)-2)
JSONData_pos=jsonlite::fromJSON(web_pos)
cmt_pos=JSONData_pos$comments$content %>% str_remove_all("\\n") %>% str_remove_all(" ")
comment_pos=c(comment_pos,cmt_pos)
}
说明: paste0()函数用于拼接页面0到20的页面url。运行脚本后comment_pos和comment_neg变量分别存放了好评和差评的评论数据。
3 对评论数据进行分词
> words_pos=segmentCN(as.character(comment_pos))
> words_neg=segmentCN(as.character(comment_neg))
> words_pos=unlist(words_pos)
> words_neg=unlist(words_neg)
> df_pos = as.data.frame(table(words_pos))
> head(df_pos)
words_pos Freq
1 0 2
2 0hz 1
3 1 26
4 10 5
5 100 4
6 10000 5
> df_neg = as.data.frame(table(words_neg))
> head(df_neg)
words_neg Freq
1 1 3
2 10 1
3 100 8
4 12 1
5 13 1
6 2 2
说明:我们这里仅仅演示情感分析的主要步骤,由于分词后没有去除数字、停词(如:“的”、“了”、“是”)等,因而会存在一些无用的词。
4 绘制词云
> wordcloud2(df_pos, size =0.3, fontFamily = "微软雅黑",color = "random-light", backgroundColor = "white",shape = 'circle')
说明:虽然词云中有一些无用的词,但是在好评的词云中,可以看到好、外观、拍照、速度等关键词,表示这些属性受到好评。
> wordcloud2(df_neg, size =0.3, fontFamily = "微软雅黑",color = "random-light", backgroundColor = "white",shape = 'circle')
说明:虽然词云中有一些无用的词,但是在好评的词云中,可以看到降价、耳机、拍照等关键词,表示这些属性收到差评。