案例引入
假设你是一家出版社的职员,某日主编提出要求:“我需要你能呈现《斗罗大陆》的词汇大致分布,我不管你怎么实现,只要我能看懂就好。”
一说到词汇分布的呈现,很多人会想到利用词云(wordcloud),但是在本例中,经理并没有给我们相关的词汇分布数据,这就需要我们自己动手来获取或制作词汇的分布数据。本次实战我们将从最基本的网络数据爬取出发,结合中文分词来制作各式的词云图。
网络数据爬取
网路数据爬取方面,我们将利用rvest包,它可以快速、简单地爬取一个网页的信息。利用rvest爬取网络数据的一般步骤是:载入网页-获取html数据-根据html标签或者css选择器引用数据。
本次爬取的网站为http://www.biquge.info/10_10218/,其每一章节的网页url规律性较强,爬取代码如下:
library(rvest)
t
for (i in 1:50) {
id
url
web
position % html_nodes('div#content') %>% html_text()
t[i]
}
t_all
利用for语句组合斗罗大陆每一章节的url,再通过read_html()获取每一章节的html文档,如果对html标签语言有一些了解的话,可以发现
…
便是每一章节的文本内容。web %>% html_nodes('div#content') %>% html_text()是一个逐级处理过程,web指向网页html文本,html_nodes()获取web中指定标签的内容,html_text()则获取html_nodes()中的文本信息,也就是章节内容。最后利用paste将每一章节的内容粘在一起方便切词处理。
#"div#content"指向的是id="content"的div标签,如果是class属性,如
,则应为"p.p1"
#关于rvest更多内容,请访问https://github.com/hadley/rvest
中文切词
在中文分词领域,目前最好用的应该是jieba系列的分词工具了,其在R上也有支持的包"jiebaR"。利用jiebaR分词代码如下:
library(jiebaR)
seg
jieba_s
df
worker()函数是jiebaR中最重要的函数,它的作用是设定一个分词器,供后续切词使用。其中,参数type指定分词器使用的模型,目前的模型主要有:
mp(最大概率模型)- 基于词典和词频
hmm(HMM模型)- 基于HMM模型,可以发现词典中没有的词
mix(混合模型)- 先用mp分,mp分完调用 hmm 再来把剩余的可能成词的单字分出来。
query(索引模型)- mix 基础上,对大于一定长度的词再进行一次切分。
keywords(关键词模型)- tf-idf 抽关键词
#关于jiebaR更多内容,请访问https://github.com/qinwf/jiebaR
词云制作
目前较好用的词云包当wordcloud2莫属了,其支持三种不同的词云实现函数,分别如下:
library(wordcloud2)
wordcloud2(df, figPath='C:/Users/Ming/Desktop/唐.png', size=1, color='random-light')
wordcloud2(df, size=1, color=ifelse(df[, 2]>800, 'red', 'skyblue'), backgroundColor='grey', minRotation = -pi/6, maxRotation = -pi/6, minSize = 10, rotateRatio = 0.5, shape='star')
letterCloud(df, word='斗罗大陆', wordSize=5)
在第一个wordcloud2()中,df使用的数据集(即data=df),figPath参数指向一张图片,本次示例,我们使用的是一个“唐”字的图片(图片要求词云显示区域为黑色,其余区域为背景色,格式一般为png格式),size参数则是词云图中文字的大小(默认为1),color参数指定颜色。
第二个wordcloud2()中,我们利用ifelse()函数对color指定了一个颜色选择器,词频大于800的文本将显示为红色,其余则为淡蓝色,backgroundColor指定背景颜色,minRotation、maxRotation、rotateRatio一般同时使用,前两个分别指定某一个词发生旋转时,旋转的最小角度与最大角度,最后一个指定这个词发生旋转的概率,shape函数指定形状,可用的关键字例如circle(默认),cardioid,diamond,triangle-forward,triangle,pentagon,star。
letterCloud()可以很方便地利用某一个字符作为画布来生成词云,参数word指定作为画布的字符,wordSize指定该字符的大小。
#如果使用的开发环境为Rstudio,若无法生成图像,点击一次刷新即可。
#关于jiebaR更多内容,请访问https://cran.r-project.org/web/packages/wordcloud2/vignettes/wordcloud.html
源码与文档:https://pan.baidu.com/s/1aA70pee-y7mBKa45elmdbg
密码:2f62
领取专属 10元无门槛券
私享最新 技术干货