词云图

wordcloud 是什么? 词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现词云图过滤掉大量的低频低质的文本信息使得浏览者只要一眼扫过文本就可领略文本的主旨。

安装

pip install wordcloud

怎么使用?

先导入,在创建一个wordcloud的实例化对象。

基本使用方法如下:

from wordcloud import WordCloud #导入with open("new.txt","r",encoding="utf-8") as file:#打开文件txt = file.read()#读取文件wordcloud = WordCloud(font_path="BASKVILL.TTF",#设置属性collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt)#生成图片image = wordcloud.to_image()#展示图片image.show()#保存图片wordcloud.to_file("tag.jpg")

这里面的参数都是什么意思?

  • font_path 字体路径。如果数据文件中包含的有中文的话,font_path必须指定字体,否则中文会乱码
  • collocations: 是否包括两个词的搭配,默认为True,如果为true的时候会有重复的数据,这里我不需要重复数据,所以设置为False
  • width 幕布的宽度,height 幕布的高度
  • max _words 要显示的词的最大个数
  • generate 读取文本文件
font_path 字体的路径
  1. 绝对路径:这里为了方便就使用绝对路径了

    C:\Windows\Fonts\simhei.ttf

    怎么找?
    在C:\Windows\Fonts\找到字体之后右键,属性,找到字体文件名

  2. 相对路径:

    把字体文件放到与py文件一个文件夹里

