深度有趣 | 03 高端又通常的詞雲

簡介

詞雲是一種數據呈現方式html

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

掌握用Python實現詞雲的方法git

準備

安裝包github

pip install wordcloud matplotlib jieba PIL

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

一個簡單的例子

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')

一個簡單的例子

因爲英文單詞之間有空格分隔,所以大多不須要額外的處理字體

中文詞雲

中文通常須要通過分詞處理,先看下不分詞的效果翻譯

以《西遊記》爲例,能夠看到結果中會出現各類雙字、三字和四字等,但不少並非合理的詞語3d

# -*- 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進行中文分詞,能夠看到生成的詞雲裏,基本上都是合理的詞語了code

# -*- 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')

參考

視頻講解課程

深度有趣(一)

相關文章
相關標籤/搜索