嚴明,鄭昌興
(國防大學政治學院,上海201602)
誕生于20 世紀90 年代初的Python 語言,因其簡潔、優美、開源、功能強大等一系列特點,本世紀初以來其使用率呈現快速增長之勢。特別是近年來隨著互聯網、大數據和人工智能等技術的發展和應用需求的增長,Python 已經超越C#,與Java、C、C++一起成為4 大流行語言,成為最受歡迎的程序設計語言之一,廣泛應用于從桌面應用、Web 開發、自動化測試運維、爬蟲到大數據處理、人工智能等各個領域。在IEEE Spectrum發布的2017 年和2018 年編程語言排行榜中,Python均高居第一;在TIOBE 的2017 年度榜單中,Python 位居第二,在最新的2018 年9 月份的編程語言排行榜上位居第三。
目前,Python 不僅具有功能強大的標準庫,支持Python 的第三方庫已達數以萬計,豐富的第三方庫則是Python 不斷發展的保證。在Python 環境下,引入第三方面庫jieba 和WordCloud 等可以方便時對文本進行分詞和制作詞云。
分詞是自然語言處理(NLP)中文本處理的基礎環節和前提。與以英文為代表的拉丁語系語言相比,中文分詞要復雜得多、困難得多,因為自古以來中文的詞語之間均沒有自然分隔。長期以來,許多學者對中文分詞進行了大量的研究,提出了許多算法,例如基于字符串匹配的分詞方法、基于統計的分詞方法和基于理解的分詞方法,等等。
在使用Python 進行中文分詞處理時,可以使用第三方的jieba 分詞器進行。其分詞算法總體是:使用基于前綴詞典的詞圖掃描,生成所有可能生成詞所構成的有向無環圖,再采用動態規劃查找最大概率路徑,找出基于詞頻的最大切分組合;對于未登錄詞,采用了基于漢字成詞能力的HMM 模型(使用Viterbi 算法)來預測分詞。
jieba 分詞支持三種分詞模式:一是精確模式(默認模式),試圖最精確地切分,適合文本分析;二是全模式,把所有的可以成詞的詞語都掃描出來,速度非常快但是不能解決歧義;三是搜索引擎模式,在精確模式的基礎上對長詞再進行詞切分,以提高召回率,適合用于搜索引擎分詞。前兩種模式使用jieba.cut()函數,通過參數進行選擇模式和具體算法,第三種模式使用jieba.cut_for_search()函數。三種模式的常用格式分別為:
jieba.cut(sentence,cut_all=False,HMM=True)
jieba.cut(sentence,cut_all=True,HMM=False)
jieba.cut_for_search(sentence,HMM=False)
jieba 分詞器所基于的前綴詞典由dict.txt 提供。在實際應用中,用戶常常會發現一些“新詞”由于未登錄而不能正確地切分,這時就需要用戶增加領域詞表或添加自定義詞語。使用 jieba.load_userdict(file_name)函數可以指定自己自定義的詞典,使用jieba.add_word(word,freq=None,tag=None)函數可以向詞典中添加新詞。
詞云圖(簡稱“詞云”),也叫文字云,是對文本中出現頻率較高的“關鍵詞”予以視覺化的展現,目前詞云已成為文本數據可視化的一種常用方式。在詞云中,通常是不同的單詞(詞組)采用不同的顏色表示,不同詞頻或權重的單詞(詞組)采用不同的字號表示。目前互聯網上已經有很多在線詞云工具,例如國外的Word-Art、Wordle、WordItOut、Tagxedo、Tagul 等,以及國內的“圖悅”等。即便是智能手機,用戶可以也可以找到制作詞云的App。在Python 環境下,使用第三方的WordCloud 庫也能輕松地完成詞云的制件,并對其進行個性化的處理。
對于WordCloud 庫來說,每個詞云是一個Word-Cloud 對象,通過對其20 多個屬性(或者說是參數)進行配置可以設置詞云。其中,常用屬性說明為:
●font_path:字體路徑。需要注意的是,制作中文詞云時必須指定字體文件,否則不能正常顯示。
●width:輸出的畫布寬度,默認為400 像素。
●height:輸出的畫布高度,默認為200 像素。
●scale:按照比例進行放大畫布,默認值為1。
●background_color:背景顏色,默認值為“black”。
●mask:指定遮罩圖(即背景圖片、詞云的形狀圖),字的大小布局和顏色都會依據遮罩圖生成。如果參數為空,則使用二維遮罩繪制詞云。如果mask 非空,設置的寬高值將被忽略,遮罩形狀被mask 取代。
●min_font_size:顯示的最小的字體大小,默認值為4。
●max_font_size:顯示的最大的字體大小。
●font_step:字體步長,默認值為1。
●relative_scaling:表示詞頻和云詞圖中字大小的關系參數,默認0.5。
●max_words:要顯示的詞的最大個數,默認值為200。
●stopwords:設置需要屏蔽的詞(即停用詞)。如果為空,則使用內置的STOPWORDS。
利用WordCloud 制作詞云時,一般經過三個步驟:一是使用wordcloud.WorldCloud 函數來設置詞云對象的有關屬性(或者說是參數);二是利用wordcloud.generate(text)函數或wordcloud.generate_from_frequencies(frequencies[,…])函數生成詞云,前者是根據文本生成詞云,后者是根據詞頻生成詞云;三是利用wordcloud.to_file(file_name)函數將詞云輸出到文件進行保存。
當前和今后一個時期,深入學習黨的十九大精神是全黨和全國各族人民的一項重大政治任務。筆者在學習過程中,將黨的十九大報告與十八大報告進行了對比學習,并由此產生了對兩個報告進行文本處理的想法。
以下代碼實現了兩個報告的文本分詞、詞頻統計,在此基礎上發現十九大報告中出現的新詞,并制作相應的新詞的詞云(如圖1 所示)。

