词云(wordcloud)使用简单介绍

  • A+
所属分类:Python库介绍
摘要这一篇文章简单介绍关于词云(wordcloud)的简单使用. 主要介绍以下生成基本的词云和加上蒙版之后的词云的图片.

简介

这一篇介绍关于词云的生成. 生成的结果如下所示. 会简单介绍一些参考资料和简单的使用方式.

词云(wordcloud)使用简单介绍

参考链接

 

简单使用方式介绍

关于字体说明

使用wordcloud可以指定使用的字体, 在windows中, 字体在以下的文件夹中: C:\Windows\Fonts, 可以将其中的字体文件拷贝到当前的文件夹内.

我们指定字体可以使得其能生成中文的词云. 我下面放一张图, 具体生成过程是和下面的方法是一样的.

词云(wordcloud)使用简单介绍

使用前准备

  1. from os import path
  2. from wordcloud import WordCloud
  3. from PIL import Image
  4. import numpy as np
  5. d = path.dirname(__file__)
  6. # Read the whole text.
  7. text = open(path.join(d, 'constitution.txt'), encoding='utf8').read()
  8. # 导入字体文件
  9. font_path = path.join(d, 'HYC6GFM.TTF')

生成普通的wordcloud

我们可以指定使用的字体, 图像的大小和颜色等.

  1. # 生成普通的wordcloud
  2. wordcloud = WordCloud(font_path=font_path, margin=1, random_state=1, max_words=300, width=1000, height=700, background_color='white').generate(text)
  3. wordcloud.to_file('wordcloud.jpg')

最终的生成效果如下所示:

词云(wordcloud)使用简单介绍

使用蒙版来生成图片

我们想要使得生成图片能与蒙版相符, 我们使用下面的蒙版(如果想要使用自己的蒙版,可以使用关键词「剪影」,这样主要的图像是黑色的,我们主要就是突出一个轮廓):

词云(wordcloud)使用简单介绍
  1. # 生成带有mask的图片
  2. mask = np.array(Image.open(path.join(d, "62.jpg")))
  3. wordcloud = WordCloud(font_path=font_path, mask=mask, margin=1, random_state=1, background_color='white').generate(text)
  4. wordcloud.to_file('wordcloud_mask.jpg')

最终生成的效果如下所示:

词云(wordcloud)使用简单介绍

源代码

将上面的测试代码放在了github上, 链接为: wordcloud测试脚本

 

关于中文文档

因为中文文档与外文不同,字符之间没有空格,所以我们需要首先对中文的文本进行分词。我们使用 jieba 库来对中文进行分词。这一部分参考自,中文文本的词云生成(以《三体》为例)。这一篇文章的代码可能有点问题,我在这里做一下简单的修改。

中文句子分词

首先我们对一句完整的句子进行分词,使用 jieba 来完成。

  1. # 对句子进行分词  
  2. def seg_sentence(sentence):
  3.     sentence_seged = jieba.cut(sentence.strip())  #strip()用来消除前后的空格
  4.     outstr = ''
  5.     for word in sentence_seged:
  6.         if word != '\t':
  7.             outstr += word
  8.             outstr += " " #去掉制表符并用空格分隔各词
  9.     return outstr.strip()

最终的效果如下所示:

词云(wordcloud)使用简单介绍

 

停用词的处理

我们看到,上面句子中包含一些「停用词」,例如标点符号等,我们需要将其去掉。关于停用词表,可以直接在 github 上搜索「停用词」即可。我这里随便选择了其中的一个停用词来作为例子。

下面的函数可以读入停用词表,并将其转换为一个 list。

  1. # 创建停用词list  
  2. def stopwordslist(filepath):
  3.     stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
  4.     return stopwords

大致的效果如下所示:

词云(wordcloud)使用简单介绍

 

中文句子分词与停用词

我们把上面的两个步骤结合起来。对中文句子进行分词,同时去掉其中的「停用词」。

  1. def seg_sentence(sentence):
  2.    sentence_seged = jieba.cut(sentence.strip())
  3.    stopwords = stopwordslist('./stop.txt')  # 这里加载停用词的路径  
  4.    outstr = ''
  5.    for word in sentence_seged:
  6.        if word not in stopwords: # 判断如果不是停用词
  7.            if word != '\t':
  8.                outstr += word
  9.                outstr += " "
  10.    return outstr

 

对中文文档绘制 wordcloud

在有了上面的铺垫之后,我们就可以对一个中文的文档绘制 wordcloud 了。整体的代码如下所示:

  1. import jieba
  2. from wordcloud import WordCloud
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from PIL import Image
  6. inputs = open('./example.txt', 'r', encoding='utf-8') # 原始的中文文档
  7. outputs = open('./output.txt', 'w', encoding='utf-8') # 分词过后的中文文档
  8. for line in inputs:
  9.     line_seg = seg_sentence(line)  # 对每个句子进行分词
  10.     outputs.write(line_seg + '\n')  # 将处理过后的文件进行保存
  11. outputs.close()
  12. inputs.close()
  13. mask = np.array(Image.open("./66.jpg")) # 模板图片
  14. inputs = open('output.txt', 'r', encoding='utf-8')
  15. mytext=inputs.read()
  16. wordcloud=WordCloud(mask=mask, width=3000, height=3000, background_color="white", margin=1,
  17.                     max_words=300, min_font_size=10, max_font_size=None, repeat=False,
  18.                     font_path="./FZKaTong-M19S.ttf").generate(mytext) #生成云图
  19. wordcloud.to_file('wordcloud.jpg')
  20. inputs.close()

最终生成的图像的效果如下所示:

词云(wordcloud)使用简单介绍

指定颜色风格

在生成词云的时候,有一个参数是 colormap,我们可以指定需要的颜色风格。关于详细的 colormap 的内容,可以查看链接,Matplotlib Colormap reference。我们想要 colormap 起作用,需要设置 mode='RGBA'

  1. wordcloud=WordCloud(mask=mask, width=800, height=800, background_color="white", margin=1, max_words=10000, min_font_size=10, max_font_size=None, repeat=True,collocations=Falsemode='RGBA', colormap='Reds',font_path="./FZKaTong-M19S.ttf").generate(mytext)

 

关键词显示重复

如果我们不想要出现的内容重复,我们可以参数,collocations=False,即可。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: