寫的樣式在簡書上顯示有問題辽聊,可去我的網(wǎng)站查看Python入門之生成海賊王云圖
本教程適合于有一定編程經(jīng)驗(yàn)的同學(xué)靡砌,使用Python3锋恬,在Jupyter進(jìn)行調(diào)試開發(fā)。
涉及的Python基礎(chǔ)包括:
* 變量和函數(shù)的定義和使用
* 列表和字典等數(shù)據(jù)結(jié)構(gòu)的使用
* 條件和循環(huán)語句杠娱,if挽牢、for等
* 模塊的導(dǎo)入和使用,import語法
需要安裝以下依賴庫:
* jupyter - 交互式筆記本
* matplotlib - Python2D繪圖庫
* jieba - Python中文分詞組件
* pillow - Python圖像處理庫
* wordcloud - Python詞云庫
目標(biāo)
從海賊王的歌詞中提取出關(guān)鍵詞摊求,然后生成喬巴形狀的云圖禽拔,最后效果如下:
1.準(zhǔn)備數(shù)據(jù)
a. 事先我已準(zhǔn)備好15首海賊王的歌詞文本文件, 放在本地的data目錄下。
```python
ls data # 使用Linux命令顯示data目錄下內(nèi)容
```
?[31mBON VOYAGE.txt?[m?[m*? ? ? ?[31mfree will.txt?[m?[m*? ? ? ?[31m向著陽光.txt?[m?[m*
?[31mJungle P.txt?[m?[m*? ? ? ? ?[31mmemories.txt?[m?[m*? ? ? ? ?[31m心的地圖.txt?[m?[m*
?[31mRun!Run!Run!.txt?[m?[m*? ? ?[31mshare the world.txt?[m?[m* ?[31m未來航海.txt?[m?[m*
?[31mShining Ray.txt?[m?[m*? ? ?[31m全新世界.txt?[m?[m*? ? ? ? ?[31m永久指針.txt?[m?[m*
?[31mbelieve.txt?[m?[m*? ? ? ? ?[31m冒險(xiǎn)世界.txt?[m?[m*? ? ? ? ?[31m瘋狂彩虹.txt?[m?[m*
b. 原始數(shù)據(jù)準(zhǔn)備OK后室叉,先實(shí)現(xiàn)一個(gè)函數(shù)循環(huán)讀取data目錄下的所有文件
```python
import os
def read_content(content_path):
'''
讀取目錄下的所有文件并合并成一個(gè)內(nèi)容塊返回
'''
# 初始化內(nèi)容為空
content = ''
# 使用os模塊的listdir函數(shù)枚舉文件夾下所有文件
for f in os.listdir(content_path):
# 拼接文件完整路徑
file_fullpath = os.path.join(content_path, f)
# 判斷是否是文件
if os.path.isfile(file_fullpath):
print('loading {}'.format(file_fullpath))
# 將文件內(nèi)容進(jìn)行拼接
content += open(file_fullpath, 'r').read()
# 每首歌詞之間用換行符分隔
content += '\n'
print('done loading')
return content
```
```python
# 讀取文件夾內(nèi)容
content = read_content('./data')
print('\n顯示內(nèi)容的前面部分...\n')
print(content[:99])
```
loading ./data/believe.txt
loading ./data/BON VOYAGE.txt
loading ./data/free will.txt
loading ./data/Jungle P.txt
loading ./data/memories.txt
loading ./data/Run!Run!Run!.txt
loading ./data/share the world.txt
loading ./data/Shining Ray.txt
loading ./data/全新世界.txt
loading ./data/冒險(xiǎn)世界.txt
loading ./data/向著陽光.txt
loading ./data/心的地圖.txt
loading ./data/未來航海.txt
loading ./data/永久指針.txt
loading ./data/瘋狂彩虹.txt
done loading
顯示內(nèi)容的前面部分...
世代傳承的意志 時(shí)代的浪潮 人的夢(mèng)想
這些都是無法阻擋的
只要人們繼續(xù)追求自由的解答
這一切都將永不停止
我只相信著未來 就算有人笑我也無所謂
奔馳的熱情讓你更耀眼
雖然好刺眼 但我仍要繼續(xù)凝視
c. 使用jieba提取出關(guān)鍵詞
```python
import jieba.analyse
# 這里使用jieba的textrank提取出1000個(gè)關(guān)鍵詞及其比重
result = jieba.analyse.textrank(content, topK=1000, withWeight=True)
# 生成關(guān)鍵詞比重字典
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
print(keywords)
```
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/5d/mjgsmy7n6vlfrk42v1_jtc7c0000gn/T/jieba.cache
Loading model cost 1.042 seconds.
Prefix dict has been built succesfully.
{'揚(yáng)起': 0.15365137065823337, '開始': 0.33887155728627016, '解答': 0.0790997113814255, '奇跡': 0.2019238936444467, '留下': 0.15805775202925612, '想像': 0.08987560148767863, '感覺': 0.058819354518174556, '時(shí)間': 0.07551208515941268, '天堂': 0.08441183647061005, '無法': 0.287129785071775, '伸出': 0.09256367548351727, '回到': 0.08349124701438736, '背負(fù)': 0.14437968256383968, '前路': 0.05312061493282433, '屏息': 0.1531365836936351, '秘密': 0.09965773105020974, '七色': 0.08878413441578677, '朋友': 0.1397662417669881, '初識(shí)': 0.0830682006897093, '光芒': 0.13352559090174942, '指示': 0.06934108111132412, '擁有': 0.11544194392460741, '色彩': 0.12409038761092896, '世間': 0.18888249529919593, '歡笑': 0.050377170853215976, '選擇': 0.06444326221759296, '沾濕': 0.13352559090174942, '起來': 0.0845180267560427, '經(jīng)歷': 0.12616245714507396, '小時(shí)候': 0.044857635061158724, '失去': 0.05236725016973628, '歌唱': 0.09501118261648268, '分享': 0.05812477489419511, '收起': 0.0915149943221848, '誓言': 0.05988821730341018, '我會(huì)': ...}
**2.使用wordcloud生成云圖**
這里還需要一張底圖用于生成云圖睹栖,這里使用海賊王中喬巴的圖片
```python
from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
# 初始化圖片
image = Image.open('./images/tony_src.png')
graph = np.array(image)
# 生成云圖,這里需要注意的是WordCloud默認(rèn)不支持中文茧痕,所以這里需要加載中文黑體字庫
wc = WordCloud(font_path='./fonts/simhei.ttf',
background_color='white', max_words=1000, mask=graph)
wc.generate_from_frequencies(keywords)
image_color = ImageColorGenerator(graph)
```
```python
# 顯示圖片
plt.imshow(wc)
plt.imshow(wc.recolor(color_func=image_color))
plt.axis("off") # 關(guān)閉圖像坐標(biāo)系
plt.show()
```