文字挖掘學習筆記(一):文字分詞和詞雲展示
注:學習筆記基於文彤老師文字挖掘的系列課程
課程連結:https://study.163.com/course/courseMain.htm?courseId=1005124008&share=1&shareId=1146477588
全文基於《射鵰英雄傳》語料庫,下面是讀入資料的一個基於Pandas的通用操作框架。
讀入為資料框
import pandas as pd
# 有的環境配置下read_table出錯,也可用用read_csv
raw = pd.read_table("金庸-射鵰英雄傳txt精校版.txt",
names = ['txt'], encoding ="GBK")
print(len(raw))
raw.head()
7432
| txt | |
|---|---|
| 0 | 全本全集精校小說盡在:http://www.yimuhe.com/u/anglewing26... |
| 1 | 更多資源下載:http://qqzone.ctdisk.com |
| 2 | ※宣告:本電子書僅供讀者預覽,請在下載24小時內刪除,不得用作商業用途;如果喜歡請購買正版圖書!※ |
| 3 | ------------------------------------------ |
| 4 | “金庸作品集”新序 |
加入章節標識
# 章節判斷用變數預處理
def m_head(tmpstr):
return tmpstr[:1]
def m_mid(tmpstr):
return tmpstr.find("回 ")
#取出進行判斷的變數
raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)#防止特殊情況,設定長度
raw.head()
| txt | head | mid | len | |
|---|---|---|---|---|
| 0 | 全本全集精校小說盡在:http://www.yimuhe.com/u/anglewing26... | 全 | -1 | 55 |
| 1 | 更多資源下載:http://qqzone.ctdisk.com | 更 | -1 | 31 |
| 2 | ※宣告:本電子書僅供讀者預覽,請在下載24小時內刪除,不得用作商業用途;如果喜歡請購買正版圖書!※ | ※ | -1 | 49 |
| 3 | ------------------------------------------ | - | -1 | 42 |
| 4 | “金庸作品集”新序 | “ | -1 | 9 |
# 章節判斷
chapnum = 0
for i in range(len(raw)):
if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30 :
chapnum += 1
if chapnum >= 40 and raw['txt'][i] == "附錄一:成吉思汗家族" :
chapnum = 0
raw.loc[i, 'chap'] = chapnum
# 刪除臨時變數,這裡必須刪除,否則後續sum函式處會出錯
del raw['head']
del raw['mid']
del raw['len']
raw.head()
| txt | chap | |
|---|---|---|
| 0 | 全本全集精校小說盡在:http://www.yimuhe.com/u/anglewing26... | 0.0 |
| 1 | 更多資源下載:http://qqzone.ctdisk.com | 0.0 |
| 2 | ※宣告:本電子書僅供讀者預覽,請在下載24小時內刪除,不得用作商業用途;如果喜歡請購買正版圖書!※ | 0.0 |
| 3 | ------------------------------------------ | 0.0 |
| 4 | “金庸作品集”新序 | 0.0 |
提取出所需章節
raw[raw.chap == 1].head()
| txt | chap | |
|---|---|---|
| 33 | 第一回 風雪驚變 | 1.0 |
| 34 | 1.0 | |
| 35 | 1.0 | |
| 36 | 那說話人五十來歲年紀,一件青布長袍早洗得褪成了藍灰帶白。只聽他兩片梨花木板碰了幾下,左手... | 1.0 |
| 37 | 幾處敗垣圍故井,向來一一是人家。” | 1.0 |
from matplotlib import pyplot as plt
%matplotlib inline
raw.txt.agg(len).plot.box()

