“不忘初心,牢记使命,高举中国特色社会主义伟大旗帜,决胜全面建成小康社会,夺取新时代中国特色社会主义伟大胜利,为实现中华民族伟大复兴的中国梦不懈奋斗。”
十九大召开已过去近一个月,我国社会主要矛盾已经转变,中国特色社会主义进入了新时代,中国人民实现了从站起来,富起来到强起来,我们国家已经走近世界舞台的中央。国家强盛,民族自豪,为了中国梦,戮力前行。
考研的同学应该此刻也在对着十九大报告埋头苦背吧,作为一只有中国梦和爱国心的程序猿,这份报告也必须熟读了解啊,万一有机会考研就用到了呢。
出于对技术的热爱和好奇心,Python大法立时出现在脑海,网上也曾有人用词云解读过报告,人生苦短,何不用Python来自己解读一下这份报告,加深映像呢。
词云
偶有看到有人实现用词云展示十九大报告关键词,这里就利用自己掌握的技术实现一下词云解读报告。先来看看生成的词云图:
是不是还是蛮有趣的,报告中的高频词汇都清晰地以徽标的形状映射出来了,词频越高,词汇也就越大。
也许也有很多同学想要学习一下这么酷炫的小技巧,在自己的ppt和汇报中show一下,这里就将具体实现过程分享给大家。
首先要装好python环境,然后装好几个python的常用库,包括词云库wordcloud,绘图库matplotlib,中文分词库jieba,图像处理库PIL和科学计算库numpy。
这么多库一个个装也会麻烦些,其实下载Anaconda就可以了,很多库都直接集成在里面了。装了Anaconda的话,只需再装个词云库就可以了,可以在终端或者cmd输入下面命令安装,如果要在已有python环境安装其他库也可以用这个命令,具体安装过程也可以搜索一下教程。
pip install wordcloud
准备好环境可以开始做词云图了,首先准备好报告全文,另存为纯文本文件如shijiuda.txt。
第一步,导入所需的库和报告全文,path为文本文件路径。
用jieba库对全文分词,分词结果以字符串形式存入alldata中,注意格式为“词语1 词语2 词语3”,词语之间用空格隔开。
import wordcloud as wc
import matplotlib.pyplot as plt
import jieba
from PIL import Image
from numpy import array
path="D:/.../shijiuda.txt"
#从路径读取报告全文,存为data
data=open(path,"r",encoding="UTF-8").read()
#使用jieba分词
cutdata=jieba.cut(data)
alldata=""
for i in cutdata:
alldata=alldata+" "+str(i)
第二步,选取生成词云所需的中文字体font,一般为.ttf文件,windos系统在目录C:\WINDOWS\Fonts下,mac在/System/Library/Fonts或/Library/Fonts目录下,这里选了常规简体中文黑体。
然后准备好一张背景图片,如dang.jpg,用轮廓越清晰,质量越高的图片生成的词云图效果越好,对于上面做的词云图我找的背景图是下面这张。
用PIL的Image方法读取图片,将图片转为数组,然后用分好的词alladata生成词云图。
font=r"/System/Library/Fonts/STHeiti Medium.ttc"
#读图片
pic=Image.open("D:/.../dang.jpg")
#图片转数组
picarray=array(pic)
#collocations=False表示是否归并词,传入字体路径,图片数组,设置背景颜色为白色,用alldata生成词云
mywc=wc.WordCloud(collocations=False, font_path=font,mask=picarray,background_color="white").generate(alldata)
#画布大小
fig = plt.figure(figsize=(10,10))
#展示图片
plt.imshow(mywc)
#去掉坐标轴
plt.axis('off')
plt.show()
然后就可以换几个图片背景看看其他词云效果了。
可以看到较大较明显的词都是十九大报告中的高频关键词。
词频统计
如果想更深入了解具体词频情况,可以继续做词频统计。比如我想把出现最多的前20个词拿出来比对一下,词云图无法展示哪20个词出现最多,这时可以用条形图对比分析。
这个图也是完全用Python做统计分析后实现的。从这个对比图就非常清楚的看出“社会”、“发展”、“人民”、“中国”、“建设“、社会主义”等词出现频率最高,都出现过150次以上。
首先从分词后的数据中找出出现次数最多的前20个词,以及它们的词频。
from jieba.analyse import extract_tags
import numpy as npy
#extract_tags提取词频前20的关键词存为列表tags中
tags = extract_tags(sentence=alldata, topK=20)
#全切词,分别统计出这20个关键词出现次数,即词频,存为字典words_freq中
words = [word for word in jieba.cut(data, cut_all=True)]
words_freq = {}
for tag in tags:
freq = words.count(tag)
words_freq[tag] = freq
#将该字典按词频排序
usedata=sorted(words_freq.items(), key=lambda d:d[1])
#字典转为numpy数组并作矩阵转置,方便画图取用
tmp= npy.array(usedata).T
print(tmp)
tmp即为统计后的前20个数据,存有两个列表,词语和对应的词频,输出如下:
然后利用统计好的数据作图,作图代码如下:
#导入绘图库
from numpy import arange
import matplotlib
#画布大小
fig,ax = plt.subplots(figsize=(10,10))
#输出中文字体
myfont = matplotlib.font_manager.FontProperties(fname="/System/Library/Fonts/STHeiti Medium.ttc")
#图表标题设置,想要标题居中可以去掉x,y的设置
plt.title(u'十九大报告词频统计',fontproperties=myfont,fontsize=20,x=0.001,y=1.02)
#图表x轴设置
ax.set_xlabel(u'出现次数',fontproperties=myfont,fontsize=20,x=0.06,y=1.02,color="gray")
#边框线设置,去除上方右方的框线,左下框线置灰融入背景
ax.spines['bottom'].set_color('grey')
ax.spines['left'].set_color('grey')
ax.spines['top'].set_color('white')
ax.spines['right'].set_color('white')
#传入词语,y轴显示20个标记位置,设置字体大小,颜色为灰色
tick_positions = range(1,21)
ax.set_yticks(tick_positions)
ax.set_yticklabels(tmp[0],fontproperties=myfont,fontsize=18,color="gray")
#设置数据条的间隔
bar_positions = arange(20) + 0.75
#导入数据并做图展示
ax.barh(bar_positions, tmp[1], 0.5,align="edge")
plt.show()
这样就实现了完全用python绘制出上面的词频统计图了。
利用上面的方法就可以画其他文本比如小说、文章、评论的词云或者词频统计图啦。