Python每日一練(10)-詞雲圖

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個步驟,

  1. 使用open()方法讀取文本信息
  2. 讀取遮照圖片
  3. 生成詞雲圖
  4. 顯示詞雲圖
  5. 使用jieba進行中文分詞
  6. 設置詞雲圖渲染顏色

示例代碼如下:

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所示。
在這裏插入圖片描述
實現思路:

  1. 手動添加停用詞 通過stopwords.update()方法手動添加停用詞。
  2. 根據已有停用詞庫遍歷文本濾除停用詞 網上找到一些現成的停用詞庫,下載或複製到文本文件中備用,然後判斷濾除停用詞重新生成新詞,賦值給詞雲圖。

示例代碼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()  # 顯示

運行結果如圖所示:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章