也是由于前段时间工作中遇到一个很小文本分析的需求,虽然最后不了了之了,但是却勾起来自己对文本分析的极大兴趣。
一方面由于文本数据清洗的挑战与结构化数据相比能够更加锻炼数据清洗能力;另一方面,从文本中挖掘出来具有决策价值的信息,这种过程本就很考验耐心和毅力,而且过程较之其他数据挖掘类型,所面对的挑战性和不确定性更高、难度更大。
最近偶然在国务院官网上看到了一个页面,保存了新中国成立后历年的国务院政府工作报告(除少数几年缺失,原因不详),真是踏破铁鞋无觅处、得来全不费工夫。
政府工作报告的意义相信大家都心里有数,几乎代表着一整年政府工作的重心和方向,涉及到社会民生、经济文化等方方面面。
那么1954~2018年,见证中华人民共和国建国70多年的历届政府工作报告,其内容的变化、关注的侧重点、核心理念、政策导向又有着怎样的规律与洞见呢~
这个话题确实有点儿过于宽泛了,无论是内容数量还是分析角度等都可以拆解出来相当多的维度,相信每个人都可以从中挖掘出自己的见解~
说实话我还没有构思出令自己满意的分析计划,主要我自己在挖掘算法上面的积淀太少,很多东西正在恶补,希望能趁着这个机会融会贯通一下自己之前所学。
由于体量较大,打算从长计议,计划做成一个在线的开源小项目,放在github上接受大家的建议,等内容充实了,再用shiny和ggplot2去搭建线上展板。
1、数据获取(DONE) 2、语料清洗 3、分词与词干提取 4、词频统计与探索性分析 4、构建词向量 5、训练语料 6、筛选模型 7、测试模型 8、构建可视化线上展板
目前只完成了第一步(第一步就敢拿出来晒 ~ 就是这么任性)
内容规划和分析维度还在计划中,但是数据已经到位了,后期的清洗任务无比艰巨,等每一个步骤有阶段性成果,会及时公众号更新,不过你可以随时关注我的github,我会定期同步每一步的进展。
所有的数据源、代码及相关资料均为同步在github仓库的对应项目中。
今天只分享数据获取的代码,为了显得项目规范性(其实就是装X),我第一次使用了Rstudio中的Create Projects菜单创建了本地项目仓库(以前写R代码太飘逸了,写的龙飞凤舞,完全不顾及别人能不能看懂,以后不可以这样了,因为工作中已经吃过很大亏了)。
抓取历届政府工作报告的主网址:
http://www.gov.cn/guowuyuan/baogao.htm
因为是含有二级列表页,所以第一步的想法自然是先爬取年份链接,然后遍历链接抓取每一年份中的文档。
可能因为自己文科生思维的问题,不太习惯直接写双层for循环(因为看到会不适),所以遇到这种需要二次遍历的,我一般都会拆成两个小步骤去进行:
1、遍历年份对应的对应年政府工作报告主页链接:
## !/user/bin/env RStudio 1.1.423
## -*- coding: utf-8 -*-
## Pages_links Acquisition
## 加载必要的安装包:
library("rvest")
library("stringr")
library("Rwordseg")
library("wordcloud2")
library("dplyr")
#主网址
url <- "http://www.gov.cn/guowuyuan/baogao.htm"
#提取二级链接
txt<-read_html(url) %>%
html_nodes("#history_report") %>%
html_nodes("p") %>%
html_text()
#提取年份&链接信息:
Base <- read_html(url) %>% html_nodes("div.history_report") %>% html_nodes("a")
Year <- Base %>% html_text(trim = TRUE) %>% as.numeric()
Links <- Base %>% html_nodes("a") %>% html_attr("href") %>% str_trim("both")
#合并成数据框:
Reports_links <- data.frame(
Year = Year,
Links = Links,
stringsAsFactors = FALSE
)
#存放到本地目录中
if (!dir.exists("data")){
dir.create("data")
write.csv(
Reports_links, "./data/Reports_links.csv",
row.names=FALSE
)
}
以上代码为了便于理解,我都拆成单句展示了,github中代码都会是封装好的模块化函数。
2、从每一个年份对应的链接中获取整个政府工作报告的文档文本:
#加载包
library("rvest")
library("dplyr")
library("magrittr")
library("doParallel")
library("foreach")
#读取年份及对应链接
Links_data <- read.csv("./data/Reports_links.csv",stringsAsFactors = FALSE) %>% arrange(Year)
#创建文档提取函数:
Get_Corpus_Report <- function(i){
url = grep(i,Links_data$Year) %>% Links_data$Links[.]
read_html(url) %>%
html_nodes("td.p1,tr > td,div.pages_content") %>%
html_text("both") %>%
cat(file = sprintf("./data/Corpus/%d.txt",i))
}
以上需用到较为基础的CSS表达式配色rvest来提取文档,如果你还不太了解这块的内容,赶快通过菜单中的网络数据获取笔记来恶补。
没有构造循环,这里用了foreach包提供的多进程并行爬取方案来处理多循环问题(虽然这里的量级还体现不出来并行的优势,但是整体代码要比写循环简介、高效)
system.time({
if (!dir.exists("./data/Corpus")){
dir.create("./data/Corpus")
}
cl<- makeCluster(4)
registerDoParallel(cl)
tryCatch({
foreach(
i= Links_data$Year,
.combine = c,
.packages = c("rvest","magrittr")
) %dopar% Get_Corpus_Report(i)
}, error = function(e) {
print(e)
},
finally = stopCluster(cl)
)
})
到这里,数据获取工作完毕,看不是很简单呀,短短不过20行代码,五六十份整齐的政府工作报告(txt格式)就怪怪的躺在你的硬盘里啦~
这里重复一遍,我会把所有的数据源、代码、及每一步的成果都更新到github上面,欢迎NLP的各位大神指(拯)导(救)思(下)路(我)~
也非常欢迎大家能够拿着这些宝贵的语料(真的很宝贵),做一些自己喜欢的事情~然后一起分享成果~
https://github.com/ljtyduyu/Government_Report_Mining