Python 环境下的文本分词与词云制作
2018-12-28严明郑昌兴
严明,郑昌兴
(国防大学政治学院,上海201602)
0 引言
诞生于20 世纪90 年代初的Python 语言,因其简洁、优美、开源、功能强大等一系列特点,本世纪初以来其使用率呈现快速增长之势。特别是近年来随着互联网、大数据和人工智能等技术的发展和应用需求的增长,Python 已经超越C#,与Java、C、C++一起成为4 大流行语言,成为最受欢迎的程序设计语言之一,广泛应用于从桌面应用、Web 开发、自动化测试运维、爬虫到大数据处理、人工智能等各个领域。在IEEE Spectrum发布的2017 年和2018 年编程语言排行榜中,Python均高居第一;在TIOBE 的2017 年度榜单中,Python 位居第二,在最新的2018 年9 月份的编程语言排行榜上位居第三。
目前,Python 不仅具有功能强大的标准库,支持Python 的第三方库已达数以万计,丰富的第三方库则是Python 不断发展的保证。在Python 环境下,引入第三方面库jieba 和WordCloud 等可以方便时对文本进行分词和制作词云。
1 中文分词
分词是自然语言处理(NLP)中文本处理的基础环节和前提。与以英文为代表的拉丁语系语言相比,中文分词要复杂得多、困难得多,因为自古以来中文的词语之间均没有自然分隔。长期以来,许多学者对中文分词进行了大量的研究,提出了许多算法,例如基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法,等等。
在使用Python 进行中文分词处理时,可以使用第三方的jieba 分词器进行。其分词算法总体是:使用基于前缀词典的词图扫描,生成所有可能生成词所构成的有向无环图,再采用动态规划查找最大概率路径,找出基于词频的最大切分组合;对于未登录词,采用了基于汉字成词能力的HMM 模型(使用Viterbi 算法)来预测分词。
jieba 分词支持三种分词模式:一是精确模式(默认模式),试图最精确地切分,适合文本分析;二是全模式,把所有的可以成词的词语都扫描出来,速度非常快但是不能解决歧义;三是搜索引擎模式,在精确模式的基础上对长词再进行词切分,以提高召回率,适合用于搜索引擎分词。前两种模式使用jieba.cut()函数,通过参数进行选择模式和具体算法,第三种模式使用jieba.cut_for_search()函数。三种模式的常用格式分别为:
jieba.cut(sentence,cut_all=False,HMM=True)
jieba.cut(sentence,cut_all=True,HMM=False)
jieba.cut_for_search(sentence,HMM=False)
jieba 分词器所基于的前缀词典由dict.txt 提供。在实际应用中,用户常常会发现一些“新词”由于未登录而不能正确地切分,这时就需要用户增加领域词表或添加自定义词语。使用 jieba.load_userdict(file_name)函数可以指定自己自定义的词典,使用jieba.add_word(word,freq=None,tag=None)函数可以向词典中添加新词。
2 词云制作
词云图(简称“词云”),也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,目前词云已成为文本数据可视化的一种常用方式。在词云中,通常是不同的单词(词组)采用不同的颜色表示,不同词频或权重的单词(词组)采用不同的字号表示。目前互联网上已经有很多在线词云工具,例如国外的Word-Art、Wordle、WordItOut、Tagxedo、Tagul 等,以及国内的“图悦”等。即便是智能手机,用户可以也可以找到制作词云的App。在Python 环境下,使用第三方的WordCloud 库也能轻松地完成词云的制件,并对其进行个性化的处理。
对于WordCloud 库来说,每个词云是一个Word-Cloud 对象,通过对其20 多个属性(或者说是参数)进行配置可以设置词云。其中,常用属性说明为:
●font_path:字体路径。需要注意的是,制作中文词云时必须指定字体文件,否则不能正常显示。
●width:输出的画布宽度,默认为400 像素。
●height:输出的画布高度,默认为200 像素。
●scale:按照比例进行放大画布,默认值为1。
●background_color:背景颜色,默认值为“black”。
●mask:指定遮罩图(即背景图片、词云的形状图),字的大小布局和颜色都会依据遮罩图生成。如果参数为空,则使用二维遮罩绘制词云。如果mask 非空,设置的宽高值将被忽略,遮罩形状被mask 取代。
●min_font_size:显示的最小的字体大小,默认值为4。
●max_font_size:显示的最大的字体大小。
●font_step:字体步长,默认值为1。
●relative_scaling:表示词频和云词图中字大小的关系参数,默认0.5。
●max_words:要显示的词的最大个数,默认值为200。
●stopwords:设置需要屏蔽的词(即停用词)。如果为空,则使用内置的STOPWORDS。
利用WordCloud 制作词云时,一般经过三个步骤:一是使用wordcloud.WorldCloud 函数来设置词云对象的有关属性(或者说是参数);二是利用wordcloud.generate(text)函数或wordcloud.generate_from_frequencies(frequencies[,…])函数生成词云,前者是根据文本生成词云,后者是根据词频生成词云;三是利用wordcloud.to_file(file_name)函数将词云输出到文件进行保存。
3 示例
当前和今后一个时期,深入学习党的十九大精神是全党和全国各族人民的一项重大政治任务。笔者在学习过程中,将党的十九大报告与十八大报告进行了对比学习,并由此产生了对两个报告进行文本处理的想法。
以下代码实现了两个报告的文本分词、词频统计,在此基础上发现十九大报告中出现的新词,并制作相应的新词的词云(如图1 所示)。
图1 党的十九大报告新词之词云
#_*_coding:utf-8_*_
from PIL import Image
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
行政事业单位的内部控制建设应该结合我国新时期的基本国情,与时俱进地制定适合各个地方政府和行政事业单位的发展策略,从单位内部结构和运行作为出发点,才能最大程度的完善内部管理体制。为了更好地适应市场经济的大环境,行政事业单位需要在行政功能和公共服务等方面进行相应的人力和资源的整合工作,同时配合政策出台的管理条例,更加切实有效地开展新时期赋予行政事业单位的历史任务。
import jieba
from wordcloud import WordCloud,ImageColorGenerator
#以下功能为:添加新词(未登录词)
list1=['中国特色','新时代','一带一路']
for i in list1:
jieba.add_word(i)
#以下自定义函数的功能是分词、统计词频、去除标点符号和单字词等
def keyword(filename): #生成分词列表(高频词)
kw_jieba = list(jieba.cut(text,cut_all=False, HMM=False)) #分词
kw=Counter(kw_jieba) #统计词频
kw_common=kw.most_common(5000) #选取前n 个高频词
#以下功能为:去除标点符号和单字词
temp=[]
for i in kw_common:
if len(i[0])==1:
temp.append(i)
for i in temp:
kw_common.remove(i)
return kw_common
#以下为创建词云自定义函数
def kw_wc(kwlist,out_jpg):
masck_pic = np.array(Image.open('D:MyPython p01.jpg'))#读取背景图片
wc=WordCloud(
font_path='simhei.ttf', #设置字体格式,如不设置显示不了中文
background_color="white", #设置背景颜色
max_words=100, #设置最大词数
mask=masck_pic, #设置背景图片
max_font_size=50 #设置字体最大值
)
wc.generate_from_frequencies(dict(kwlist)) #生成词云
plt.figure(out_jpg) #新建一个名为out_jpg 的画图窗口
plt.imshow(wc) #直接显示(颜色随机分配)
plt.axis('off') #去掉坐标轴
plt.show() #显示词云图
wc.to_file(out_jpg) #将词云输出到名为out_jpg 的文件
return wc
###############主程序#############
kw18=keyword('D:MyPythond18.txt')#处理“十八大报告”文本
kw19=keyword('D:MyPythond19.txt')#处理“十九大报告”文本
#以下功能为从kw19 中去除kw18 中出现的词
kw19_18new=[]
for i in kw19:
k=0
for j in kw18:
if i[0]==j[0]:
k=1
break
if k==0:
kw19_18new.append(i)
kw19_18new=kw_wc(kw19_18new,"p19_18new0.jpg")
#创建新词词云