WordCloud 中英文词云图绘制看这一篇就够了Word格式.docx
- 文档编号:21291915
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:3.21MB
WordCloud 中英文词云图绘制看这一篇就够了Word格式.docx
《WordCloud 中英文词云图绘制看这一篇就够了Word格式.docx》由会员分享,可在线阅读,更多相关《WordCloud 中英文词云图绘制看这一篇就够了Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
∙词云中最显眼的词汇「ONE」,并没有实际含义,能不能去掉?
以上这些都是可以更改的,如果你想实现以上想法,那么需要先了解一下WordCloud的API参数及它的一些方法。
这里,我们列出它的各项参数,并注释重要的几项:
1wordcloud.WordCloud(2font_path=None#字体路径,英文不用设置路径,中文需要,否则无法正确显示图形3width=400#默认宽度4height=200#默认高度5margin=2#边缘6ranks_only=None7prefer_horizontal=0.98mask=None#背景图形,如果想根据图片绘制,则需要设置9scale=110color_func=None11max_words=200#最多显示的词汇量12min_font_size=4#最小字号13stopwords=None#停止词设置,修正词云图时需要设置14random_state=None15background_color='
black'
#背景颜色设置,可以为具体颜色比如white或者16进制数值16max_font_size=None#最大字号17font_step=118mode='
RGB'
19relative_scaling='
auto'
20regexp=None21collocations=True22colormap='
viridis'
#matplotlib色图,可更改名称进而更改整体风格23normalize_plurals=True24contour_width=025contour_color='
26repeat=False)
关于更详细的用法,你需要到官网了解。
了解了各项参数后,我们就可以自定义想要的词云图了。
比如更换一下背景颜色和整体风格,就可以通过修改以下几项参数实现:
1wc=WordCloud(2scale=2#缩放2倍3max_font_size=1004background_color='
#383838'
#灰色5colormap='
Blues'
)6#colormap名称https:
//matplotlib.org/examples/color/colormaps_reference.html
结果如下:
接下来,我们提升一点难度,通过设置StopWords去掉没有实际意义的「ONE」字符,然后将词云图绘制在我们自定义的一张图片上。
代码实现如下:
1importos2fromosimportpath3importnumpyasnp4fromwordcloudimportWordCloudSTOPWORDSImageColorGenerator5fromPILimportImage6frommatplotlibimportpyplotasplt7fromscipy.miscimportimread8importrandom910defwc_english():
11#获取当前文件路径12d=path.dirname(__file__)if"
inlocals()elseos.getcwd()13#获取文本text14text=open(path.join(d'
)).read()15#读取背景图片16background_Image=np.array(Image.open(path.join(d"
mask1900.jpg"
)))17#or18#background_Image=imread(path.join(d"
))19#提取背景图片颜色20img_colors=ImageColorGenerator(background_Image)21#设置英文停止词22stopwords=set(STOPWORDS)23wc=WordCloud(24margin=2#设置页面边缘25mask=background_Image26scale=227max_words=200#最多词个数28min_font_size=4#最小字体大小29stopwords=stopwords30random_state=4231background_color='
white'
#背景颜色32max_font_size=150#最大字体大小33)34#生成词云35wc.generate_from_text(text)36#等价于37#wc.generate(text)38#根据图片色设置背景色39wc.recolor(color_func=img_colors)40#存储图像41wc.to_file('
1900pro1.png'
)42#显示图像43plt.imshow(wcinterpolation='
)44plt.axis('
)45plt.tight_layout()46plt.show()
这里,首先通过open()方法读取文本文件,Image.open()方法读取了背景图片,np.array方法将图片转换为矩阵。
接着设置了词云自带的英文StopWords停止词,用来分割筛除文本中不需要的词汇,比如:
a、an、the这些。
然后,在WordCloud方法中,设置词云的具体参数。
generate_from_text()方法生成该词云,recolor()则是根据图片色彩绘制词云文字颜色。
最终的词云绘制效果如下:
现在,我们还是看到了显眼的「ONE」,下面我们将它去除掉,方法也很简单,几行代码就可以实现:
1#获取文本词排序,可调整stopwords2process_word=WordCloud.process_text(wctext)3sort=sorted(process_word.items()key=lambdae:
e[1]reverse=True)4print(sort[:
50])#获取文本词频最高的前50个词5#结果6[('
one'
60)('
ship'
47)('
NineteenHundred'
43)('
know'
38)('
music'
36)...]7
8stopwords=set(STOPWORDS)9stopwords.add('
)
首先,我们对文本词频进行排序,可以看到「ONE」词频最高,就将它添加进stopwords中,这样就可以屏蔽该词从而不在词云中显示。
需要注意的是,这种手动添加停止词的方法适用于词数量比较少的情况。
另外,我们还可以将词云图颜色显示为黑白渐变色,也只需修改几行代码即可:
1defgrey_color_func(wordfont_sizepositionorientationrandom_state=None2**kwargs):
3return"
hsl(00%%%d%%)"
%random.randint(50100)4#随机设置hsl色值5wc.recolor(color_func=grey_color_func)
效果如下:
以上,就是英文词云图绘制的几种方法,下面我们介绍中文词云图的绘制。
2.中文词云
相比于英文词云,中文在绘制词云图前,需要先切割词汇,这里推荐使用jieba包来切割分词。
因为它可以说是最好的中文分词包了,GitHub上拥有160K的Star数。
安装好jieba包后,我们就可以对文本进行分词然后生成词云。
这里,选取吴军老师的著作《浪潮之巅》作为中文文本的案例,仍然采用图片形式的词云图。
素材准备好后,接下来就可以开始中文词云图绘制。
首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式:
1text=open(path.join(d'
langchao.txt'
)'
rb'
).read()2text_charInfo=chardet.detect(text)3print(text_charInfo)4#结果5{'
encoding'
:
'
UTF-8-SIG'
confidence'
1.0'
language'
'
}6text=open(path.join(dr'
)encoding='
).read()
接着,对文本进行分词。
jieba分词有3种方式:
精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。
比如,有这样的一句话:
「"
我来到北京清华大学"
」,用3种模式进行分词,结果分别如下:
∙全模式:
我/来到/北京/清华/清华大学/华大/大学
∙精确模式:
我/来到/北京/清华大学
∙搜索引擎模式:
我/来/来到/北京/清华/大学/清华大学/
根据结果可知,我们应该选择「精确模式」来分词。
关于jieba包的详细用法,可以参考GitHub仓库链接:
分词完成后,还需要设置stopwords停止词,由于WordCloud没有中文停止词,所以需要自行构造。
这里可以采取两种方式来构造:
∙通过stopwords.update()方法手动添加
∙根据已有stopwords词库遍历文本筛除停止词
2.1.stopwords.update()手动添加
这种方法和前面的英文停止词构造的方法是一样的,目的是在词云图中不显示stopwords就行了,即先不设置stopwords,而是先对文本词频进行排序,然后将不需要的词语添加为stopwords即可,代码实现如下:
50])##获取文本词频最高的前50个词5
6[('
公司'
1273)('
但是'
769)('
IBM'
668)('
一个'
616)('
Google'
429)('
自己'
396)('
因此'
363)('
微软'
358)('
美国'
344)('
没有'
334)...]
可以看到,我们先输出文本词频最高的一些词汇后,发现:
「但是」、「一个」、「因此」这些词都是不需要显示在词云图中的。
因此,可以把这些词用列表的形式添加到stopwords中,然后再次绘制词云图就能得出比较理想的效果,完整代码如下:
1importchardet2importjieba3text+='
.join(jieba.cut(textcut_all=False))#cut_all=False表示采用精确模式4#设置中文字体5font_path='
C:
\Windows\Fonts\SourceHanSansCN-Regular.otf'
#思源黑体6#读取背景图片7background_Image=np.array(Image.open(path.join(d"
wave.png"
)))8#提取背景图片颜色9img_colors=ImageColorGenerator(background_Image)10#设置中文停止词11stopwords=set('
)12stopwords.update(['
很多'
可以'
这个'
虽然'
因为'
这样'
已经'
现在'
一些'
比如'
不是'
当然'
可能'
如果'
就是'
同时'
这些'
必须'
由于'
而且'
并且'
他们'
])1314wc=WordCloud(15font_path=font_path#中文需设置路径16margin=2#页面边缘17mask=background_Image18scale=219max_words=200#最多词个数20min_font_size=4#21stopwords=stopwords22random_state=4223background_color='
#背景颜色24#background_color='
#C3481A'
#背景颜色25max_font_size=10026)27wc.generate(text)28#获取文本词排序,可调整stopwords29process_word=WordCloud.process_text(wctext)30sort=sorted(process_word.items()key=lambdae:
e[1]reverse=True)31print(sort[:
50])#获取文本词频最高的前50个词32#设置为背景色,若不想要背景图片颜色,就注释掉33wc.recolor(color_func=img_colors)34#存储图像35wc.to_file('
浪潮之巅basic.png'
)36#显示图像37plt.imshow(wcinterpolation='
)38plt.axis('
)39plt.tight_layout()40plt.show()
stopwords添加之前:
stopwords添加之后:
可以看到,stopwords.update()这种方法需要手动去添加,比较麻烦一些,而且如果stopwords过多的话,添加就比较费时了。
下面介绍第2种自动去除stopwords的方法。
2.2.stopwords库自动遍历删除
这种方法的思路也比较简单,主要分为2个步骤:
∙利用已有的中文stopwords词库,对原文本进行分词后,遍历词库去除停止词,然后生成新的文本文件。
∙根据新的文件绘制词云图,便不会再出现stopwords,如果发现stopwords词库不全可以进行补充,然后再次生成词云图即可。
1#对原文本分词2defcut_words():
3#获取当前文件路径4d=path.dirname(__file__)if"
inlocals()elseos.getcwd()5text=open(path.join(dr'
).read()6text=jieba.cut(textcut_all=False)7content='
8foriintext:
9content+=i10content+="
"
11returncontent1213#加载stopwords14defload_stopwords():
15filepath=path.join(dr'
stopwords_cn.txt'
)16stopwords=[line.strip()forlineinopen(filepathencoding='
utf-8'
).readlines()]17#print(stopwords)#ok18returnstopwords1920#去除原文stopwords并生成新的文本21defmove_stopwwords(contentstopwords):
22content_after='
23forwordincontent:
24ifwordnotinstopwords:
25ifword!
='
\t'
and'
\n'
26content_after+=word2728content_after=content_after.replace("
).replace("
)29#print(content_after)30#写入去停止词后生成的新文本31withopen('
langchao2.txt'
w'
encoding='
)asf:
32f.write(content_after)
网上有很多中文stopwords词库资料,这里选取了一套包含近2000个词汇和标点符号的词库:
stopwords_cn.txt,结构形式如下:
遍历该stopwords词库,删除停止词获得新的文本,然后利用第一种方法绘制词云图即可。
首先输出一下文本词频最高的部分词汇,可以看到常见的停止词已经没有了:
1[('
1462)('
366)('
322)('
320)('
市场'
287)('
投资'
263)('
世界'
236)('
硅谷'
235)('
技术'
234)('
发展'
225)('
计算机'
218)('
摩托罗拉'
203)...]
词云图最终效果如下:
3.Frenquency词云图
上面两种中英文词云图都是通过文本绘制的,而除了直接读入文本生成词云以外,比较常见的还有通过「词频」绘制词云图。
这种词云图,则可以使用Datafrxxxxame或者字典格式来绘制。
下面,以此前我们爬过的一篇「」教程的数据为例,介绍如何绘制词频词云图。
该份数据大小为5001行x6列,我们想根据各国TOP500强大学的数量,来可视化地展示各国之间的大学数量差异。
1world_rankuniversityscorequantityyearcountry21哈佛大学1005002009USA32斯坦福大学73.14992009USA43加州大学-伯克利714982009USA54剑桥大学70.24972009UK65麻省理工学院69.54962009USA7...8496犹他州立大学2018USA9497圣拉斐尔生命健康大学2018Italy10498早稻田大学2018Japan11499韦恩州立大学2018USA12500西弗吉尼亚大学2018USA
这里,有两种方式可以直接生成频率词云图,第一种是利用Series列表生成,代码实现如下:
1importpandasaspd2importmatplotlib.datesasmdate3fromwordcloudimportWordCloud4importmatplotlib.pyplotasplt56df=pd.read_csv('
university.csv'
encoding='
)7df=df.groupby(by='
country'
).count()8df=df['
world_rank'
].sort_values(ascending=False)9print(df[:
10])10#结果如下:
11country12USA145913Germany38214UK37915China32016France21017Canada20918Japan20619Australia19920Italy19521Netherlands122
第二种方式是转换为dict字典生成,一行代码就可以完成:
1df=dict(df)2print(df)3#结果如下:
4{'
USA'
1459'
Germany'
382'
UK'
379'
China'
320'
France'
210..}
数据转换好以后,就可以生成词云图了,代码实现如下:
1font_path='
#思源黑2wordcloud=WordCloud(3background_color='
#F3F3F3'
4font_path=font_path5width=50006height=3007margin=28max_font_size=2009random_state=4210scale=211colorm
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WordCloud 中英文词云图绘制看这一篇就够了 中英文 云图 绘制 一篇
![提示](https://static.bdocx.com/images/bang_tan.gif)