更多优质内容
请关注公众号

Python:使用jieba分词和wordcloud实现词云-张柏沛IT博客

正文内容

Python:使用jieba分词和wordcloud实现词云

栏目:Python 系列: 发布时间:2019-12-17 14:21 浏览量:3432

词云是对网络文本中出现频率较高的关键词予以视觉上的突出。

安装结巴库和词云库
pip install jieba
pip install wordcloud

jieba是分词工具,下面是其使用

jieba.cut(str,cut_all=False)
cut_all是否使用全模式,默认False

jieba.cut_for_search(s)   #适用于搜索引擎构建倒排索引的分词,粒度比较细,效果和cut(cut_all=True)基本相同

通过列表推导式将返回结果变成列表
res = [i for i in jieba.cut(content)]

或者使用list()转为列表

jieba.cut()不会自动对分词结果去重,如果想获取去重的结果可以用set()转换为集合

import jieba

str1 = """据悉,今天凌晨3时开始,随着造成降雪的天气系统逐渐东移,全市开始了比较明显的降雪。不过,系统在东移加深过程中移动缓慢,但降雪并没有停止,目前大部分地区的雪还是下得比较可观的。"""
res1 = jieba.cut(str1)  #jieba.cut返回一个迭代器,可以使用list()或者列表推导式转为列表形式
# print(list(res1))
print([i for i in res1])
print(list(jieba.cut(str1,cut_all=True)))

print(list(jieba.cut_for_search(str1)))


词频和分词字典
词频是指某个词在整个文本中出现的次数

collections.Counter(str or list).most_common(n)

传入列表或者字符串,它会返回列表中出现次数超过n次的元素,n不传默认显示所有词的词频

import jieba
from collections import Counter

with open("../material/pachong.txt","r",encoding="utf-8") as f:
    content = f.read()

res_list = [i for i in jieba.cut(content) if len(i)>=2]
print(res_list)

print(Counter(res_list).most_common(10))  #获取出现超过10次的次的词频
# [('标题', 106), ('中北大学', 28), ('学姐', 28), ('贵校', 24), ('考生', 24), ('理科', 22), ('学长', 22), ('专业', 20), ('一本', 18), ('毕业生', 12)]

指定属于自己的词典
比如,jieba分词会将一些专有名词给拆分,但是实际上这些词不能拆分,为了让分词的准确率更高,可以自定义词典

jieba.load_userdict(file_name)
词典文件中,一个词占一行,每行为 词语,词频(可省略),词性(可省略) 用空格隔开;文件必须以utf-8编码
设置词频是为了让他的成词率更高,一般指定3~5的样子就可以

只需先
jieba.load_userdict()

jieba.cut()
即可按照自己的词典分词

========================
词云是将感兴趣的词放在一副图像中,可以控制词语的位置,大小,字体,字体的大小反映词语出现频率。

res = WordClound(font_path="simhei.ttf").generate(content)    #simhei.ttf是中文字体

其中content是字符串,这个字符串是一个文本分词后将分词用空格隔开的字符串。
词云会根据content中的内容自动计算每个词的词频,无需我们手动计算词频

它返回的是一个对象

plt.imshow(res)
plt.axis("off")
plt.show()  

即可展现词云图
如果想保存图片可以plt.savefig("路径")或者res.to_file("路径")即可

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt

with open("../material/pachong.txt","r",encoding="utf-8") as f:
    content = f.read()

res = [i for i in jieba.cut(content) if len(i)>=2]   #先对文本进行分词
print(res)

#形成词云
wc = WordCloud(font_path="simhei.ttf").generate(" ".join(res))   #返回一个词云对象
print(wc)

#输出图片
plt.imshow(wc)
plt.axis("off")   #去掉坐标轴
plt.show()


词云图


WordClound()其他参数如下:
width height 画布宽高 默认400*200
mask 词云轮廓,数据类型为nd-array;如果设置了mask,则width和height会被忽略
max_words number,最多在画布上显示多少词
stopwords  停用词,数据类型是字符串;默认使用wordCloud内置的停用词库
background_color
max_font_size
                

除了generate方法,WordCloud还有其他方法:

fit_words(dict) 
根据词频生成词云,dict是一个类似于这样的字典: {"词1":5,"词2":12,"词3":2,....}
可以通过使用 

res = Counter(content).most_common()
dict1 = dict(res)

来获取到上面这样的字典


to_file() 图片另存为
to_array()  转为numpy数组


接下来生成一张有轮廓的词云图

from wordcloud import WordCloud
import jieba
import cv2
import matplotlib.pyplot as plt

#获取分词文本
with open("../material/pachong.txt",encoding="utf-8") as f:
    content = f.read()

res = " ".join([i for i in jieba.cut(content) if len(i)>=2])

#获取轮廓图
mask = cv2.imread("../material/apchong.png")   #返回numpy数组

#绘制词云图
wc = WordCloud(font_path="simhei.ttf",mask=mask,max_words=500,background_color="white").generate(res)

plt.imshow(wc)
plt.axis("off")
plt.show()

wc.to_file("wordcloud.png")  #图片另存为

带轮廓的词云图




更多内容请关注微信公众号
zbpblog微信公众号

如果您需要转载,可以点击下方按钮可以进行复制粘贴;本站博客文章为原创,请转载时注明以下信息

张柏沛IT技术博客 > Python:使用jieba分词和wordcloud实现词云

热门推荐
推荐新闻