13-爬取《庆余年》评论并画词云图

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]
第16行

使用正则表达式匹配删除

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)
词云
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。