1. 程式人生 >實用技巧 >其它 >文字挖掘學習筆記(一):文字分詞和詞雲展示

文字挖掘學習筆記(一):文字分詞和詞雲展示


技術標籤:大資料python資料分析

注:學習筆記基於文彤老師文字挖掘的系列課程

課程連結: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()
txtheadmidlen
0全本全集精校小說盡在:http://www.yimuhe.com/u/anglewing26...-155
1更多資源下載:http://qqzone.ctdisk.com-131
2※宣告:本電子書僅供讀者預覽,請在下載24小時內刪除,不得用作商業用途;如果喜歡請購買正版圖書!※-149
3--------------------------------------------142
4“金庸作品集”新序-19
# 章節判斷
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()
txtchap
0全本全集精校小說盡在:http://www.yimuhe.com/u/anglewing26...0.0
1更多資源下載:http://qqzone.ctdisk.com0.0
2※宣告:本電子書僅供讀者預覽,請在下載24小時內刪除,不得用作商業用途;如果喜歡請購買正版圖書!※0.0
3------------------------------------------0.0
4“金庸作品集”新序0.0

提取出所需章節

raw[raw.chap == 1].head()
txtchap
33第一回 風雪驚變1.0
341.0
351.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() #輸出整篇文章的詞雲

文字挖掘學習筆記(一):文字分詞和詞雲展示