基于Python的词云生成研究

2019-11-03 13:11潘亚星
电脑知识与技术 2019年24期
关键词:词云书评分词

潘亚星

摘要: 近几年,随着大数据、人工智能快速发展,Python呈现出爆发式的增长。伴随着移动互联网的快速发展,越来越多的人选择线上阅读,词云是一种新的可视化方式,能够准确快速地筛选出重要文本信息,把关键字以图片的形式展现出来,帮助广大读者快速地进行阅读前的筛选。该文主要介绍了基于Python的词云生成。以豆瓣网中柴静《看见》一书的书评为例,尝试对此书评进行词云生成。首先通过中文组件jieba进行分词,然后用TF-IDF算法提取关键词,最后利用wordcloud制作出词云图。

关键词:中文分词;词云;Python

中图分类号:TP311        文献标识码:A

文章编号:1009-3044(2019)24-0008-03

开放科学(资源服务)标识码(OSID):

1 概述

在人们获取信息的过程中,经常会出现大量不必要的信息,影响人们的阅读速度,浪费掉一些有限的时间。但随着多媒体技术进一步发展,使得信息的展现方式有了更多的可能性。当下,词云盛行,词云能够准确快速地筛选重要出文本信息,把关键字以图片的形式展现出来,吸引人们的眼球,且词云的生成简单,制作工具容易获得。用词云来分析一本书的书评,可以让读者对书评的关键词一目了然,从而决定是否去阅读它。《看见》一书是读过的书籍中印象最深刻的一本,也是向同学推荐最多的一本书,它记录了非典、汶川地震、北京奥运会等重大事件,是21世纪初中国社会十年变迁的备忘录。希望通过漂亮的词云,可以有更多的人了解这本书,从而去阅读。

制作词云的方法很多,但在一些人专业的人眼里,Python是最好的编程语言,功能全面,无所不能,因此尝试用Python来做《看见》书评的词云生成。1991年初,Python发布了第一个公开发行版。2008前后,Python的运用领域进一步扩张,开始在文学分析、金融领域有所运用。Python是一个跨平台的语言,能够把其他语言制作的各种模块,轻松地结合在一起,广泛应用,被称为“胶水语言”。得益于Python在多个领域的应用都在逐渐变热,Python的排名以强劲的势头迅速上升,根据TIOBE编程语言排行榜2019年6月更新的数据,Java和C在保持领先地位的同时,Python排名再度超过C++,占据了第三名的位置。

2 原理

2.1 中文分词

词云是对关键词的展示,制作词云,首先要提取出关键词,提取关键词的前提是分词。分词就是将连续的字按照一定的规范划分成不连续的词的过程。虽然英文也存在短语划分的问题,但中文分词比英文要复杂、困难得多。用到分词的领域有很多,如机器翻译、自动分类、自动摘要等。有很多软件和在线工具可以实现简单的分词,例如:武大沈阳老师的ROST- CM、中科院张华平老师的ICTCLAS2012等。目前,研究中文分词的大多是科研院校,还有一个比较出名专业研究中文分词的商业公司:海量。

jieba是Python的中文分词组件,它的优点很多如:支持繁体分词、支持自定义词典、且有三种分词模式:一是精确模式;二是全模式;三是搜索引擎模式。搜索引擎分词模式,是对精确模式的再次切分,用以提高召回率。Jieba默认使用精确模式,全模式分词需要添加cut_all参数,将其设置为True, jieba.cut_for_search()函数适合用于搜索引擎构建倒排索引的分词。

jieba.cut()以及jieba.cut_for_search()返回的結构都是一个可迭代的generator,使用for循环得到的每一个词语(unicode)。待分词的字符串可以是gbk字符串、utf-8字符串或者unicode。

2.2 词云生成

词云又称文字云或者标签云,是文本数据可视化的一种方法。“词云”的作用就是过滤掉大量的文本信息,对文本中出现频率较高的“关键词”予以视觉上的突出,使浏览者快速领略到文本的主旨。目前有很多在线的词云制作工具,每个人都可以根据自己的需要,制作自己喜欢的词云图。例如:

(1)www.wordArt.com是一个在线的词云创作工具,可以制作出精美的词云艺术。WordArt 用户可以自主选择形状、颜色、文字布局等。

(2)www.minitagcloud.cn一个在线词云制作的中文网站。图形多样,可以处理简单录入和大段落文本,分词简单,可操作性强,同时还可以添加元素,设置字体和样式等,也可以将完成后的作品保存或下载到本地。

(3)www.wordle.net,wordle是词云制作的典型代表。但是这个网站是需要支持java功能的,如果浏览器没有安装java模块的话就不能显示出效果,目前,Wordle的Web版本已不再适用于大多数人,建议安装一个wordle的桌面版本,功能与之前一样。由Wordle创建的词云图片自己可以随意使用,可以打印出来或保存在桌面上。

