情感分析

Reads: 2089 Edit

1 问题描述

对于网购的评价,既可能存在好评,又可能存在差评。我们这里可以分别将好评的评论内容和差评的评论内容爬取下来,并分别绘制好评和差评的词云,对比差评和好评的词语,从而对购物者的评价进行情感分析。

网购评论中本身存在好评和差评的情感标签。对于一些纯内容的文本(如一篇小说)进行情感分析,则需要借助情感词库来对内容进行统计分,目前这类方法主要受制于情感词库的优劣,这里不再演示。

2 爬取京东商品的评论数据(动态网页)

2.1 安装并加载RCurl包

> install.packages('RCurl')
> library(RCurl)
> library(tidyverse)           #处理字符串    

2.2 定义该网页的网址

注意:网页评论的地址并不是商品网页的地址,需要采用如下形式获取网址信息。

第一步:打开浏览器的“检查元素”功能,切换到network选项。

r-104

第二步:刷新整个商品网页

第三步:点击页面上的商品评价按钮,然后再点击好评!

r-110-1

第四步:点击“检查元素”工具栏以“productPageComments...”开头的条目(这一步不同购物网站不一样,需要尝试、摸索、寻找)。右侧的Request URL就是商品评价的网络地址信息。可以看到,对于好评的评论,URL中score=3。

说明:该网址中有“fetchJSON”的字样,因而其请求的不是html的网页内容,而是JSON数据文件(JSON是存放数据的一种文件格式)。

r-110-2

第五步:切换到差评

r-110-3

第六步:点击“检查元素”工具栏以“productPageComments...”开头的条目(这一步不同购物网站不一样,需要尝试、摸索、寻找)。右侧的Request URL就是商品评价的网络地址信息。可以看到,对于好评的评论,URL中score=1。

r-110-4

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')

说明:虽然词云中有一些无用的词,但是在好评的词云中,可以看到好、外观、拍照、速度等关键词,表示这些属性受到好评。

r-110-5

> wordcloud2(df_neg, size =0.3, fontFamily = "微软雅黑",color = "random-light", backgroundColor = "white",shape = 'circle')

说明:虽然词云中有一些无用的词,但是在好评的词云中,可以看到降价、耳机、拍照等关键词,表示这些属性收到差评。

r-110-6


Comments

Make a comment