从文件中读取文本
from wordcloud import WordCloudwith open("new.txt","r",encoding="utf-8") as file:txt = file.read()wordcloud = WordCloud(font_path="BASKVILL.TTF",#这里我用的是相对路径,自己演示的时候可以做修改collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt)#generate(txt)这个方法的作用是把 txt 里面的信息传给wordcloud,让他绘制词云图#生成图片image = wordcloud.to_image()#展示图片image.show()

文本为英文时font_path可以不用写

from wordcloud import WordCloud# 第一个是包名,第二个是类名txt ="The awesome yellow planet of Tatooine emerges from a totaleclipse,~her two moons glowing againstl"wordcloud = WordCloud(# font_path="C:\Windows\Fonts\STFANGSO.TTF",collocations=False,#这些也可以不用设置,默认的也可以background_color="black",width=800,height=600,max_words=50).generate(txt)#生成图片image = wordcloud.to_image()#展示图片image.show()

文本含中文时,不加字体路径会出现乱码现象

from wordcloud import WordCloud# wordcloud是包名,WordCloud是类名txt = "这是我写的第一个词云图"wordcloud = WordCloud(# font_path="C:\Windows\Fonts\simhei.ttf",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt)#生成图片image = wordcloud.to_image()#展示图片image.show()

把路径加上再演示一下

from wordcloud import WordCloud# wordcloud是包名,WordCloud是类名txt = "这是我写的第一个词云图"wordcloud = WordCloud( font_path="C:\Windows\Fonts\simhei.ttf",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt)#生成图片image = wordcloud.to_image()#展示图片image.show()

运行后会发现这根本不是词云图

wordcloud默认以空格来拆分词

怎么解决?

方法一:手动给中文分词
from wordcloud import WordCloud# wordcloud是包名,WordCloud是类名txt = "这 是我 写的 第一个 词云图"wordcloud = WordCloud(font_path="C:\Windows\Fonts\STFANGSO.TTF",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt)#生成图片image = wordcloud.to_image()#展示图片image.show()

方法二:

中文使用词云图—需要使用jieba分词模块

特点-支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析
  • 全模式,把句子中所有的可以成词的词语都扫描出来速度非常快,但是不能解决歧义
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引警分词。
  • 支持繁体分词
  • 支持自定义词典

安装

pip install jieba
  • jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模e式,HMM 参数用来控制是否使用 HMM 模型。必须需要传入的参数:需要分词的字符串
  • jieba.cut_for_seaich 方法接受两个参数: 需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用 =jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
import jiebaseg_list = jieba.cut("我来到北京清华大学") # 默认是精确模式print(" ".join(seg_list)) seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 默认print("-".join(seg_list))

一般都是以空格相连

全模式
seg_list = jieba.cut("我来到北京清华大学",cut_all=True)print("Full Mode:" + " ".join(seg_list))
精确模式
seg_list = jieba.cut("我来到北京清华大学",cut_all=False)print("Default Mode:" + " ".join(seg_list)) #精确模式
cut_for_search

会从前往后找能够拼接的词。把能组成词的全部显示出来

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")print(" ".join(seg_list))

看一下拆分后是什么?

import jieba # 数据文件txt ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"txt_list =jieba.cut(txt)#jieba.cut()返回的是一个迭代器没法直接打印print([i for i in txt_list])

txt_str = " ".join(txt_list)#把txt_list 这个列表里的数据用空格来拼接起来,前面" "里面是什么,就拿什么拼接

还有一点要注意:

import jieba # 数据文件txt ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"txt_list =jieba.cut(txt)#jieba.cut()返回的是一个迭代器没法直接打印print(type(txt_list))print([i for i in txt_list])txt_str = " ".join(txt_list)#把txt_list 这个列表里的数据用空格来拼接起来,前面" "里面是什么,就拿什么拼接print(txt_str) # 这一步无法打印是因为前面使用了迭代器,前面迭代器已经走到最后了,再往后就没有了

词云图和分词结合起来

from wordcloud import WordCloudimport jiebaimport jieba.analysetxt ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"txt_list = jieba.cut(txt)# 分词txt_str = " ".join(txt_list)# 拼接wordcloud = WordCloud(font_path="C:\Windows\Fonts\STFANGSO.TTF",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt_str)#传入#生成图片image = wordcloud.to_image()#展示图片image.show()

但是它还有问题:像 的 了 着 这些我们不需要,怎么处理???

jieba.analyse的使用: 提取关键字

  • 第一个参数:待提取关键词的文本。

  • 第二个参数 topk:返回关键词的数量,重要性从高到低排排序

  • 第三个参数withWeight:是否同时返回每个关键词的权重 (一般用不到)

  • 第四个参数allowPOS=(): 词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词

    比如:名词为 n,动词为 v

注意事项:必须引入的使用就引入jieba.analyse,才能使用. 不能导入jieba,然后使用jieba.analyse,会报错

试一试?

import jieba# import jieba.analysetext ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text, allowPOS=("v"))print("analysea extract allowPOS:"+ str((seg_list))) # 分析提取

提取名词

import jiebaimport jieba.analyse text ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text, allowPOS=("n"))print("analysea extract allowPOS:"+ str((seg_list))) # 分析提取

提取动词

import jiebaimport jieba.analysetext ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text, allowPOS=("v"))print("analysea extract allowPOS:"+ str((seg_list))) # 分析提取

不设置词性

import jieba.analysetext ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text)print("analysea extract allowPOS:"+ str((seg_list))) # 分析提取

词云图和分词结合起来

from wordcloud import WordCloudimport jieba.analysetext ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text)#将列表拼接成字符串txt_str = " ".join(seg_list)wordcloud = WordCloud(font_path="C:\Windows\Fonts\STFANGSO.TTF",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt_str)#生成图片image = wordcloud.to_image()#展示图片image.show()

对比上面生成的没有像 的 了 着 的那些词了,相比之下好很多

综合案例

from wordcloud import WordCloudimport jieba.analysetext ="皇后区的友好邻居变成了宇宙的,现实世界资本的侵蚀之下,只有哥谭还维持着它的地域性"seg_list = jieba.analyse.extract_tags(text,topK=3,allowPOS=("v"))#将列表拼接成字符串txt_str = " ".join(seg_list)wordcloud = WordCloud(font_path="C:\Windows\Fonts\STFANGSO.TTF",collocations=False,background_color="white",width=800,height=600,max_words=50).generate(txt_str)#生成图片image = wordcloud.to_image()#展示图片image.show()