对于零基础的人来说,用以上这些专用的工具来做一个词云分析图是个很好的选择,便捷而强大,但也有不足之处,功能太专一,适用的范围有限。对于略有基础的人来说,Python是个更好的选择,因为Python有支持中文、开源、免费等特点。在Python环境下,通过安装第三方wordcloud库也能轻松地制作词云图,并对其进行个性化的设置。

Python在制作词云过程中可以设置的属性有:

(1) font_path:    #字体路径,不设置字体路径不能正常显示。

(2) background_color:    #设置背景颜色。

(3) mask:    #指定遮罩图,即图云的形状。

(4) min_font_size:    #显示的最小字体值,默认为4。

(5) max_font_size:    #显示的最大字体值,默认为20。

(6) max_words:    #显示词的最大个数。

2.3 步骤

如今人民过上了日益美好的生活。书籍资源丰富,且有越来越多的免费的在线读书软件。阅读的重要性无人不晓,习近平总书记也曾在多个场合对读书学习有过深刻的阐述。在一次文艺工作座谈会上习总书记说过“我年轻时读了不少文学作品,涉猎了当时能找到的各种书籍,不仅其中许多精彩章节、隽永文字至今记忆犹新,而且从中悟出了不少生活真谛。”但是如何在浩如烟海的书籍资源中快速筛选感兴趣的有价值的书籍呢,通过词云图可以满足广大读者的需求,并给读者充分的想象的空间,这也是在此研究词云生成的原因。希望能够用好看的词云图吸引读者,让读者从读者中来,到读者中去。用Python做书评的词云图的具体操作步骤如下:

(1) 保存文本信息

(2) 中文分词

(3) 提取关键词

(4) 词云生成

由于,保存文本信息的操作简单也比较简单,所以在此简单介绍两种方法。第一种是以文本文件的格式保存在当地文件夹下。另一种是对确切指定的网址进行数据抓取,获取信息。可以根据指定的URL,抓取豆瓣网《看见》一书的最受欢迎的五星好评的书评信息,通过建立连接发送HTTP请求,利用Requests建立与服务器的连接,服务器收到请求后做出应答。然后进行页面处理,先对HTML的源代码进行过滤和处理,分析出需要的信息,再对结果进行整合,最后通过HTML可以看到《看见》一书书评。接下来重点介绍中文分词的实现、提取关键词的算法实现以及词云生成的实现。

3 技术支持

3.1 中文分词实现

Python的标准库是安装Python时默认自带的库,是Python的一个组成部分,如turtle库、time库以及random库等。Python还有许多下载后安装才能使用的库,称为第三方库。使用pip安装第三方库,pip是从属于Python的,对应的pip负责给对应的Python安装第三方模块。

首先需要安装Python的第三方库,在命令提示符中输入pip install jieba,安装“结巴”分词工具,以实现分词。可以通过网络爬虫的方式获取书评信息,书评的URL网址为:www.book.douban.com/subject/20427187/reviews,如果要爬去大量的数据进行保存,爬虫一定是绝佳的方法,能大大提高工作效率。由于在此只需要的是一篇受欢迎的好评指数为五颗星的书评,不需要大量抓取数据,所以在此选择把书评以文以book-review.txt为文件名,保存在自己建好的文件夹下,进行操作,需要注意的是,要进行分词的文本文件必须为UTF-8编码。具体的代码实现如下:

filename = "book-review.txt"

with open(filename) as f:

mytext = f.read()

import jieba

mytext = " ".join(jieba.cut(mytext))

print(mytext)

中文分词技术如果能够加入人为参与和主观判断,它的准确性和有效性会有效提升。在对《看见》书评分词时也有主观参与的部分:自定义词典的添加和无用词的剔除。对于一些比较常见的词jieba能够自动分辨出来,因为jieba有内置的词库。对于jieba词库中没有的词,基于汉字成词能力的隐马尔科夫模型(HMM)和Viterbi算法,jieba有一定的新词识别能力,但对于那些比较生僻的词,通过自定义词库来添加,可以使分词的正确率更高。根据jieba.load_userdict(file_name)添加自定义词典,使用jieba.add_word(word,freq=None,tag=None)函数向自定义的词典中添加新词,通过主观判断,《看见》一书是现代文学作品,通俗易懂,且它的书评中也没有太过于生僻的词,所以没有添加新词的必要,但面对无用词的剔除时,虽然jieba已经过滤掉了大量的无用词,但也有漏网之鱼,所以《看见》书评分词后人为干涉剔除了“为了”“除了”“东西”等没有实际意义的词。

3.2 提取关键词的实现

jieba中文分词实现了分词、词性标注、关键词提取。关键词提取就是从大量文本信息中,找到最能代表此文本的词,把它们抽取出来。并不是简单的来说,一个词出现的频率越高,就越能表现文章的主旨,关键词的提取需要用到具体的算法。Jieba关键词提取涉及了两种算法:TF-IDF算法和TextRank算法,重点研究TF-IDF算法的实现。

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文件频率),它是一种数值统计算法,用于反映一个词对于语料中某篇文档的重要程度。主要思想是:一个词在一个文档中出现的次数越多,即TF高;并且在所有文档中出现的次数越少,即DF低(IDF高),越能够代表这篇文章的主旨。