rawgrp = raw.groupby('chap')
chapter = rawgrp.agg(sum) # 只有字串列的情況下,sum函式自動轉為合併字串
chapter = chapter[chapter.index != 0]#排除前言和附錄
1.分詞
1.1結巴分詞的基本用法
jieba是目前應用最廣,評價也較高的分詞工具包
安裝方法
pip install jieba
基本特點:支援繁體分詞 支援自定義詞典
三種分詞模式
1.精確模式,試圖將句子最精確地切開,適合做文字分析
2.全模式,把句子中所有的可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義
3.搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞
將序列中的元素以指定的字元連線生成一個新的字串。
語法: ‘delimiter’.join(seq)
delimiter:分隔符。可以為空
import jieba
tmpstr = "哀牢山三十六劍,劍法凌厲號稱天下第一。"
res = jieba.cut(tmpstr) # 精確模式
print(res)
# 是一個可迭代的 generator,可以使用 for 迴圈來遍歷結果,本質上類似lis
<generator object Tokenizer.cut at 0x000002447E180BF8>
' '.join(res)#執行一次後就分開了,若想重複執行,需要再執行上面的程式碼
'哀牢山 三十六 劍 , 劍法 凌厲 號稱 天下第一 。'
res = jieba.cut(tmpstr)
list(word for word in res) # 演示generator的用法
# 將res的word取出並將這些word變為list格式
['哀牢山', '三十六', '劍', ',', '劍法', '凌厲', '號稱', '天下第一', '。']
print(jieba.lcut(tmpstr)) # 結果直接輸出為list
['哀牢山', '三十六', '劍', ',', '劍法', '凌厲', '號稱', '天下第一', '。']
print('/'.join(jieba.cut(tmpstr, cut_all = True))) # 全模式
哀牢山/三十/三十六/十六/劍/,/劍法/凌厲/號稱/天下/天下第一/第一/。
# 搜尋引擎模式
print('/'.join(jieba.cut_for_search(tmpstr)))
print(jieba.lcut_for_search(tmpstr))
哀牢山/三十/十六/三十六/劍/,/劍法/凌厲/號稱/天下/第一/天下第一/。
['哀牢山', '三十', '十六', '三十六', '劍', ',', '劍法', '凌厲', '號稱', '天下', '第一', '天下第一', '。']
1.2 修改詞典
在程式中可以動態根據分詞的結果,對記憶體中的詞庫進行更新
add_word(word)
word:新詞
freq=None:詞頻
tag=None:具體詞性
del_word(word)
# 動態修改詞典
jieba.add_word("哀牢山三十六劍")
'/'.join(jieba.cut(tmpstr))
'哀牢山三十六劍/,/劍法/凌厲/號稱/天下第一/。'
jieba.del_word("哀牢山三十六劍")
'/'.join(jieba.cut(tmpstr))
'哀牢山/三十六/劍/,/劍法/凌厲/號稱/天下第一/。'
使用自定義詞典
load_userdict(file_name)
file_name:檔案類物件或自定義詞典的路徑
詞典基本格式
一個詞佔一行:詞、詞頻(可省略)、詞性(可省略),用空格隔開
詞典檔案必須為 UTF-8 編碼,必要時可以使用Uedit32進行檔案編碼轉換
dict = '金庸小說詞庫.txt'
jieba.load_userdict(dict) # dict為自定義詞典的路徑
'/'.join(jieba.cut(tmpstr))
'哀牢山三十六劍/,/劍法/凌厲/號稱/天下第一/。'
使用搜狗細胞詞庫
https://pinyin.sogou.com/dict/
按照詞庫分類或者關鍵詞搜尋方式,查詢並下載所需詞庫
使用轉換工具,將其轉換為txt格式
在程式中匯入相應詞庫
去除停用詞
常見的停用詞種類
1.超高頻的常用詞:基本不攜帶有效資訊/歧義太多無分析價值(的、地、得、介詞、連詞)
2.專業領域的高頻詞:基本不攜帶有效資訊
3.視情況而定的停用詞
分詞後去除停用詞
基本步驟
讀入停用詞表檔案
正常分詞
在分詞結果中去除停用詞
新列表 = [ word for word in 源列表 if word not in 停用詞列表 ]
該方法存在的問題:停用詞必須要被分詞過程正確拆分出來才行
tmpstr = "哀牢山三十六劍和劍法凌厲號稱天下第一。"
newlist = [ word for word in jieba.cut(tmpstr) if word not in [ '和','。'] ]
print(newlist)
['哀牢山三十六劍', '劍法', '凌厲', '號稱', '天下第一']
import pandas as pd
tmpdf = pd.read_table('停用詞.txt',names = ['w'], encoding = 'utf-8')
tmpdf.head()
| w | |
|---|---|
| 0 | , |
| 1 | , |
| 2 | 、 |
| 3 | ; |
| 4 | : |
# 熟悉Python的可以直接使用 open('stopWord.txt').readlines()獲取停用詞list,效率更高
[ w for w in jieba.cut(tmpstr) if w not in list(tmpdf.w) ]
['哀牢山三十六劍', '劍法', '凌厲', '號稱', '天下第一']
用extract_tags函式去除停用詞
方法特點:
根據TF-IDF演算法將特徵詞提取出來,在提取之前去掉停用詞
可以人工指定停用詞字典
jieba.analyse.set_stop_words()
# 使用預先準備的停用詞表
import jieba.analyse as ana
ana.set_stop_words('停用詞.txt')
#jieba.lcut(tmpstr) # 讀入的停用詞列表對分詞結果無效
ana.extract_tags(tmpstr, topK = 20)
# 使用TF-IDF演算法提取關鍵詞,並同時去掉停用詞,出來結果就是列表的形式
['哀牢山三十六劍', '劍法', '天下第一', '凌厲', '號稱']
1.3詞性標註
import jieba.posseg
posseg.cut():給出附加詞性的分詞結果
詞性標註採用和 ICTCLAS 相容的標記法,後續可基於詞性做進一步處理,如只提取出名詞,動詞等
import jieba.posseg as psg
tmpres = psg.cut(tmpstr) # 附加詞性的分詞結果
print(tmpres)
for item in tmpres:
print(item.word, item.flag)#注意縮排
#flag表示詞性,x代表未知詞性(增添的詞庫中未標明)
<generator object cut at 0x000002440298C7D8>
哀牢山三十六劍 x
和 c
劍法 n
凌厲 nr
號稱 v
天下第一 l
。 x
psg.lcut(tmpstr) # 直接輸出為list,成員為pair
[pair('哀牢山三十六劍', 'x'),
pair('和', 'c'),
pair('劍法', 'n'),
pair('凌厲', 'nr'),
pair('號稱', 'v'),
pair('天下第一', 'l'),
pair('。', 'x')]
psg.lcut(tmpstr)[0].word
'哀牢山三十六劍'
分詞的NLTK實現
NLTK只能識別用空格作為詞條分割方式,因此不能直接用於中文文字的分詞。
一般的做法是先用jieba分詞,然後轉換為空格分隔的連續文字,再轉入NLTK框架使用。
rawtext = '周伯通笑道:“你懂了嗎?…”
txt = ’ '.join(jieba.cut(rawtext)) # “周伯通 笑 道 :…”
toke = nltk.word_tokenize(txt) # [‘周伯通’, ‘笑’, ‘道’, ‘:’…
實戰:《射鵰》一書分詞
選取第一回的文字,應用搜狗的細胞詞庫和停用詞表,清理出乾淨的分詞結果。
raw1=chapter.txt[1]
dict = '金庸小說詞庫.txt'
jieba.load_userdict(dict) # dict為自定義詞典的路徑
res1 = jieba.lcut(raw1) # 精確模式
len(res1)
17890
print(' '.join(res1)[:10])#注意這行程式碼不要重複執行
第一回 風雪 驚
import pandas as pd
tmpdf = pd.read_table('停用詞.txt',names = ['w'], encoding = 'utf-8')
res1_1=[ w for w in res1 if w not in list(tmpdf.w) ]
res1_1[:4]
['第一回',
' ',
'風雪',
'驚變',
]
len(res1_1)
9373
2.詞雲展示
2.1詞頻統計
絕大部分詞頻統計工具都是基於分詞後構建詞條的list進行,因此首先需要完成相應的分詞工作。
#分詞
word_list = jieba.lcut(chapter.txt[1])
word_list[:4]
['第一回',
' ',
'風雪',
'驚變',
]
構建完list之後,也可以自行編寫詞頻統計程式,框架如下:
遍歷整個list,對每個詞條:
if word in d: d[word] += 1
else: d[word] = 1#該word第一次出現
使用Pandas統計
word_list = jieba.lcut(" ".join(raw.txt))
word_list[:10]
['全本', '全集', '精校', '小說', '盡', '在', ':', 'http', ':', '/']
import pandas as pd
df = pd.DataFrame(word_list, columns = ['word'])
df.head()
| word | |
|---|---|
| 0 | 全本 |
| 1 | 全集 |
| 2 | 精校 |
| 3 | 小說 |
| 4 | 盡 |
result = df.groupby(['word']).size()
print(type(result))
freqlist = result.sort_values(ascending=False)#降序排序
freqlist[:10]
<class 'pandas.core.series.Series'>
word
, 70014
。 23233
14760
“ 12309
” 12234
: 11385
了 11213
的 10717
7669
他 7496
dtype: int64
freqlist[freqlist.index == '道']
word
道 7001
dtype: int64
jieba.add_word('道', freq = 50000)#不影響原來的詞頻
#只是在多種分詞可能時候取頻率高的
freqlist[freqlist.index == '道']
word
道 7001
dtype: int64
使用NLTK統計
NLTK生成的結果為頻數字典,在和某些程式包對接時比較有用
import nltk
# 分詞等預處理工作
# 這里可以根據需要做任何的preprocessing: stopwords, lemma, stemming, etc.
word_list[:10]
['全本', '全集', '精校', '小說', '盡', '在', ':', 'http', ':', '/']
fdist = nltk.FreqDist(word_list) # 生成完整的詞條頻數字典
# 帶上某個單詞, 可以看到它在整個文章中出現的次數
fdist['顏烈']
63
fdist.tabulate(10)#輸出前10個高頻詞
, 。 “ ” : 了 的 他
70014 23233 14760 12309 12234 11385 11213 10717 7669 7496
fdist.most_common(5)#作用跟上面一樣,只不過輸出格式不一樣(list)
[(',', 70014), ('。', 23233), ('\u3000', 14760), ('“', 12309), ('”', 12234)]
2.2詞雲概述
wordcloud包的安裝
安裝
警告:wordcloud的安裝有可能非常順利,也有可能非常痛苦,完全是拼人品的一件事情。。。
方法1:pip install wordcloud
安裝後很可能不能用,直接成功的話,您的人品實在是爆棚
方法2:python setup.py install
在github.com/amueller/word_cloud下載安裝包
方法3:下載第三方編譯好的whl檔案進行安裝
https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
Visual C++ build tools支援
提示:Microsoft Visual C++ 14.0 is required.
需要:Visual C++ 2015 Build Tools
檔案:visualcppbuildtools_full.exe
ImportError: DLL load failed: 找不到指定的模組。
pip uninstall pillow,然後重新安裝pillow包
或者uninstall pillow之後使用上面的方法2安裝,會自動安裝相關的支援包
中文字型支援
.WordCloud(font_path='simhei.ttf')
需要帶路徑寫完整字型檔名
注意Win10的字型檔案字尾可能不一樣
2.3繪製詞雲
WordCloud的基本語法
class wordcloud.WordCloud(
在設定大小的時候,由於本軟體的問題,大小看不出來,但是實際儲存下來大小是沒錯的
常用功能:
font_path : 在圖形中使用的字型,預設使用系統字型
width / height = 200 : 圖形的寬度/高度
max_words = 200 : 需要繪製的最多詞條數
stopwords = None : 停用詞列表,不指定時會使用系統預設停用詞列表
字型設定:
min_font_size = 4 / max_font_size = None : 字元大小範圍
font_step = 1 : 字號增加的步長
relative_scaling = .5: 詞條頻數比例和字號大小比例的換算關係,預設為50%
prefer_horizontal = 0.90 : 圖中詞條水平顯示的比例
顏色設定:
background_color = ”black” : 圖形背景色
mode = ”RGB”: 圖形顏色編碼,如果指定為"RGBA"且背景色為None時,背景色為透明
color_func = None : 生成新顏色的函式,使用matplotlib的colormap
背景掩模:
mask = None : 詞雲使用的背景圖(遮罩)
)
用原始文字直接分詞並繪製
cloudobj = WordCloud().generate(text)
generate實際上是generate_from_text的別名,generate裡面的必須是處理過後的分詞
文字需要用空格/標點符號分隔單詞
import wordcloud
myfont = r'C:\Windows\Fonts\simkai.ttf'
text = 'this is shanghai, 郭靖, 和, 哀牢山 三十六劍'
cloudobj = wordcloud.WordCloud(font_path = myfont).generate(text)
print(cloudobj)
<wordcloud.wordcloud.WordCloud object at 0x000002441E289160>
顯示詞雲
import matplotlib.pyplot as plt
plt.imshow(cloudobj)
plt.close()#關閉詞雲
import matplotlib.pyplot as plt
plt.imshow(cloudobj)
plt.axis("off")#把座標軸去掉,影響美觀
plt.show()

