作者|苏克1900
资料来源
摘要:如果您手头有书、小说、电影剧本等文档,想要快速了解其主要内容,可以采用制作WordCloud语言的云图并显示主要关键词(高频词)的方式。 本文介绍常见的英文和汉语文本词云图的绘制及Frequency频率词云图。
接下来,详细说明各种形式的语言云图描绘顺序。
00002000200001 .英语语云
我们先画英语课文的语言云图。 因为那比较容易。 这里以《海上钢琴师》这部电影的剧本为例。
首先,准备电影剧本的文本文件(见下图)
接着,绘制最简单的矩形云图。 代码如下所示
1导入OS2fromosimportpath3fromwordcloudimportwordcloud4frommatplottlibimportpyplotasplp5#当前文件路径6 d = path.dirname ( _ ) 获取if " _ _ file _ " inlocals ( ) else OS.getcwd ( )7#文本text8text = open (路径. join ( d, ' legend1900.txt')).read()9#字组10wc = word cloud ( scale =2max _ font _ size = 100 ) 11wc.generate _ from _ text ( text ) 12 # 显示图像13 PLT.im show ( WC interpolation = ' bilinear ' ) 14 PLT.axis ( ' off ' ) 15 PLT.tight _ layout ( ) 16 #存储图像17wc.to _ file ( ' 1900 _ basic.png ' ) 18 # or19 # plt.savefig('1900_basic.png ',dpi=200)20plt.show ( )其中,使用open ( )方法读取文本文件,使用WordCloud方法设置云参数,generate_from_text ( )菜单 十几行代码可以生成最简单的单词云图
通过上面的语言云图,可能有几个问题
可以改变背景吗? 比如说,白色或者语言云图可以变成其他形状或者照片吗? 词语中最引人注目的词语“ONE”没有实际意义,可以删除吗? 这些都是可变的,要实现这个想法,您必须首先了解WordCloud的API参数及其中的一些方法。
在此列举参数并注释重要项目
1 word cloud.word cloud (2font _ path = none,#字体路径,英文不设定路径,不需要中文时,图形3 width=400,#预设宽度4 height=200,#预设高度5 margin=2,# 边缘6 ranks _ only = none7p refr _ horizontal =0. 9,8 mask = none,#在根据背景图形、图像描绘的情况下,9 scale = 1,10 color _ func = none, 11 max_words=200、#最大显示词汇数12 min_font_size=4 #最小大小13 stopwords=None、#停止字符设置和修改字符图的步骤14 random_state=None、15 background _ color = ' blandom #背景色设定,具体的颜色,例如white或16进制值16 max_font_size=None #最大尺寸17 font _ step = 1,18mo de = ' RGB ',19relative_scaling='auto ',20 regexp=None,21 collocacal 22 colormap='viridis ',# matplotlib可重命名颜色并更改整体样式的23 normalize_plurals=True,24 contour _ width = 0,25 contour _ color = ' black ',26 reper
了解了各个参数后,我们就可以自定义希望的语言云图了。 例如,要更改背景颜色和整体样式,请更改以下参数
1wc = WordCloud(2 scale=2,#按比例增加2倍3 max _ font _ size = 100,4 background _ color = # 383838 ',灰色5 colormap = 'Blues') 6# colormap名称https://matplottps
接着,我们提高难度,设定StopWords,删除无意义的“ONE”文字,将单词云图绘制成我们自定义的照片。
代码实现如下
1 import OS2fromosimportpath3importnumpyasnp4fromwordcloudimportwordcloud, stop words imagecolorgenerator5frompilimportimage6frommatplottlibimportpyplotaspl7from scipy.misimportimread8import random 910 de fwc 当前文件路径12d = path.dirname ( _ ) if " _ _ file _ " inlocals ( ) else OS.getcwd ( ) 13 #文本text 14 text = open ( path.join ( d ' legend 1900.txt ' ).read 背景图像16 background _ image = NP.array ( image.open ( path.join ( d " mask 1900.jpg " ) ) 17 # or18 # background _ image = im read ( path.join ( d " mask 1900.jpg " ) 背景图像颜色20 img _ colors = imagecolorgenerator ( background _ image ) 21 #设定英语停止字22 stop words = set ( stop words ) 23 WC = word cloud ( 24 margin = 2, #页边距25 mask = background_Image,26 scale = 2,27 max _ words = 200,#最大字符数28 min_font_size = 4 #最小字体大小29 stopwords = stopwords,30random_state=42最小字体大小 31background_color='white ', #背景色32 max_font_size = 150 #最大字体大小33 )34 #生成词组35wc.generate _ from _ text ( text ) 36 #为37 # wc.generate(text)38 # 存储图像41wc.to _ file ( ' 1900 pro1. png ' ) 42 #显示图像43 plt.imshow(wc, interpolation = ' bilinear ' ) 44 PLT.axis ( ' off ' ) 45 PLT.tight _ layout ( ) 46 PLT.show ( )首先通过open ( )方法读取文本文件,然后通过Image.open ( )方法读取背景图像
然后,设置单词云附带的英语StopWords停止字,将文本中不需要的单词分开排除。 例如a、an、the等。
然后,在WordCloud方法中设置单词云的特定参数。 generate_from_text ( )方法生成此单词组,recolor ( )根据图像的颜色绘制单词组的字符颜色。 最终的语云描绘效果如下:
至今仍在看着引人注目的“ONE”。 接下来去掉它,方法也很简单,可以用几行代码实现
调整1 # stop words2process _ word = word cloud.process _ text ( WC,text )3sort = sorted ( process _ word.items ( ),key=lambda e:e ),以在黑白渐变中逐字云彩
1def grey_color_func(word,font_size,position,orientation,random_state=None,2 * * kwargs ):3 return " HSL ( 0,0 % %, % d % " % random.randint ( 50 100 )4#随机设置HSL色值5wc.ref color ( color _ func = grey _ color _ func )的效果如下
以上是描绘英语单词云图的几种方法,下面介绍中文单词云图。
2 .汉语词汇云
与英语语云相比,汉语在画语云图之前,首先需要剪切语言。 在这里,我建议你用ba包来断言。 因为可以说是最好的中文分词包,所以GitHub有160 K的明星数量。 BA软件包安装完毕后,可以分开写入文本,创建语言云。
在此,吴军先生的着作《波峰》被选为汉语文本的案例,还是采用了图像形式的语言云图。 准备好素材后,下次就可以开始制作中文云图了。
0必须首先阅读文档。 与英语相比,在这里添加文本编码格式。 不添加的话,会发生错误。 添加几行代码可识别文本的编码格式
1text = open(path.join(d,' langio.txt ' ),. read ( )2text _ chart info = chardet.detect ( text )3print ( text _ chart info )4#结果5 { ' encoding ':' uncoding ':' uncoding '。 在confidence': 1.0,' language ':' }6text = open ( path.join ( d,r'lanchao.txt ' ),encoding='UTF-8-SIG').read ( )之后,分隔写入文本。 BA分写有精密模式、全模式、搜索引擎模式3种方式,它们的差异可以用一个例子来表现。
例如,“我来北京清华大学”这句话,用三种模式分写的结果分别是:
全模式:我/来/北京/清华/清华大学/华大/大学精密模式:我/来/北京/清华大学搜索引擎模式:从我/来/来/来/北京/清华/大学/清华大学/结果可以看出,我们应该选择“精密模式”来分析语言。 有关如何使用BA包的详细信息,请参见GitHub仓库链接
https://github.com/fxsjy/
分词完成后,还需要设置stopwords停止字,WordCloud没有中文停止字,因此需要自己配置。 您可以使用以下两种方法来配置
使用stopwords.update ( )方法根据现有的stopwords字典扫描文本,并手动添加停止词2.1. stopwords.update ( )
这个方法和上述的英语停止字构造的方法一样,目的是不在单词云图中显示停止字词,即不设定停止字词,对文字的词数进行排序,把不需要的词作为停止字词添加。 代码的实现方式如下
1 # stop words2process _ word = word cloud.process _ text ( WC,text )3sort = sorted ( process _ word.items ( ),key = lambda e :添加estop words后:
在中,需要手动添加stopwords.update ( )方法,这很麻烦,可以看出stopwords过多需要额外的时间。 了解如何自动移除第二个stopwords。
2.2. stopwords库自动遍历删除
该方法的思路也比较简单,主要分为两个步骤
使用现有的中文stopwords词典分词和写入原始文本,然后通过词典去除停止字,生成新的文本文件。 基于新文件制作单词云图时,stopwords不再出现,如果发现stopwords辞典不完整,再生单词云图即可。 代码实现如下:
1#对于原文的2def cut_words(): 3 #当前文件路径4 d = path.dirname ( _ ) if " _ _ file _ " inlocals ( ) else OS.getcwd ( )5text = open (路径. join ( d r ' lanchao.text ) encoding = ' utf-8-SIG ' ).read ( )6text = ba.cut ( text cut _ all = false )7content = '8forinotext:9 content + = I 10 content + = " 11 return content 1213 # 加载stopwords 14 def load _ stop words ( ):15 file path = path.join ( d,r ' stop words _ cn.txt ' ) 16 stop words =遍历此stop words字典,删除停止字符并创建新文本
首先,如果输出文本词数最高的单词的一部分,就会发现常见的停止词已经没有了
13. Frenquency语云图
以上两种英语单词云图都是用文本制作的,但是除了直接读入文本生成单词云以外,通常用“词数”制作单词云图。 可以使用DataFrame或者字典形式来描绘这样的语言云图。
在这里,以至今为止我们登上的“过去10年世界大学排行榜TOP500强”教程的数据为例,介绍如何制作词数图。
该数据大小为5001行x 6列,根据各国前500强大学的数量,希望可视化地显示各国间大学数量的不同。
1 world _ rankuniversityscorequantityearcountry 21哈佛大学100,500 USA 32斯坦福大学73.1,499 us a43加州大学伯克利71, 498usa54剑桥大学70.2 497 200 9 UK 65麻省理工大学69.5 496 2009 USA 7... 8496犹他州立大学2018 USA 9497圣拉斐尔生命健康大学2018 Italy10498早稻田大学2018 Japan11499韦恩州立大学2 018 USA12500西弗吉尼亚大学2018 USA,有两种直接生成频率字云图的方法,第一种是使用串列表来生成,用以如下方式实现代码。
1 importpandasaspd2importmatplottlib.datesasmdate3fromwordcloudimportwordcloud4importmatplottlib.pyplotasplt5d f = PD.read _ CSV ( ' und 如encoding = ' utf-8 ':7df = df.group by ( by = ' country ' ).count ( ) 8df = df所见,美国最突出,其次是德国、英国、中国等。 看来我们国内的大学要更加努力啊。
以上是描述语云图的几种常见方法。