词频(term frequency,TF)指某一特定的词在该文本文件中出现的次数。但需要注意的是一些通用的词语对于主题没有太大的作用,反而是一些出现频率较少的词更能表达文章的主题,所以不能单纯使用TF算法。

公式:

[TF=某个词出现的频数所有词出现的频数之和]

逆向文件频率(inverse document frequency ,IDF)指某一特定的词在所有文件中出现的次数越少,它逆向文件频率值越大,說明它能很好地区分能力,具有代表性,一特定词的IDF值,是由总文件数目除以包含该词的所有文件的数目,再将得到的值取对数得到的。分母加1,是为了避免分母为零的情况。

公式:

[IDF=log (总文件数目包含该词的文件的数+1)]

TF-IDF=TF * IDF,使用TF-IDF算法提取关键词的算法可靠,因为它能够过滤掉常见的词,保留重要的词。以TF-IDF算法实现jieba中文分词的关键代码为:

from jieba import analyse

tfidf = analyse.extract_tags    # 引入TF-IDF关键词抽取接口

keywords = tfidf(text)     # 基于TF-IDF算法进行关键词抽取

print "keywords by tfidf:"

for keyword in keywords:    # 输出抽取出的关键词

print keyword + "/"

TextRank算法要比TF-IDF算法复杂一些。它不是简单做加减乘除运算,而是基于图论和图模型,对图中的点计算权重,以权重值作为排序算法。权重高的语法单元可以作为关键词。TextRank算法实现jieba中文分词的关键代码为:

from jieba import analyse

textrank = analyse.textrank    # 引入TextRank关键词抽取接口

keywords = textrank(text)     # 基于TextRank算法进行关键词抽取

for keyword in keywords:    # 输出抽取出的关键词

print keyword + "/"

3.3 词云生成实现

要实现词云生成,首先为Python安装第三方的词云工具,在命令提示符中输入pip install wordcloud,进行安装。由于wordcloud默认的字体是英文的,不包含中文编码,因此需要自己下载一个中文字体如:simsun.ttf(宋体),把simsun.ttf和《看见》书评book-review.txt放在同一个文件夹下。在分词完成后,伴随着提取关键词也已经完成了,接下来就词云的关键步骤。可以设置一些个性化的操作,首先可以设置mask的形状,可以使用默认的矩形,也可以选择用书籍的封面,或是作者的图片等自定义的背景遮罩,在词云生成时选择了以柴静采访时的一张图片为mask,还可以设置最大字数限制,最大字体和最小字体以及颜色等等,在此做了简单的设置如下。

from wordcloud import WordCloud(

background_color="white",

max_words=62,

mask=bg,            #设置图片的背景

max_font_size=50,

random_state=42,

font_path='simsun.ttf'   #中文处理

).generate(mytext)

import matplotlib.pyplot as plt

plt.imshow(wordcloud,interpolation='lilinear'))    #开始画图

plt.axis("off")     #为云图去掉坐标轴

图2  《看见》书评的词云生成

4 结语

基于Python词云生成并没有那么简单,它需要一定的专业知识,首先它的环境配置就是一大难关,其次Python还有一些需要特别注意的语法点,但经过仔细研究和学习,用Python做词云还是可以实现的。虽然词云有一定的局限性,但词云的优点和价值不容忽视。目前,已有用词云技术报道全国两会,让公民可以一眼看懂那些晦涩难懂的报告;也有一些教育工作者开始用词云图进行英语词汇教学;还有一些主流报纸头版词云的微信公众号,让阅读者通过词云的方式快速了解主流报纸头版内容。不仅任何一本书的书评都可以做成漂亮的词云图,任何文本信息都可以做成词云,方便用户在互联网上快速阅读。也可以将这些词云图保存下来,放到朋友圈或是微博上,都是展示自己的极佳方式。把《看见》书评的词云图放在微博上,不仅获得了大量的阅读量,还得到了不少熟悉或陌生的朋友的评论和点赞。相信在未来一定会有越来越多的人看到词云的价值,通过词云来了解信息,认识世界。

参考文献:

[1] 杨雁莹.基于TextRank算法的微博个人关键词云提取的设计与实现[J].电脑编程技巧与维护,2019,02(005):14-18.

[2] 冯与洁.词云生成系统的构建[J].通讯世界,2019(03):190-192.

[3] 严明.Python环境下的文本分词与词云制作[J].现代计算机,2018,34(021):86-89.

[4] 高宇.基于聚焦型网络爬虫的影评获取技术[J].中国计量大学学报,2018,29(3):299-303.

[5] 袁在成.可視化工具“词云”在英语教学中的应用研[J].中国教育学刊,2016,S1(02):102-103.

【通联编辑:代影】

猜你喜欢
词云书评分词
书评
书评
书评
分词在英语教学中的妙用
面向跨语言词云可视化的拓扑保持布局算法研究
书评
论英语不定式和-ing分词的语义传承