本篇博客介紹2個第三方庫,中文分詞庫jieba和詞雲庫WordCloud,我們將完成三個例子:
統計英文詞匯頻率
統計中文文本詞匯頻率使用jieba庫
生成詞雲
在正式開始之前,我們先安裝兩個第三方庫:中文分詞庫jieba和詞雲庫WordCloud

統計英文詞匯頻率
英文詞匯統計十分簡單,因為每個單詞之間都是用空格分開的的,當然也有一些特殊模號,我們將對整個文本進行噪音處理,然后將其分割成單詞,存入字典中,再給詞匯按照頻率排序,步驟如下:
從文件流 中讀取一段全英文文本
將文本用lower()歸一化成小寫形式
將文本中的特殊符號:;<>"~!@#$%^&*()-+[]|{}/*.,?過濾,替換成空格for ch in ';<>"~!@#$%^&*()-+[]|{}/*.,?':replace
將文本split,划分成單個單詞,返回一個列表
遍歷這個列表,按照單詞=>出現次存入字典中:counts[x]=counts.get(x,0)+1
使用items()返回一個列表,給列表排序
格式化輸出這個列表
代碼如下:
#coding=gbk
def getText(fileName):
f=open(fileName,'r')
txt=f.read().lower()
for ch in ';<>"~!@#$%^&*()-+[]|{}/*.,?':
txt=txt.replace(ch,' ')
f.close()
return txt
def comp(x):
return x[1]
def main():
txt=getText('English.txt')
words=txt.split()
counts={}
for x in words:
counts[x]=counts.get(x,0)+1
items=list(counts.items())
items.sort(key=comp,reverse=True)
for i in range(10):
key,value = items[i]
print("{0:<10} {1:>5}".format(key,value))
main()
讀入文件:
輸出結果:
you 32
to 19
the 10
who 10
those 9
have 8
and 8
that 6
want 6
make 6
統計中文詞匯頻率
中文語句和英文不一樣,中文詞匯之間沒有空格而是連續的字段,如何對一段文本進行分詞處理呢?我們可以安裝第三方庫jeiba,它使用中文詞庫的方式來識別詞匯:依靠中文詞庫計算出某個詞匯的概率,從而確定某段文字是不是詞匯,我們只需要在cmd中打開script目錄,輸入pip install jieba即可完成安裝,常用函數如下:
函數 描述 舉例
jieba.lcut(s) 精確模式,把文本精確地切分開,不存在冗余,返回一個列表類型的分詞結果 jieba.lcut('中國是一個偉大的國家')
jieba.lcut(s,cut_all=True) 全模式,把文本中所有可能的詞匯都掃描出來,存在冗余,返回一個列表類型的分詞結果 jieba.lcut('中國是一個偉大的國家',cut_all=True)
jieba.lcut_for_search(s) 搜索引擎模式,在精確模式的基礎上對長詞進行切分,返回一個列表類型的分詞結果 jieba.lcut_for_search('中國是一個偉大的國家')
jieba.add_word(s) 將新詞匯添加到詞庫中 jieba.add_word(‘我愛python’)
舉例:
#coding=gbk
import jieba
def main():
print(jieba.lcut('中國是一個十分美麗的國家'))
print(jieba.lcut('中國是一個十分美麗的國家',cut_all=True))
print(jieba.lcut_for_search('中國是一個十分美麗的國家'))
main()
'''
['中國', '是', '一個', '十分', '美麗', '的', '國家']
['中國', '國是', '一個', '一個十', '十分', '美麗', '的', '國家']
['中國', '是', '一個', '十分', '美麗', '的', '國家']
'''
說完jieba庫,我們要開始統計詞頻了,如何統計?步驟和統計英文相似,不過有了jieba的加持,這變得更為簡單:
從文件流 中讀取一段全中文文本
直接使用jieba.lcut(txt)將文本切分,返回一個列表
當然這個列表中包含了字符,我們可以直接在遍歷過程中不統計len=1的字符
遍歷這個列表,按照單詞=>出現次存入字典中:counts[x]=counts.get(x,0)+1
使用items()返回一個列表,給列表排序
格式化輸出這個列表
代碼如下:
#coding=utf-8
import jieba
def getText(fileName):
f=open(fileName,'r',encoding='utf-8')
txt=f.read()
f.close()
return txt
def comp(x):
return x[1]
def main():
txt=getText('Chinese.txt')
words=jieba.lcut(txt)
counts={}
for x in words:
if len(x)==1:
continue
else:
counts[x]=counts.get(x,0)+1
items=list(counts.items())
items.sort(key=comp,reverse=True)
for i in range(10):
key,value = items[i]
print("{0:<10} {1:>5}".format(key,value))
main()
文本讀入
統計結果:
'''
可以 9
藏不住 4
如果 3
一天 3
我們 3
一個 3
男人 3
每個 3
那里 3
不怪 3
'''
生成詞雲
生成詞雲我們是用的是wordcloud庫,這個庫可以將給定的一段文本按照空格鏡像區分,按照頻率顯示在一張圖片上,頻率越高,字體越大,函數以及參數如下:
生成詞雲對象:wordcloud.WordCloud([width][,height][,min_font_size],[,max_font_size][,font_path][,max_words][,stop_words][,mask])
參數屬性:鄭州婦科哪家好 http://www.zzkdfk.com/
函數 描述 舉例
width 詞雲對象的寬度,默認400 w=wordcloud.WorldCloud(width=800)
height 詞雲對象的高度,默認600 w=wordcloud.WorldCloud(height=800)
min_font_size 指定詞雲中字體的最小號,默認為4號 w=wordcloud.WorldCloud(min_font_size=10)
max_font_size 指定詞雲字體的最大號,默認根據高度自動調節 w=wordcloud.WorldCloud(max_font_size=20)
font_step 指定詞雲中字體字號的步進間隔,默認為1 w=wordcloud.WorldCloud(font_step=2)
font_path 指定字體文件的路徑,默認為None w=wordcloud.WorldCloud(font_path='msyh.ttc')
max_words 指定詞雲中的最大顯示單詞數量,默認200 w=wordcloud.WorldCloud(max_words=100)
stop_words 指定詞雲中的排除詞列表,列表中的詞匯將不會出現在詞雲中 w=wordcloud.WorldCloud(stop_words={"python"})
mask 指定詞雲形狀,默認為長方形,需要引用imread()函數 >>> from scipy.misc import imread
>>> mk=imread('pic.png')
>>>w=wordcloud.WordCloud(mask=mk)
background_color 指定詞雲圖片的背景顏色,默認為黑色 w=wordcloud.WorldCloud(background_color='white')
將文本加載到詞雲對象:w.generate(txt)
將詞雲對象導出成文件: w.to_file(fileName)
wordcloud根據空格來區分單詞,並且會自動過濾符號
代碼如下:(根據QQ消息記錄,過濾掉頭銜和@后生成詞雲)
#coding=gbk
#coding=utf-8
import wordcloud
import jieba
def getText(fileName):
f=open(fileName,'r',encoding='gbk')
txt=''
for line in f:
if ('【' in line) or ('】' in line) or ('@' in line):continue
else:txt+=line
f.close()
txt=' '.join(jieba.lcut(txt))
return txt
def main():
txt=getText('test.txt')
w=wordcloud.WordCloud(font_path='msyh.ttc',width=800,height=600,max_words=40,font_step=3)
w.generate(txt)
w.to_file('wordcloud3.png')
print('make wordCloud successfully!')
main()