圖1 黨的十九大報告新詞之詞云
#_*_coding:utf-8_*_
from PIL import Image
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
行政事業單位的內部控制建設應該結合我國新時期的基本國情,與時俱進地制定適合各個地方政府和行政事業單位的發展策略,從單位內部結構和運行作為出發點,才能最大程度的完善內部管理體制。為了更好地適應市場經濟的大環境,行政事業單位需要在行政功能和公共服務等方面進行相應的人力和資源的整合工作,同時配合政策出臺的管理條例,更加切實有效地開展新時期賦予行政事業單位的歷史任務。
import jieba
from wordcloud import WordCloud,ImageColorGenerator
#以下功能為:添加新詞(未登錄詞)
list1=['中國特色','新時代','一帶一路']
for i in list1:
jieba.add_word(i)
#以下自定義函數的功能是分詞、統計詞頻、去除標點符號和單字詞等
def keyword(filename): #生成分詞列表(高頻詞)
kw_jieba = list(jieba.cut(text,cut_all=False, HMM=False)) #分詞
kw=Counter(kw_jieba) #統計詞頻
kw_common=kw.most_common(5000) #選取前n 個高頻詞
#以下功能為:去除標點符號和單字詞
temp=[]
for i in kw_common:
if len(i[0])==1:
temp.append(i)
for i in temp:
kw_common.remove(i)
return kw_common
#以下為創建詞云自定義函數
def kw_wc(kwlist,out_jpg):
masck_pic = np.array(Image.open('D:MyPython p01.jpg'))#讀取背景圖片
wc=WordCloud(
font_path='simhei.ttf', #設置字體格式,如不設置顯示不了中文
background_color="white", #設置背景顏色
max_words=100, #設置最大詞數
mask=masck_pic, #設置背景圖片
max_font_size=50 #設置字體最大值
)
wc.generate_from_frequencies(dict(kwlist)) #生成詞云
plt.figure(out_jpg) #新建一個名為out_jpg 的畫圖窗口
plt.imshow(wc) #直接顯示(顏色隨機分配)
plt.axis('off') #去掉坐標軸
plt.show() #顯示詞云圖
wc.to_file(out_jpg) #將詞云輸出到名為out_jpg 的文件
return wc
###############主程序#############
kw18=keyword('D:MyPythond18.txt')#處理“十八大報告”文本
kw19=keyword('D:MyPythond19.txt')#處理“十九大報告”文本
#以下功能為從kw19 中去除kw18 中出現的詞
kw19_18new=[]
for i in kw19:
k=0
for j in kw18:
if i[0]==j[0]:
k=1
break
if k==0:
kw19_18new.append(i)
kw19_18new=kw_wc(kw19_18new,"p19_18new0.jpg")
#創建新詞詞云