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)
词云
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352