1、爬取评论
rvest()包介绍
————————————————
读取与提取:
read_html( ) 读取html文档的函数
html_nodes( ) 选择提取文档中指定元素的部分
html_name( ) 提取标签名称;
html_text( ) 提取标签内的文本;
html_attr( ) 提取指定属性的内容;
html_attrs( ) 提取所有的属性名称及其内容;
html_table( ) 解析网页数据表的数据到R的数据框中;
html_form( ) 提取表单。
乱码处理:
iconvlist() 查看编码方式完整列表
guess_encoding( ) 用来探测文档的编码,方便我们在读入html文档时设置正确的编码格式
repair_encoding( ) 用来修复html文档读入后的乱码问题
行为模拟:
set_values( ) 修改表单
submit_form( ) 提交表单
html_session( ) 模拟HTML浏览器会话
jump_to( ) 得到相对或绝对链接
follow_link( ) 通过表达式找到当前页面下的链接
session_history( ) 历史记录导航工具
————————————————
library(pacman)
p_load(rvest,stringr,tidyverse)
#因为豆瓣网反爬措施,爬取多个网页一直报Forbidden (HTTP 403),所以本次只爬一页
url <- "https://movie.douban.com/subject/25853071/comments?start=0&limit=20&sort=new_score&status=P&percent_type="
webpage <- read_html(url,encoding = "UTF-8")
#爬取该页所有评论
cmt <- html_node(webpage,"div#comments.mod-bd")
#获取评论用户名、评论时间,清洗成需要的格式
names <- html_nodes(cmt,"span.comment-info") %>% html_text() %>%
gsub(" ","",.) %>% gsub("\n\n","",.) %>% gsub("\n"," ",.) %>% str_trim(.,side = "both")
#将names分裂为三列,分别为"name","status", "date"
names <-as.data.frame(names)
df <- separate(names, col = names, into = c("name","status", "date"), sep = " ")
#获取评论内容
comments <- html_nodes(cmt,"span.short") %>% html_text()
#将comments加入到df数据框
df$comment <- comments
#写入文件
write.csv(df,"qingyunian.csv")
2、文本分析
jiabaR默认分词引擎介绍
————————————————
wk <- worker()
- type = "mix", #引擎的类型有: mix, mp, hmm,query, tag, simhash和 keywords。默认参数
mp(最大概率模型)- 基于词典和词频
hmm(HMM模型)- 基于 HMM 模型,可以发现词典中没有的词
mix(混合模型)- 先用 mp 分,mp 分完调用 hmm 再来把剩余的可能成词的单字分出来。
query(索引模型)- mix 基础上,对大于一定长度的词再进行一次切分。
tag(标记模型)- 词性标记,基于词典的
keywords(关键词模型)- tf-idf 抽关键词
simhash(Simhash 模型) - 在关键词的基础上计算 simhash - dict = DICTPATH, #优先载入的词典,纯文本文件,默认路径为 jiebaR::DICTPATH 包括词、词频、词性标记三列,用空格分开三列。可以输入自定义路径。
- hmm = HMMPATH,
- user = USERPATH,#用户词典,包括词、词性标记两列。用户词典中的所有词的词频均为系统词典中的最大词频 (默认,可以通过 user_weight 参数修改)。
- idf = IDFPATH, #IDF 词典,关键词提取使用。
- stop_word = STOPPATH, #关键词提取使用的停止词库。分词时也可以使用,但是分词时使用的对应路径不能为默认的 jiebaR::STOPPATH。
- write = T, #是否将文件分词结果写入文件,默认为否。只在输入内容为文件路径时,本参数才会被使用。本参数只对分词和词性标注有效。
- qmax = 20, #索引模型中,最大可能成词的字符数。
- topn = 5,#提取的关键词数。
- encoding = "UTF-8", #输入文件的编码,默认为UTF-8。
- detect = T, #是否检查输入文件的编码,默认检查。
- symbol = F, #是否保留符号,默认不保留符号。
- lines = 1e+05,#每次读取文件的最大行数,用于控制读取文件的长度。对于大文件,实现分次读取。
- output = NULL, #指定输出路径,一个字符串路径。只在输入内容为文件路径时,本参数才会被使用。
- bylines = F, #文件结果是否按行输出,如果是,则将读入的文件或字符串向量按行逐个进行分词操作。
————————————————
中文分词
p_load(jiebaR,wordcloud)
#读取文件
df <- read.csv("qingyunian.csv",header=T,stringsAsFactors=F)
#新建分词引擎,加载停用词词典,去除“的得地数字标点符号等”无意义的停用词
wk <- worker(stop_word = "./dict/stop_words")
#使用默认引擎分词
df.comment <- segment(as.character(df$comment),wk)
df.comment[300:400]
查看分词效果,发现有部分内容还需要进一步清洗
从读取的文件中查找,发现在第16行:<U+208D><U+208D>(<U+0E07>˙ω˙)<U+0E27><U+207E>
df$comment[15:20]
使用正则表达式匹配删除
df$comment <- gsub("[<U+0-9A-Z>]","",df$comment)
df$comment[15:20]
再看看,已经没有了
重新分词,并统计词频
df.comment <- segment(as.character(df$comment),wk)
#查看分词效果,该清理的已经清理了。所以数据清理是很麻烦的事。。
df.comment[300:400]
#统计词频
freq.comment <- freq(df.comment)
3、绘制词云图
wordcloud2包安装
if (!require(devtools)) install.packages('devtools') else library(devtools)
devtools::install_github("lchiffon/wordcloud2")
wordcloud2函数说明
————————————————
wordcloud2(data, size = 1, minSize = 0, gridSize = 0,
fontFamily = NULL, fontWeight = 'normal',
color = 'random-dark', backgroundColor = "white",
minRotation = -pi/4, maxRotation = pi/4, rotateRatio = 0.4,
shape = 'circle', ellipticity = 0.65, widgetsize = NULL)
常用参数:
(1)data:词云生成数据,包含具体词语以及频率;
(2)size:字体大小,默认为1,一般来说该值越小,生成的形状轮廓越明显;
(3)fontFamily:字体,如‘微软雅黑’;
(4)fontWeight:字体粗细,包含‘normal’,‘bold’以及‘600’;
(5)color:字体颜色,可以选择‘random-dark’以及‘random-light’,其实就是颜色色系;
(6)backgroundColor:背景颜色,支持R语言中的常用颜色,如‘gray’,‘blcak’,但是还支持不了更加具体的颜色选择,如‘gray20’;
(7)minRontatin与maxRontatin:字体旋转角度范围的最小值以及最大值,选定后,字体会在该范围内随机旋转;
(8)rotationRation:字体旋转比例,如设定为1,则全部词语都会发生旋转;
(9)shape:词云形状选择,默认是‘circle’,即圆形。还可以选择‘cardioid’(苹果形或心形),‘star’(星形),‘diamond’(钻石),‘triangle-forward’(三角形),‘triangle’(三角形),‘pentagon’(五边形);
————————————————
画图
p_load(wordcloud2)
#选取词频大于1的词
freq.comment <- dplyr::filter(freq.comment,freq.comment$freq >1)
wordcloud2(freq.comment, size = 1, minSize = 0, gridSize = 0,fontFamily = "微软雅黑",
fontWeight = 'normal',color = 'random-dark', backgroundColor = "white",shape = 'star', ellipticity = 0.65)