公號:碼農充電站pro
主頁:https://codeshellme.github.io
今天來介紹一下如何使用 Python 制作詞雲。
詞雲又叫文字雲,它可以統計文本中頻率較高的詞,並將這些詞可視化,讓我們可以直觀的了解文本中的重點詞匯。
詞的頻率越高,詞顯示的大小也就越大。
1,wordcloud 模塊
wordcloud 是一個詞雲生成器,它不僅是一個 Python 庫,還是一個命令行工具。我們可以通過 wordcloud 官方文檔,和示例庫來學習如何使用它。
在使用 wordcloud 之前,需要先安裝它:
pip install wordcloud
2,WordCloud 類
WordCloud 類用於創建詞雲對象
,先來看下它的原型:
WordCloud(font_path=None,
width=400, height=200,
margin=2, ranks_only=None,
prefer_horizontal=0.9,
mask=None, scale=1,
color_func=None, max_words=200,
min_font_size=4, stopwords=None,
random_state=None,
background_color='black',
max_font_size=None,
font_step=1, mode='RGB',
relative_scaling='auto',
regexp=None, collocations=True,
colormap=None, normalize_plurals=True,
contour_width=0, contour_color='black',
repeat=False, include_numbers=False,
min_word_length=0,
collocation_threshold=30)
可以看到,WordCloud 類有很多參數可以設置,這里介紹一些常用的參數:
- font_path:設置字體文件路徑,字體文件以
.ttf
為后綴。- 如果分析的文本是中文,則需要設置中文字體,否則會亂碼。
- background_color:設置圖片背景顏色,默認為 black,也可以設置為 white 等。
- mask:設置背景圖片。
- max_words:設置最大的詞數,默認為200。
- stopwords:設置停用詞。
- max_font_size:設置字體最大值。
- width:設置畫布的寬度,默認為400。
- height:設置畫布的高度,默認為200。
- random_state:設置多少種隨機狀態,即多少種顏色。
在創建好詞雲對象
后,可以使用 generate
方法生成詞雲,並使用 to_file
方法將詞雲圖像保存在文件中。
generate
方法的原型如下:
generate(text)
參數text
是一個用空格
隔開的文本字符串。如果分析的是中文,需要先用 jieba 進行分詞,可以參考這里。
除了將詞雲圖像保存在文件中,還可以使用 Matplotlib 模塊顯示詞雲圖像,示例代碼如下:
import matplotlib.pyplot as plt
plt.imshow(wordcloud) # wordcloud 是詞雲對象
plt.axis("off") # 用於關閉坐標軸
plt.show()
3,一個簡單的示例
下面演示一個最簡單的示例,來看如何使用 wordcloud。
首先創建詞雲對象
:
from wordcloud import WordCloud
wc = WordCloud()
生成詞雲:
text = "Python is a programming language, it is easy to use."
wc.generate(text)
詞雲對象的 words_
屬性中存儲了每個單詞的(歸一化后的)權重,權重的范圍是 (0, 1]
。
words_
屬性是一個字典類型,它存儲的鍵的最大個數為 max_words
,即 WordCloud
類的參數。
如下:
>>> wc.words_
{'Python': 1.0, 'programming': 1.0, 'language': 1.0, 'easy': 1.0, 'use': 1.0}
# 示例中的這些單詞出現的頻率都相等(均為 1),
# 所以它們的權重都是 1。
用 Matplotlib 展示詞雲圖像:
import matplotlib.pyplot as plt
plt.imshow(wc)
plt.axis("off")
plt.show()
詞雲圖像如下:
4,對古詩做詞雲分析
我在這里准備了一個案例,是對1000 首古詩做詞雲分析。
代碼目錄如下:
wordcloud/
├── SimHei.ttf
├── gushi.txt
└── gushi_wordcloud.py
其中:
我將代碼也放在這里,方便查看:
#!/usr/bin/env python
# coding=utf-8
import os
import sys
import jieba
from wordcloud import WordCloud
if sys.version.startswith('2.'):
reload(sys)
sys.setdefaultencoding('utf-8')
# 去掉一些作者的名字
STOPWORDS = [
u'李白', u'杜甫', u'辛棄疾', u'李清照', u'蘇軾',
u'李商隱', u'王維', u'白居易', u'李煜', u'杜牧',
]
def load_file(file_path):
if sys.version.startswith('2.'):
with open(file_path) as f:
lines = f.readlines()
else:
with open(file_path, encoding='utf-8') as f:
lines = f.readlines()
content = ''
for line in lines:
line = line.encode('unicode-escape').decode('unicode-escape')
line = line.strip().rstrip('\n')
content += line
words = jieba.cut(content)
l = []
for w in words:
# 如果詞的長度小於 2,則舍去
if len(w) < 2: continue
l.append(w)
return ' '.join(l)
if __name__ == '__main__':
file_path = './gushi.txt'
content = load_file(file_path)
wc = WordCloud(
font_path="./SimHei.ttf",
stopwords=STOPWORDS,
width=2000, height=1200)
wc.generate(content)
wc.to_file("wordcloud.jpg")
其中:
STOPWORDS
停用詞列表,是一些作者的名字。load_file
方法用於加載文本,其中用到了 jieba 分詞。
最后將詞雲圖像保存在了 wordcloud.jpg
文件中,如下:
我們也可以從詞雲對象的words_
屬性中查看每個詞的權重,這里我列出前十個:
('明月', 1.0)
('今日', 0.9130434782608695)
('不知', 0.8405797101449275)
('何處', 0.8260869565217391)
('不見', 0.8115942028985508)
('春風', 0.7536231884057971)
('無人', 0.7536231884057971)
('不可', 0.7536231884057971)
('萬里', 0.7536231884057971)
('現代', 0.6666666666666666)
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術干貨。