深度有趣 | 03 高端又一般的詞雲

簡介

詞雲是一種數據呈現方式

  • 不會的時候,感覺很厲害、很高大上
  • 會用了之後,感覺到哪都看到別人在用

掌握用Python實現詞雲的方法

準備

安裝包

pip install wordcloud matplotlib jieba PIL

準備一些文本,英文或中文皆可

一個簡單的例子

WordCloud()可選的參數

  • font_path:可用於指定字體路徑,包括otfttf
  • width:詞雲的寬度,默認爲400
  • height:詞雲的高度,默認爲200
  • mask:蒙版,可用於定製詞雲的形狀
  • min_font_size:最小字號,默認爲4
  • max_font_size:最大字號,默認爲詞雲的高度
  • max_words:詞的最大數量,默認爲200
  • stopwords:將被忽略的停用詞,如果不指定則使用默認的停用詞詞庫
  • background_color:背景顏色,默認爲black
  • mode:默認爲RGB模式,如果爲RGBA模式且background_color設爲None,則背景將透明
# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 打開文本
text = open('constitution.txt').read()
# 生成對象
wc = WordCloud().generate(text)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

一個簡單的例子

由於英文單詞之間有空格分隔,因此大多不需要額外的處理

中文詞雲

中文一般需要經過分詞處理,先看下不分詞的效果

以《西遊記》爲例,可以看到結果中會出現各種雙字、三字和四字等,但很多並不是合理的詞語

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 打開文本
text = open('xyj.txt').read()
# 生成對象
wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

中文未分詞

這次我們先用jieba進行中文分詞,可以看到生成的詞雲裏,基本上都是合理的詞語了

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba

# 打開文本
text = open('xyj.txt').read()

# 中文分詞
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成對象
wc = WordCloud(font_path='Hiragino.ttf', width=800, height=600, mode='RGBA', background_color=None).generate(text)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

中文已分詞

使用蒙版

這裏將mask翻譯爲蒙版,是因爲感覺它和Photoshop中蒙版的作用很類似

使用蒙版之後,可以根據提供的蒙版圖片,生成指定形狀的詞雲

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba

# 打開文本
text = open('xyj.txt').read()

# 中文分詞
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成對象
mask = np.array(Image.open("black_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

使用蒙版形狀

顏色

詞雲的顏色可以從蒙版中抽取,使用ImageColorGenerator()即可

# -*- coding: utf-8 -*-

from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba

# 打開文本
text = open('xyj.txt').read()

# 中文分詞
text = ' '.join(jieba.cut(text))
print(text[:100])

# 生成對象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 從圖片中生成顏色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

使用蒙版顏色

當然也可以設置爲純色,增加一個配色函數即可

# -*- coding: utf-8 -*-

from wordcloud import WordCloud
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import random
import jieba

# 打開文本
text = open('xyj.txt').read()

# 中文分詞
text = ' '.join(jieba.cut(text))
print(text[:100])

# 顏色函數
def random_color(word, font_size, position, orientation, font_path, random_state):
	s = 'hsl(0, %d%%, %d%%)' % (random.randint(60, 80), random.randint(60, 80))
	print(s)
	return s

# 生成對象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(color_func=random_color, mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate(text)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

自定義顏色函數

關於HSL配色方案可以參考

https://www.w3.org/wiki/CSS3/Color/HSL

精細控制

如果希望精細地控制詞雲中出現的詞,以及每個詞的大小,可以嘗試generate_from_frequencies(),包括兩個參數

  • frequencies:一個字典,用於指定詞和對應的大小
  • max_font_size:最大字號,默認爲None

generate() = process_text() + generate_from_frequencies()

以下用jieba提取出關鍵詞和權重,再以此繪製詞雲

# -*- coding: utf-8 -*-

from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba.analyse

# 打開文本
text = open('xyj.txt').read()

# 提取關鍵詞和權重
freq = jieba.analyse.extract_tags(text, topK=200, withWeight=True)
print(freq[:20])
freq = {i[0]: i[1] for i in freq}

# 生成對象
mask = np.array(Image.open("color_mask.png"))
wc = WordCloud(mask=mask, font_path='Hiragino.ttf', mode='RGBA', background_color=None).generate_from_frequencies(freq)

# 從圖片中生成顏色
image_colors = ImageColorGenerator(mask)
wc.recolor(color_func=image_colors)

# 顯示詞雲
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()

# 保存到文件
wc.to_file('wordcloud.png')

參考

視頻講解課程

深度有趣(一)

發佈了29 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章