# 更改詞雲引數設定
cloudobj = wordcloud.WordCloud(font_path = myfont,
width = 360, height = 180,
mode = "RGBA", background_color = None).generate(text)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

儲存詞雲
wordcloud.to_file(儲存檔案的路徑與名稱) 該命令儲存的是高精度圖形
cloudobj.to_file("詞雲.png")#儘量不要有重名,其會把重名的檔案覆蓋掉
wordcloud.WordCloud(font_path = myfont).generate(text).to_file("詞雲2.png")
<wordcloud.wordcloud.WordCloud at 0x2441e2ce208>
生成射鵰第一章的詞雲
import pandas as pd
import jieba
stoplist = list(pd.read_table('停用詞.txt', names = ['w'],
encoding = 'utf-8', engine='python').w)
def m_cut(intxt):
return [ w for w in jieba.cut(intxt) if w not in stoplist ]
cloudobj = wordcloud.WordCloud(font_path = myfont,
width = 1200, height = 800,
mode = "RGBA", background_color = None,
stopwords = stoplist).generate(' '.join(jieba.lcut(chapter.txt[1])))
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

cloudobj = wordcloud.WordCloud(font_path = myfont,
width = 1200, height = 800,
mode = "RGBA", background_color = None
).generate(' '.join(m_cut(chapter.txt[1])))
plt.imshow(cloudobj)
plt.axis("off")
plt.show()#跟上面作用一樣,這裡是呼叫函式實現

