如何使用python实现一个优雅的词云?(超详细)
文 | 酷头
什么是词云
jieba
"结巴"中文分词:做最好的Python中文分词组件 "Jieba"
安装
pip install jieba
jieba的分词模式
支持三种分词模式:
这里我就以昨日爬取微博鸿星尔克的评论为测试内容。
“网友:我差点以为你要倒闭了!”鸿星尔克捐款5000w后被网友微博评论笑哭...
精确模式,试图将句子最精确地切开,适合文本分析;
它可以将结果十分精确分开,不存在多余的词。
常用函数:cut(str)、lcut(str)
import pandas as pd
import jieba
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.cut(''.join(text))
result = ' '.join(wordlist)
print(result)
全模式,它可以将结果全部展现,也就是一段话可以拆分进行组合的可能它都给列举出来了
把句子中所有的可以成词的词语都扫描出来, 速度非常快
常用函数:lcut(str,cut_all=True) 、 cut(str,cut_all=True)
import pandas as pd
import jieba
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.lcut(''.join(text), cut_all = True)
result = ' '.join(wordlist)
print(result)
搜索引擎模式,在精确模式的基础上,对长词再次切分
它的妙处在于它可以将全模式的所有可能再次进行一个重组
常用函数:lcut_for_search(str) 、cut_for_search(str)
import pandas as pd
import jieba
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.lcut_for_search(''.join(text))
result = ' '.join(wordlist)
print(result)
处理停用词
在有时候我们处理大篇幅文章时,可能用不到每个词,需要将一些词过滤掉
这个时候我们需要处理掉这些词,比如我们比较熟悉的‘你’ ‘了’、 ‘我’、'的' 什么的
import pandas as pd
import jieba
from stylecloud import gen_stylecloud
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.lcut_for_search(''.join(text))
result = ' '.join(wordlist)
# 设置停用词
stop_words = ['你', '我', '的', '了', '们']
ciyun_words = ''
# 过滤后的词
for word in result:
if word not in stop_words:
ciyun_words += word
print(ciyun_words)
可以看到,我们成功去除了我们不需要的词 ‘你’ ‘了’、 ‘我’、'的' ,那么这到底是个什么骚操作呢?
其实很简单,就是将这些需要摒弃的词添加到列表中,然后我们遍历需要分词的文本,然后进行读取判断
如果遍历的文本中的某一项存在于列表中,我们便弃用它,然后将其它不包含的文本添加到字符串,这样生成的字符串就是最终的结果了。
权重分析
很多时候我们需要将关键词以出现的次数频率来排列,这个时候就需要进行权重分析了,这里提供了一个函数可以很方便我们进行分析,
jieba.analyse.extract_tags
import pandas as pd
import jieba.analyse
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.lcut_for_search(''.join(text))
result = ' '.join(wordlist)
# 设置停用词
stop_words = ['你', '我', '的', '了', '们']
ciyun_words = ''
for word in result:
if word not in stop_words:
ciyun_words += word
# 权重分析
tag = jieba.analyse.extract_tags(sentence=ciyun_words, topK=10, withWeight=True)
print(tag)
'''
[('尔克', 0.529925025347557),
('国货', 0.2899827734123779),
('加油', 0.22949648081224758),
('鸿星', 0.21417335917247557),
('支持', 0.18191311638625407),
('良心', 0.09360297619470684),
('鞋子', 0.07001117869641693),
('之光', 0.06217569267289902),
('企业', 0.061882654176791535),
('直播', 0.059315225448729636)]
'''
topK就是指你想输出多少个词,withWeight指输出的词的词频。
分词介绍完了,接下来我们介绍一下绘图库
wordcloud
我们词云的主要实现是用过 wordcloud 模块中的 WordCloud 类实现的,我们先来了解一个 WordCloud 类。
安装
pip install wordcloud
生成一个简单的词云
我们实现一个简单的词云的步骤如下:
导入 wordcloud 模块
准备文本数据
创建 WordCloud 对象
根据文本数据生成词云
保存词云文件
我们按照上面的步骤实现一个最简单的词云:
# 导入模块
from wordcloud import WordCloud
# 文本数据
text = 'he speak you most bueatiful time|Is he first meeting you'
# 词云对象
wc = WordCloud()
# 生成词云
wc.generate(text)
# 保存词云文件
wc.to_file('img.jpg')
WordCloud 的一些参数
参数 | 参数类型 | 参数介绍 |
# 导入模块
from wordcloud import WordCloud
# 文本数据
text = 'he speak you most bueatiful time Is he first meeting you'
# 准备禁用词,需要为set类型
stopwords = set(['he', 'is'])
# 设置参数,创建WordCloud对象
wc = WordCloud(
width=200, # 设置宽为400px
height=150, # 设置高为300px
background_color='white', # 设置背景颜色为白色
stopwords=stopwords, # 设置禁用词,在生成的词云中不会出现set集合中的词
max_font_size=100, # 设置最大的字体大小,所有词都不会超过100px
min_font_size=10, # 设置最小的字体大小,所有词都不会超过10px
max_words=10, # 设置最大的单词个数
scale=2 # 扩大两倍
)
# 根据文本数据生成词云
wc.generate(text)
# 保存词云文件
wc.to_file('img.jpg')
生成一个有形状的词云
import pandas as pd
import jieba.analyse
from wordcloud import WordCloud
import cv2
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
# 读取内容
text = pd_data['发帖内容'].tolist()
# 切割分词
wordlist = jieba.lcut_for_search(''.join(text))
result = ' '.join(wordlist)
# 设置停用词
stop_words = ['你', '我', '的', '了', '们']
ciyun_words = ''
for word in result:
if word not in stop_words:
ciyun_words += word
# 读取图片
im = cv2.imread('11.jpg')
# 设置参数,创建WordCloud对象
wc = WordCloud(
font_path='msyh.ttc', # 中文
background_color='white', # 设置背景颜色为白色
stopwords=stop_words, # 设置禁用词,在生成的词云中不会出现set集合中的词
mask=im
)
# 根据文本数据生成词云
wc.generate(ciyun_words)
# 保存词云文件
wc.to_file('img.jpg')
# 创建词云对象
wc = WordCloud(font_path='msyh.ttc')
文末再给大家介绍一个宝藏库
stylecloud使用它设置词云再简单不过了,为什么?
因为它有7865个词云图标供你选择。
需要使用那个图标只需复制下面的图标名称即可!
而且自带停用词的那种
import pandas as pd
import jieba.analyse
from stylecloud import gen_stylecloud
# 读取文件
pd_data = pd.read_excel('鸿星尔克.xlsx')
exist_col = pd_data.dropna() # 删除空行
# 读取内容
text = exist_col['发帖内容'].tolist()
# 切割分词
wordlist = jieba.cut_for_search(''.join(text))
result = ' '.join(wordlist)
gen_stylecloud(text=result,
icon_name='fas fa-comment-dots',
font_path='msyh.ttc',
background_color='white',
output_name='666.jpg',
custom_stopwords=['你', '我', '的', '了', '在', '吧', '相信', '是', '也', '都', '不', '吗', '就', '我们', '还', '大家', '你们', '就是', '以后']
)
print('绘图成功!')
又方便又好看,是我现在制作词云的首选!
总结