Python 文本分词与词云制作

近年来 Python 广泛应用于包括自然语言处理在内的数据处理和人工智能等领域。以实例探讨 Python 环境下基于jieba 库的文本分词、基于 WordCloud 库的词云制作及其相关处理,特别是如何实现针对两个相关文本的比较处理。

诞生于 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)函数可以指定自己自定义的词典,使用 jie?

ba.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.gen?

erate(text)函数或 wordcloud.generate_from_frequencies(frequencies[,…])函数生成词云,前者是根据文本生成词云,后者是根据词频生成词云;三是利用 wordcloud.

to_file(file_name)函数将词云输出到文件进行保存。

3 示例当前和今后一个时期,深入学习党的十九大精神是全党和全国各族人民的一项重大政治任务。笔者在学习过程中,将党的十九大报告与十八大报告进行了对比学习,并由此产生了对两个报告进行文本处理的想法。

以下代码实现了两个报告的文本分词、词频统计,在此基础上发现十九大报告中出现的新词,并制作相应的新词的词云(如图 1 所示)。

图1 党的十九大报告新词之词云#_*_ coding:utf-8 _*_from PIL import Imageimport matplotlib.pyplot as pltfrom collections import Counterimport numpy as npimport jiebafrom wordcloud import WordCloud, ImageColorGenerator# 以下功能为:添加新词(未登录词)

list1 =[‘中国特色’,’新时代’,’一带一路’]for i in list1:jieba.add_word(i)

#以下自定义函数的功能是分词、统计词频、去除标点符号和单字词等def keyword(filename): #生成分词列表(高频词)

text = open(filename, encoding=’utf- 8′, errors=’ignore’).

read() #打开文件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:\MyPython \d18.txt’) #处理“十八大报告”文本kw19 = keyword( ‘ D:\MyPython \d19.txt’) #处理“十九大报告”文本# 以下功能为从 kw19 中去除 kw18 中出现的词kw19_18new = []for i in kw19:k=0for j in kw18:if i[0] == j[0]:k=1breakif k==0:kw19_18new.append(i)

kw19_18new = kw_wc(kw19_18new,”p19_18new0.jpg”)