简介
词云制作是一种基于文本数据的可视化方法,可以通过将文本中的关键词以不同的字体大小和颜色等方式呈现在图片上,来直观地反映文本中的重点内容和关键词。
以下是一个简单的 Python 词云制作流程:
- 准备文本数据
将需要制作词云的文本数据保存在一个文本文件中,例如 txt 格式的文件。 - 导入相关库
使用 Python 中的第三方库,如 jieba、wordcloud、matplotlib 等,来实现词云制作。 - 对文本进行分词
使用 jieba 库对文本进行分词,将文本中的词语划分为一个一个的词汇。 - 进行词频统计
统计每个词语在文本中出现的次数,得到每个词语的词频。 - 生成词云图
使用 wordcloud 库生成词云图,并根据词频设定每个词语在词云图中的大小、颜色等属性。 - 可选:调整词云图风格
使用 matplotlib 库对生成的词云图进行美化,如调整背景颜色、字体样式等。
例如:
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 读取文本文件
with open('text.txt', 'r', encoding='utf-8') as f:
text = f.read()
# 对文本进行分词
words = jieba.cut(text)
# 统计词频
word_freq = {}
for word in words:
if word not in word_freq:
word_freq[word] = 0
word_freq[word] += 1
# 生成词云图
wc = WordCloud(background_color="white", width=1000, height=600, font_path='msyh.ttc')
wc.generate_from_frequencies(word_freq)
# 显示词云图
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()
在这个代码示例中,我们首先读取一个文本文件,然后使用 jieba 库对文本进行分词,并统计每个词语在文本中出现的次数。接着,使用 wordcloud 库生成词云图,并设定词语在词云图中的大小、颜色等属性。最后使用 matplotlib 库将生成的词云图显示出来。
在django + sqlite3 的项目中使用
本质上也是一样的,我们从数据库中取出需要制作成词云的数据,然后用一个变量 text 拼接成文本,然后通过 jieba 进行分词,最后调用词云库生成词云~
# 返回词云图片
@api_view(['GET'])
def word_cloud(request):
# 读取数据库中所有的 use_scope 字段的数据
data = GoodsDetail.objects.values_list('use_scope')
# 读取数据
text = ""
for item in data:
if item[0] is not None:
# item[0]格式为 食品、纺织、冶金 或者 撕碎机,皮带机,矿山设备,电厂,水泥厂 需要去除逗号和数字,并且分词
if item[0].isdigit():
continue
text += ' '.join(jieba.cut(item[0].replace(',', '').replace(',', '').
replace('、', '').replace('等行业', '').replace('等领域', '').replace('等', '').
replace('等', '').replace(' ', '').replace('(', '').replace(')', '').
replace('(', '').replace(')', '')))
# 生成词云
wc = wordcloud.WordCloud(
font_path='C:\Windows\Fonts\simhei.ttf', width=1000, height=800, background_color='white',
collocations=False
)
wc.generate(text)
# 保存图片
wc.to_file('upload/word_cloud.png')
# 返回图片地址
return Response(data='http://127.0.0.1:8000/upload/word_cloud.png')
在上面的例子中,直接取出相关字段的所有数据,然后循环拼接到 text 变量上,使用 replace 函数剔除不需要的词语,然后保存成图片,最后返回图片地址,效果如下图所示:
end~