cloudobj.to_file("詞雲3.png")#不要使用jpg格式,會報錯
<wordcloud.wordcloud.WordCloud at 0x2441e2c3438>
基於分詞頻數繪製
generate()的實際操作
呼叫分詞函式process_text()
呼叫基於頻數的繪製函式fit_words()
fit_words(dict)
實際上是generate_from_frequencies的別名
Dict: 由詞條和頻數構成的字典(使用nltk較方便)
#基於分詞頻數繪製詞雲,給出詞頻就可以直接繪製了
txt_freq = {'張三':100,'李四':90,'王二麻子':50}
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(txt_freq)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

使用nltk 用頻數生成射鵰第一章的詞雲
import nltk
from nltk import FreqDist
tokens = m_cut(chapter.txt[1])
fdist = FreqDist(tokens) # 生成完整的詞條頻數字典
type(fdist)
nltk.probability.FreqDist
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(fdist)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

2.4 詞雲的美化
各種詳細的操作和設定可以參考官網的案例:
https://amueller.github.io/word_cloud/
2.4.1設定背景圖片
Mask 用於控制詞雲的整體形狀
指定mask後,設定的寬高值將被忽略,遮罩形狀被指定圖形的形狀取代。除全白(#FFFFFF)的部分仍然保留外,其餘部分會用於繪製詞雲。因此背景圖片的畫布一定要設定為白色(#FFFFFF)
字的大小,佈局和顏色也會基於Mask生成
必要時需要調整顏色以增強可視效果
基本呼叫方式
from scipy.misc import imread
mask = imread(背景圖片名稱)
from scipy.misc import imread
def m_cut(intxt):
return [ w for w in jieba.lcut(intxt) if w not in stoplist and len(w) > 1 ]
#cut 與 lcut 影響不大,只是格式不一樣
cloudobj = wordcloud.WordCloud(font_path = myfont,
mask = imread("射鵰背景1.png"),
mode = "RGBA", background_color = None
).generate(' '.join(m_cut(chapter.txt[1])))
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

2.4.2指定圖片色系
讀取指定圖片的色系設定。注意是色系,不是某個特定的顏色,會有深淺的差別
imgarray = np.array(imread(imgfilepath))
獲取圖片顏色
bimgColors = wordcloud.ImageColorGenerator(imgarray)
重置詞雲顏色
cloudobj.recolor(color_func=bimgColors)
利用已有詞雲物件直接重繪顏色,輸出速度要比全部重繪快的多
import numpy as np
imgobj = imread("射鵰背景2.png")
image_colors = wordcloud.ImageColorGenerator(np.array(imgobj))
cloudobj.recolor(color_func=image_colors)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

2.4.3指定單片語顏色
理想的狀況應該是分組比較詞頻,在兩組中都高頻的詞條在圖形中相互抵消。
Python目前只能實現詞條分組上色。
color_to_words = {
‘#00ff00’: [‘顏烈’, ‘武官’, ‘金兵’, ‘小人’],
‘red’: [‘包惜弱’, ‘郭嘯天’, ‘楊鐵心’, ‘丘處機’]
} '#00ff00’為綠色的程式碼
default_color = ‘grey’ # 其餘單詞的預設顏色
cloudobj.recolor()
#官網提供的顏色分組類程式碼,略有修改,使用時直接套用即可
from wordcloud import get_single_color_func
class GroupedColorFunc(object):
def __init__(self, color_to_words, default_color):
self.color_func_to_words = [
(get_single_color_func(color), set(words))
for (color, words) in color_to_words.items()]
self.default_color_func = get_single_color_func(default_color)
def get_color_func(self, word):
"""Returns a single_color_func associated with the word"""
try:
color_func = next(
color_func for (color_func, words) in self.color_func_to_words
if word in words)
except StopIteration:
color_func = self.default_color_func
return color_func
def __call__(self, word, **kwargs):
return self.get_color_func(word)(word, **kwargs)
######
# 指定分組色系
color_to_words = {
'#00ff00': ['顏烈', '武官', '金兵', '官兵'],
'red': ['包惜弱', '郭嘯天', '楊鐵心', '丘處機']
}
default_color = 'grey' # 指定其他詞條的顏色
grouped_color_func = GroupedColorFunc(color_to_words, default_color)
#傳進來兩個引數
cloudobj.recolor(color_func=grouped_color_func)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

實戰:優化射鵰詞雲
嘗試進一步清理分詞結果,並且只保留所有的名稱(人名、地名)。
提示:
將所有的人名按照藍色系,地名按照紅色系進行詞雲繪製。
自行製作兩個純色圖片,分別為綠色和藍色,然後將其分別指定為繪圖所用的色系,觀察圖形效果。
嘗試使用不同的背景圖片作為掩模,思考怎樣的圖片才能使得繪圖效果最佳。
#準備工作,具體可參照學習筆記一,將處理的文章分章節
import pandas as pd
rawchap = [ " ".join(m_cut(w)) for w in chapter.txt.iloc]
# 首先去搜狗細胞庫下載相關的人名地名檔案並進行相關的轉化
import jieba
import pandas as pd
udobj = wordcloud.WordCloud(font_path = myfont,
mode = "RGBA", background_color = None
).generate(' '.join(rawchap))
plt.imshow(udobj)
plt.axis("off")
plt.show() #輸出整篇文章的詞雲

#下面的內容以第一章為例
import pandas as pd
tmpdf_peo = pd.read_table('小說人名.txt',
names = ['w'], encoding = 'utf-8')
peo_nam = [ w for w in res1 if w in list(tmpdf_peo.w) ]
tmpdf_pla = pd.read_table('小說地名.txt',
names = ['w'], encoding = 'utf-8')
pla_nam = [ w for w in res1 if w in list(tmpdf_pla.w) ]
#人名詞雲
import matplotlib.pyplot as plt
cloudpeo = wordcloud.WordCloud(font_path = myfont,
mode = "RGBA", background_color = None
).generate(' '.join(peo_nam) )
plt.imshow(cloudpeo)
plt.axis("off")
plt.show()

cloudpla = wordcloud.WordCloud(font_path = myfont,
mode = "RGBA", background_color = None
).generate(' '.join(pla_nam) )
plt.imshow(cloudpla)
plt.axis("off")
plt.show()

nam=str(peo_nam).join(str(pla_nam))
cloudobj = wordcloud.WordCloud(font_path = myfont,
mode = "RGBA", background_color = None
).generate(' '.join(nam))
plt.imshow(cloudobj)
plt.axis("off")
plt.show()

# 官網提供的顏色分組類程式碼,略有修改
from wordcloud import get_single_color_func
class GroupedColorFunc(object):
def __init__(self, color_to_words, default_color):
self.color_func_to_words = [
(get_single_color_func(color), set(words))
for (color, words) in color_to_words.items()]
self.default_color_func = get_single_color_func(default_color)
def get_color_func(self, word):
"""Returns a single_color_func associated with the word"""
try:
color_func = next(
color_func for (color_func, words) in self.color_func_to_words
if word in words)
except StopIteration:
color_func = self.default_color_func
return color_func
def __call__(self, word, **kwargs):
return self.get_color_func(word)(word, **kwargs)
######
# 指定分組色系
color_to_words = {
'blue': peo_nam,
'red': pla_nam
}
default_color = 'gray'
grouped_color_func = GroupedColorFunc(color_to_words, default_color)
udobj.recolor(color_func=grouped_color_func)
plt.imshow(udobj)
plt.axis("off")
plt.show()

#用指定的色系輸出全文的詞雲
imgobj = imread("射鵰背景1.png")
image_colors = wordcloud.ImageColorGenerator(np.array(imgobj))
udobj.recolor(color_func=image_colors)
plt.imshow(udobj)
plt.axis("off")
plt.show()

from scipy.misc import imread
def m_cut(intxt):
return [ w for w in jieba.cut(intxt) if w not in stoplist and len(w) > 1 ]
udobj = wordcloud.WordCloud(font_path = myfont,
mask = imread("大頭照.jpg"),
mode = "RGBA", background_color = None
).generate(' '.join(res1))
plt.imshow(udobj)
plt.axis("off")
plt.show() #輸出整篇文章的詞雲

