1. 量身打造屬於你的詞雲圖
今天的Python案例是跟着筆者來打造屬於自己的詞雲圖
。那麼什麼是詞雲圖
呢?我們在百度中來搜索一下,如圖所示:
概念:詞雲圖就是由詞彙
組成類似雲的彩色
圖形。接下來我們就可以去爲自己量身打造一張詞雲圖
了,但是筆者在這裏的話就不拿自己的照片來進行演示了。最近很火的一部電影冰雪奇緣2
,不知道大家有沒有看過。無論是美輪美奐的畫面質感,還是艾莎的造型如圖1所示
,都得到了衆多人的喜愛,全球各地再度掀起了一股艾莎熱潮
。
接下來我們用Python來分析下這部電影的劇情並以艾莎
爲背景繪製詞雲圖,效果如圖2所示。
第一步:首先的話我們要準備一張遮照圖
,用來繪製詞雲的形狀的,如果是想要拿自己的照片來做的話,一定要使用摳圖
技術將濃烈的背景換爲純色的背景。第二個的話就是我們需要準備相關的文本信息,文本信息越多,生成的圖片信息越豐富。如圖所示。
第二步:安裝第三方模塊,此次要使用到5個
第三方模塊,分別是matplotlib 數據可視化模塊
,numpy 數值計算模塊
,jieba 分詞模塊
,wordcloud 詞雲模塊
,Pillow(PIL) 圖像處理模塊
,如果不知道Pillow模塊
怎麼使用的話,可以去看筆者的另一篇博文 圖片轉字符畫,以上模塊安裝命令如下:
pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib
pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com numpy
pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jieba
pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com wordcloud
pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pillow
第三步:編寫代碼。主要是分爲6
個步驟,
- 使用
open()
方法讀取文本信息
- 讀取遮照圖片
- 生成詞雲圖
- 顯示詞雲圖
- 使用jieba進行中文分詞
- 設置詞雲圖渲染顏色
示例代碼如下:
import numpy as np
from PIL import Image # 導入PIL模塊中的Image對象
import wordcloud # 導入詞雲模塊
import matplotlib.pyplot as plt
import os
import jieba
from wordcloud import ImageColorGenerator
file_name = "elsa.txt"
pic_name = "elsa.png" # 你自己是什麼文件名你就寫什麼文件名
# 判斷文件是否存在
if os.path.exists(file_name):
with open(file_name, "r") as file: # 讀取文件
content = file.read()
if content: # 判斷文本內容是否爲空
# 進行分詞處理c 返回的是一個對象 需要使用"".join進行拼接
cut_text = jieba.cut(content)
word = " ".join(cut_text) # 拼接
img = np.array(Image.open(pic_name)) # 讀取圖片
img_colors = ImageColorGenerator(img)
# 生成詞雲圖
# mask: 置頂遮罩圖 img
# font_path: 設置字體
# background_color: 設置背景顏色
wd = wordcloud.WordCloud(mask=img, font_path="simhei.ttf", background_color="white")
wd.generate(word) # 生成詞雲圖
# 顯示詞雲圖
plt.imshow(wd.recolor(color_func=img_colors), interpolation="bilinear")
plt.axis("off") # 關閉顯示x軸/y軸下標
plt.savefig("elsa_cy.png") # 保存詞雲圖到本地
plt.show()
else:
print("大哥,你在逗我嗎,沒文件我咋讀勒!")
運行結果如圖所示:
接下來,是讀者們自由發揮的時間,你可以嘗試找一些自己感興趣的文本數據進行分析,開啓你的腦洞繪製自己想要的詞雲。
2. 11行代碼完成"風雲"
相信大家小的時候,都看過風雲
這部電視劇吧。最近筆者在抖音上經常看到呢,什麼無名滿血拉二胡,殘血到處浪
之類的經典評語。哈哈哈哈哈,言歸正傳,接下來的任務就是用11行
代碼完成電視劇風雲
詞雲圖!首先去百度百科找下風雲
電視劇的劇情簡介,然後粘貼到文本文件,去掉空行後保存爲fy.txt
。其次使用open
方法讀取文本文件,然後使用jieba模塊
分析文本,最後通過wordcloud模塊
製作詞雲圖,通過matplotlib模塊
顯示詞雲圖。如圖所示。
示例代碼如下:
import matplotlib.pyplot as plt
import wordcloud
import jieba
with open("fy.txt", "r") as file:
content = file.read() # 讀取文本文件內容
cut_text = jieba.cut(content) # 分詞 返回一個生成器對象
word = " ".join(cut_text) # 字符串拼接
wc = wordcloud.WordCloud(font_path="simhei.ttf", background_color="white")
wc.generate(word) # 生成詞雲圖
plt.imshow(wc) # 顯示詞雲圖
plt.axis("off") # 關閉x軸和y軸座標顯示
plt.show()
3. 自定義顏色的外星人
你是否也思考過,怎樣用自己喜歡的顏色來繪製詞雲圖?下面你的任務就是實現自定義詞雲圖顏色,使詞雲圖更加形象、靚麗。以外星人
爲例,相信很多讀者覺得這個LOGO眼熟,沒錯它就是我們和外星人一起學
全綵系列圖書的LOGO。
圖1是原版外星人,我們來看看圖2,詞雲圖使用的是默認顏色,與原版相比有些遜色;再來看看圖3,使用了紅黑色混搭,是不是看起來接近原版了呢?示例代碼如下:
import jieba
import wordcloud
import matplotlib.pyplot as plt
from matplotlib import colors
from scipy.misc import imread # 注意scipy是要使用pip安裝的
# 安裝命令如下:
# pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com scipy==1.2.0
with open("wxr.txt", "r") as file:
content = file.read() # 讀取文件內容
cut_text = jieba.cut(content) # 分詞處理
word = " ".join(cut_text) # 拼接
color_list = ["black", "red"] # 紅黑色值
# 多種顏色
# color_list = ["LightCoral", "RosyBrown", "IndianRed", "Red", "Brown", "FireBrick"
# , "DarkRed", "Maroon", "Gainsboro", "LightGray"
# , "Silver", "DarkGray", "Gray", "DimGray", "Black"]
color_map = colors.ListedColormap(color_list) # matplotlib色圖
img = imread("wxr.png") # 讀取圖片
wd = wordcloud.WordCloud(mask=img, font_path="simhei.ttf", background_color="white", colormap=color_map) # 生成詞雲圖
wd.generate(word)
plt.imshow(wd) # 顯示詞雲圖
plt.axis("off") # 關閉x軸和y軸的座標顯示
plt.savefig("圖3.png")
plt.show() # 顯示
4. 自行構造中文停用詞
在繪製詞雲圖過程中,詞雲中包括一些無用的字符和一些不想要的詞,該如何處理?例如,我們得到一些有關電影小丑
的評論內容,然後將其繪製成詞雲圖,但是在文本數據中存在一些特殊字符如《
、》
、?
、...
和一些我們不想要的、沒有意義的詞,如一個
、展開
、迴應
、可能
、沒有
、這部
等,如圖1所示。
實現思路:
- 手動添加停用詞 通過stopwords.update()方法手動添加停用詞。
- 根據已有停用詞庫遍歷文本濾除停用詞 網上找到一些現成的停用詞庫,下載或複製到文本文件中備用,然後判斷濾除停用詞重新生成新詞,賦值給詞雲圖。
示例代碼1如下:
import re
import matplotlib.pyplot as plt
from matplotlib import colors
import jieba
import wordcloud
from wordcloud import WordCloud
import imageio
# 讀取文件
str1 = open('joker.txt','r').read()
#文本數據處理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|\[|\]| ;|,|。|"')
str1 = re.sub(pattern, '', str1)
#自定義小丑顏色
color_list=['darkslategray','red','orange','darkred']
colormap=colors.ListedColormap(color_list)
#文本分詞處理製作詞雲
cut_text = jieba.cut(str1, cut_all=True) # cut_all=False 表示採用精確模式
word = ' '.join(cut_text)
#圖片背景
pic = imageio.imread('小丑.png')
#設置中文停用詞
stopwords = set('')
stopwords.update(['展開','迴應','一個','影評','可能','一部','沒有','我們','這個','這部','電影','就是'
,'大家','不是','只是','因爲','一些','本片'])
#生成詞雲圖
wd = wordcloud.WordCloud(
mask=pic,
font_path='simhei.ttf',
colormap=colormap,
stopwords = stopwords,
background_color='white'
)
#將長文本分詞並去除屏蔽詞
process_word = WordCloud.process_text(wd,word)
#對文本詞排序(根據字典中值的大小,對字典中的項排序)
sort = sorted(process_word.items(),key=lambda x:x[1],reverse=True)
print(sort[:50]) # 輸出文本詞頻最高的前50個詞
wd.generate(word)
plt.imshow(wd)
plt.axis('off')
plt.show()
運行結果如圖所示:
示例代碼2如下:
import re
import jieba
import wordcloud
import matplotlib.pyplot as plt
from matplotlib import colors
import imageio # 需要安裝
# 安裝命令如下:
# pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com imageio
with open("joker.txt", "r") as file:
content = file.read() # 讀取文件內容
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|\[|\]| ;|,|。|"') # 正則
str1 = re.sub(pattern, '', content) # 處理文本數據 將上面匹配到的都替換爲空字符串
color_list = ['darkslategray', 'red', 'orange', 'darkred'] # 自定義小丑顏色
color_map = colors.ListedColormap(color_list)
# cut_all=False: 表示採取精確模式
cut_text = jieba.cut(content, cut_all=True) # 文本分詞處理製作詞雲
word = " ".join(cut_text) # 拼接
img = imageio.imread("小丑.png")
# 讀取停止詞文件並保存到列表中
stopwords = [line.strip() for line in open("stopwords.txt").readlines()]
new_word = ''
# 濾除停用詞
for s in word:
if s not in stopwords:
new_word += s
wd = wordcloud.WordCloud(mask=img, font_path="simhei.ttf", background_color="white", colormap=color_map) # 生成詞雲圖
wd.generate(word)
plt.imshow(wd) # 顯示詞雲圖
plt.axis("off") # 關閉x軸和y軸的座標顯示
plt.show() # 顯示
運行結果如圖所示: