好久没有更新博客了,正好最近对政府工作报告的内容产生了兴趣,那么这次就来研究一下。

1.目标

小试牛刀

对北方边陲某市某区2012-2019年的政府工作报告使用文本分析技术进行关键词提取,高频关键字,生成词云。

重点

对1954-2019年的国务院政府工作报告,按照全部年份以及以10年为间隔来计算,从这些工作报告中,也许能发现建国70年来的沧桑巨变。

2.关键词提取算法简介

简介

关键词提取是文本分析领域一个很重要的部分,通过对文本提取的关键词可以窥探整个文本的主题思想,进一步应用于文本推荐或文本搜索。

有监督算法:是将关键词抽取问题转化为判断每个候选关键词是否是关键词的二分法问题。需要使用一个标注了关键词的文档集合训练模型。标注训练集成本较高,所以无监督算法更为常用。

无监督算法:不需要进行人工标注训练集,利用某些方法发现文本中比较重要的词作为关键词,进行关键词提取。

词的重要性的衡量有多种方式:

  • 基于文本特征统计——TD-IDF

  • 基于词图模型——TextRank

  • 基于主题模型——LDA

TF-IDF关键词提取

TF-IDF是关键词提取算法中最基本、最简单的方法。使用词频来衡量一个词在文章当中是否重要。重要的词往往在文章中出现的频率很高,但另一方面,不是出现次数越多的词就一定重要。在一篇中文文章当中,出现最多的词汇可能是“是”、“否”、“在”、“和”、“及”等常用词。

有些词会在各种文章中都频繁出现,那么这个词的重要性,就比在某一篇文章中重复出现频率高的词低。

于是,就给不常见的词以较大的权重,减少常见词的权重。

IDF(逆文档频率)就是指词的权重,TF指的是词频。那么,有如下公式:

一个词的IDF值的计算是根据语料库得出的,一个词在语料库中越常见,那么分母就越大,IDF就越小。

分母+1是为了保证词没有出现在文档中时分母为0。

最终TF-IDF的计算:

3.实现

分词和分析这里直接使用jieba分词。

小试牛刀

整理数据源

由于北方边陲某市某区在其官方网站上都找不全工作报告,而且只需统计2012-2019年这几年的(互联网上只找到这几年的数据),干脆就手动保存一下好了。

创建分词函数

使用Counter类(对象计数)来计算关键字出现频次

测试分词及出现频次计算

测试结果:

可以看到,关键词“一带一路”被分为了两个词(“一带”,“一路”),所以这里需要加载一下用户词典,用于提高分词准确率。

用户自定义词典加入“一带一路”一词。

修改后的cutText函数:

加载后的测试结果:

现在加载一个保存好的ZF工作报告进行一下,提炼一下出现最多的词看看。

考虑到文件编码问题,处理一下:

结果如下:

可以看到,筛选出了很多意义不大的词汇,需要过滤一下。

新建一个停用词词典并写入若干停用词。

修改后的cutText函数:

结果如下:

这里可以看到提取到了出现次数较多的关键字,接下来计算一下关键字频率。

使用TD-IDF算法提取关键字

jieba分词实现了TD-IDF算法和TextRank算法,直接使用即可。

结果如下:

创建词云

创建词云使用wordcloud库。

由于wordcloud需要传入一个词与词之间使用空格分隔的字符串,所以分词之后,使用字符串的join方法将分词List内的词组合成字符串。

生成词云使用的图是作出被分析报告的某市某区的行政区划图,该图一般越清晰,生成词云效果越好。

创建关键词频次条状图

通过词云还无法很直观的看出某一个关键字出现频次的水平,所以使用matplotlib来绘制一个条状图。

先将以计算频次的数据进行矩阵转置,分解成两个numpy.ndarray,其中的数据根据索引一一对应。

但矩阵转置后,第二组的numpy.ndarray中数字被转为了字符串格式,所以需要在后面加载数据时,转为数字。

生成的条状图如下:

2012-2019年某市某区工作报告分析总结

把这几年的文本合成为一个文本进行分析。对main.py进行一下修改。

主要是将多年的文件路径写入List,循环遍历每一个文件进行读取,并将文件内容合并,用于后续的操作。

其他部分的源码无需改变,只需在main.py中调用各部分函数即可。

运行结果如下:

关键字出现频次

TD-IDF 提取关键字

生成的词云和条状图

接下来就是重点了,分析自1954年以来的国务院政府工作报告。


获取国务院政府工作报告文本

已知1954-2017年的文本在中央的网站上是有一个专题的,网址如下:

http://www.gov.cn/guoqing/2006-02/16/content_2616810.htm

2017年公告全文网址:

http://www.gov.cn/premier/2017-03/16/content_5177940.htm

2018年公告全文网址:

http://www.gov.cn/zhuanti/2018lh/2018zfgzbg/zfgzbg.htm

2019年公告全文网址:

http://www.gov.cn/zhuanti/2019qglh/2019lhzfgzbg/index.htm

2017年报告是以专题形式呈现的,但2017年报告全文页的页面形式与2014-2016年的报告全文页面是一样的。

1954-2013年的报告全文页面基本可以认作是一样的。

2018、2019年两年虽然也是专题页面,但结构大体相似。

从侧面也反映了前端技术、UI设计理念的改变。

那么,根据三种不同的页面,需要制定三种不同的解析方式。

获取1954-2016年的网页地址

先创建一个共用的获取页面html的函数。

获取全部的url

获取报告全文文字

上面说道三种不同页面的情况,根据应用页面数量从多到少的考虑。

页面应用数量最多的就是表格形式布局的1954-2013年这段时间的,这些页面结构简单,没有其他的干扰,为了严谨一些,还是去抓取正文的内容。

这样,1954-2019年的报告全部文字都采集到,合计1015633字。

分析

采集到所有的报告文字之后,只需要结合上面的代码,就可以得到关键字、关键字频次、词云和词频条状图了。

如果需要按照时间跨度来分片计算的话,搞一个List,以字符串形式存储年份即可。

结果

结果图片比较多,干脆合成到一张图上,图片较大(点击图片可以查看大图),请耐心等待。

结论

发展才是硬道理!

Github

代码已开源,见:

https://github.com/derek-s/Python-GovWorkReportAnalyze

版权声明
转载保留版权: 大D技研室 | 《Python文本分析——政府工作报告都说些啥?》
本文链接地址:https://www.dadclab.com/archives/7378.jiecao
转载须知:如果您需要转载本文,请将版权信息,版权授权方式,以及本文的链接地址注明,谢谢合作。
本文被贴上了: , , , 标签