下面是用 Python 结合 jieba 和 wordcloud 实现词云的完整攻略:
1. 安装所需库
首先需要确保已经安装了需要用到的 jieba
和 wordcloud
库。如果没有安装,可以在控制台使用以下命令安装:
pip install jieba
pip install wordcloud
2. 准备文本数据
准备需要生成词云的文本数据,可以是文件形式或者直接在 Python 程序中定义字符串。例如,下面的示例中我们直接定义字符串:
text = "动物园是一个好地方,里面有很多有趣的动物,小朋友们都很喜欢来这里玩。"
3. 利用 jieba 进行分词
为了将文本分成单个的词语,需要使用 jieba 来进行中文分词。在分词之前还需要先创建一个 jieba 分词器对象:
import jieba
jieba.setLogLevel(20) # 设置日志等级,避免无用日志输出
seg_list = jieba.cut(text) # 对 text 进行分词,返回的是一个可迭代的 generator
setLogLevel()
方法是设置 jieba 的日志等级,避免无用日志输出,如果不设置可能会在控制台上产生大量无用输出。
需要注意的是,jieba.cut() 返回的是一个可迭代的 generator,可以通过 for 循环或者列表生成式将其转换为列表:
word_list = list(seg_list) # 将 jieba.cut() 返回的结果转换为列表
4. 提取关键词
如果想要生成词云,需要进一步提取文本中的关键词。jieba 还提供了一个方法用于提取关键词,为了提高准确度,可以在提取关键词时指定停用词文件,这些停用词不会作为关键词进行计算。例如下面的示例代码:
jieba.analyse.set_stop_words("stop_words.txt") # 加载停用词文件
# 提取关键词,返回的是一个列表,每个元素为一个 tuple,其中第一个元素为关键词,第二个元素为关键词的权重
keywords = jieba.analyse.extract_tags(text, topK=20, withWeight=True)
其中,jieba.analyse.set_stop_words()
方法用于加载停用词文件,topK
参数表示提取的关键词数量,默认为 20,可以根据需要进行调整。
5. 生成词云
接下来利用 wordcloud 生成词云,首先需要导入 wordcloud:
from wordcloud import WordCloud
然后,创建一个 WordCloud 对象,设置相关参数,如下所示:
wc = WordCloud(font_path="STHeiti Medium.ttc", # 指定字体文件
width=1000, height=600, # 指定词云图的大小
background_color="white", # 指定背景色
max_words=50, # 指定最多显示的单词数量
min_font_size=10, # 指定最小字号
contour_width=1, contour_color='steelblue' # 指定轮廓线宽度和颜色
)
其中,font_path
指定了用于显示中文的字体文件,width
和 height
分别指定了词云图的宽度和高度,background_color
指定了词云图的背景色,max_words
指定了最多显示的单词数量,min_font_size
指定了最小的字号,contour_width
和 contour_color
分别指定了词云轮廓线的宽度和颜色。
最后,调用 WordCloud 对象的 generate()
方法,生成词云:
wc.generate_from_frequencies(dict(keywords))
wc.to_file("output.png") # 将词云保存到图片文件中
其中,wc.generate_from_frequencies()
方法接受一个字典作为参数,字典的 key 为关键词,value 为该关键词的权重。由于 jieba.analyse.extract_tags()
方法返回的是一个列表,每个元素是一个关键词 tuple,因此需要使用 dict()
方法将其转换成字典。
最后使用 to_file()
方法将生成的词云保存到图片文件中。
示例1:生成单个文本文件的词云
下面是一个完整的示例,根据单个文本文件生成词云。
import jieba
import jieba.analyse
from wordcloud import WordCloud
# 准备文本数据
with open("data.txt", "r", encoding="utf-8") as f:
text = f.read()
# 分词
jieba.setLogLevel(20)
seg_list = jieba.cut(text)
word_list = list(seg_list)
# 提取关键词
jieba.analyse.set_stop_words("stop_words.txt")
keywords = jieba.analyse.extract_tags(text, topK=50, withWeight=True)
# 创建词云
font_path = "STHeiti Medium.ttc"
background_color = "white"
wc = WordCloud(font_path=font_path,
width=1000, height=600,
background_color=background_color,
max_words=50,
min_font_size=10,
contour_width=1, contour_color='steelblue')
# 生成词云
wc.generate_from_frequencies(dict(keywords))
wc.to_file("output.png")
示例2:生成多个文本文件的词云
如果要生成多个文本文件的词云,可以将上面的代码放在一个函数中,然后循环读取多个文件,将文件内容传递给函数生成词云。例如下面的示例代码:
import os
# 生成词云的函数
def generate_wordcloud(text):
# 分词
jieba.setLogLevel(20)
seg_list = jieba.cut(text)
word_list = list(seg_list)
# 提取关键词
jieba.analyse.set_stop_words("stop_words.txt")
keywords = jieba.analyse.extract_tags(text, topK=50, withWeight=True)
# 创建词云
font_path = "STHeiti Medium.ttc"
background_color = "white"
wc = WordCloud(font_path=font_path,
width=1000, height=600,
background_color=background_color,
max_words=50,
min_font_size=10,
contour_width=1, contour_color='steelblue')
# 生成词云
wc.generate_from_frequencies(dict(keywords))
wc.to_file("output.png")
# 循环读取多个文本文件
for filename in os.listdir("data"):
if filename.endswith(".txt"):
filepath = os.path.join("data", filename)
with open(filepath, "r", encoding="utf-8") as f:
text = f.read()
generate_wordcloud(text)
上面的示例中,os.listdir("data")
返回 data 目录下的所有文件名,然后循环判断文件名是否以 .txt
结尾,如果是,则读取文件内容并将其传递给 generate_wordcloud()
函数生成词云。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用python结合jieba和wordcloud实现词云效果 - Python技术站