嚴(yán)明,鄭昌興
(國(guó)防大學(xué)政治學(xué)院,上海201602)
誕生于20 世紀(jì)90 年代初的Python 語(yǔ)言,因其簡(jiǎn)潔、優(yōu)美、開(kāi)源、功能強(qiáng)大等一系列特點(diǎn),本世紀(jì)初以來(lái)其使用率呈現(xiàn)快速增長(zhǎng)之勢(shì)。特別是近年來(lái)隨著互聯(lián)網(wǎng)、大數(shù)據(jù)和人工智能等技術(shù)的發(fā)展和應(yīng)用需求的增長(zhǎng),Python 已經(jīng)超越C#,與Java、C、C++一起成為4 大流行語(yǔ)言,成為最受歡迎的程序設(shè)計(jì)語(yǔ)言之一,廣泛應(yīng)用于從桌面應(yīng)用、Web 開(kāi)發(fā)、自動(dòng)化測(cè)試運(yùn)維、爬蟲(chóng)到大數(shù)據(jù)處理、人工智能等各個(gè)領(lǐng)域。在IEEE Spectrum發(fā)布的2017 年和2018 年編程語(yǔ)言排行榜中,Python均高居第一;在TIOBE 的2017 年度榜單中,Python 位居第二,在最新的2018 年9 月份的編程語(yǔ)言排行榜上位居第三。
目前,Python 不僅具有功能強(qiáng)大的標(biāo)準(zhǔn)庫(kù),支持Python 的第三方庫(kù)已達(dá)數(shù)以萬(wàn)計(jì),豐富的第三方庫(kù)則是Python 不斷發(fā)展的保證。在Python 環(huán)境下,引入第三方面庫(kù)jieba 和WordCloud 等可以方便時(shí)對(duì)文本進(jìn)行分詞和制作詞云。
分詞是自然語(yǔ)言處理(NLP)中文本處理的基礎(chǔ)環(huán)節(jié)和前提。與以英文為代表的拉丁語(yǔ)系語(yǔ)言相比,中文分詞要復(fù)雜得多、困難得多,因?yàn)樽怨乓詠?lái)中文的詞語(yǔ)之間均沒(méi)有自然分隔。長(zhǎng)期以來(lái),許多學(xué)者對(duì)中文分詞進(jìn)行了大量的研究,提出了許多算法,例如基于字符串匹配的分詞方法、基于統(tǒng)計(jì)的分詞方法和基于理解的分詞方法,等等。
在使用Python 進(jìn)行中文分詞處理時(shí),可以使用第三方的jieba 分詞器進(jìn)行。其分詞算法總體是:使用基于前綴詞典的詞圖掃描,生成所有可能生成詞所構(gòu)成的有向無(wú)環(huán)圖,再采用動(dòng)態(tài)規(guī)劃查找最大概率路徑,找出基于詞頻的最大切分組合;對(duì)于未登錄詞,采用了基于漢字成詞能力的HMM 模型(使用Viterbi 算法)來(lái)預(yù)測(cè)分詞。
jieba 分詞支持三種分詞模式:一是精確模式(默認(rèn)模式),試圖最精確地切分,適合文本分析;二是全模式,把所有的可以成詞的詞語(yǔ)都掃描出來(lái),速度非??斓遣荒芙鉀Q歧義;三是搜索引擎模式,在精確模式的基礎(chǔ)上對(duì)長(zhǎng)詞再進(jìn)行詞切分,以提高召回率,適合用于搜索引擎分詞。前兩種模式使用jieba.cut()函數(shù),通過(guò)參數(shù)進(jìn)行選擇模式和具體算法,第三種模式使用jieba.cut_for_search()函數(shù)。三種模式的常用格式分別為:
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 提供。在實(shí)際應(yīng)用中,用戶常常會(huì)發(fā)現(xiàn)一些“新詞”由于未登錄而不能正確地切分,這時(shí)就需要用戶增加領(lǐng)域詞表或添加自定義詞語(yǔ)。使用 jieba.load_userdict(file_name)函數(shù)可以指定自己自定義的詞典,使用jieba.add_word(word,freq=None,tag=None)函數(shù)可以向詞典中添加新詞。
詞云圖(簡(jiǎn)稱“詞云”),也叫文字云,是對(duì)文本中出現(xiàn)頻率較高的“關(guān)鍵詞”予以視覺(jué)化的展現(xiàn),目前詞云已成為文本數(shù)據(jù)可視化的一種常用方式。在詞云中,通常是不同的單詞(詞組)采用不同的顏色表示,不同詞頻或權(quán)重的單詞(詞組)采用不同的字號(hào)表示。目前互聯(lián)網(wǎng)上已經(jīng)有很多在線詞云工具,例如國(guó)外的Word-Art、Wordle、WordItOut、Tagxedo、Tagul 等,以及國(guó)內(nèi)的“圖悅”等。即便是智能手機(jī),用戶可以也可以找到制作詞云的App。在Python 環(huán)境下,使用第三方的WordCloud 庫(kù)也能輕松地完成詞云的制件,并對(duì)其進(jìn)行個(gè)性化的處理。
對(duì)于WordCloud 庫(kù)來(lái)說(shuō),每個(gè)詞云是一個(gè)Word-Cloud 對(duì)象,通過(guò)對(duì)其20 多個(gè)屬性(或者說(shuō)是參數(shù))進(jìn)行配置可以設(shè)置詞云。其中,常用屬性說(shuō)明為:
●font_path:字體路徑。需要注意的是,制作中文詞云時(shí)必須指定字體文件,否則不能正常顯示。
●width:輸出的畫(huà)布寬度,默認(rèn)為400 像素。
●height:輸出的畫(huà)布高度,默認(rèn)為200 像素。
●scale:按照比例進(jìn)行放大畫(huà)布,默認(rèn)值為1。
●background_color:背景顏色,默認(rèn)值為“black”。
●mask:指定遮罩圖(即背景圖片、詞云的形狀圖),字的大小布局和顏色都會(huì)依據(jù)遮罩圖生成。如果參數(shù)為空,則使用二維遮罩繪制詞云。如果mask 非空,設(shè)置的寬高值將被忽略,遮罩形狀被mask 取代。
●min_font_size:顯示的最小的字體大小,默認(rèn)值為4。
●max_font_size:顯示的最大的字體大小。
●font_step:字體步長(zhǎng),默認(rèn)值為1。
●relative_scaling:表示詞頻和云詞圖中字大小的關(guān)系參數(shù),默認(rèn)0.5。
●max_words:要顯示的詞的最大個(gè)數(shù),默認(rèn)值為200。
●stopwords:設(shè)置需要屏蔽的詞(即停用詞)。如果為空,則使用內(nèi)置的STOPWORDS。
利用WordCloud 制作詞云時(shí),一般經(jīng)過(guò)三個(gè)步驟:一是使用wordcloud.WorldCloud 函數(shù)來(lái)設(shè)置詞云對(duì)象的有關(guān)屬性(或者說(shuō)是參數(shù));二是利用wordcloud.generate(text)函數(shù)或wordcloud.generate_from_frequencies(frequencies[,…])函數(shù)生成詞云,前者是根據(jù)文本生成詞云,后者是根據(jù)詞頻生成詞云;三是利用wordcloud.to_file(file_name)函數(shù)將詞云輸出到文件進(jìn)行保存。
當(dāng)前和今后一個(gè)時(shí)期,深入學(xué)習(xí)黨的十九大精神是全黨和全國(guó)各族人民的一項(xiàng)重大政治任務(wù)。筆者在學(xué)習(xí)過(guò)程中,將黨的十九大報(bào)告與十八大報(bào)告進(jìn)行了對(duì)比學(xué)習(xí),并由此產(chǎn)生了對(duì)兩個(gè)報(bào)告進(jìn)行文本處理的想法。
以下代碼實(shí)現(xiàn)了兩個(gè)報(bào)告的文本分詞、詞頻統(tǒng)計(jì),在此基礎(chǔ)上發(fā)現(xiàn)十九大報(bào)告中出現(xiàn)的新詞,并制作相應(yīng)的新詞的詞云(如圖1 所示)。
圖1 黨的十九大報(bào)告新詞之詞云
#_*_coding:utf-8_*_
from PIL import Image
import matplotlib.pyplot as plt
from collections import Counter
import numpy as np
行政事業(yè)單位的內(nèi)部控制建設(shè)應(yīng)該結(jié)合我國(guó)新時(shí)期的基本國(guó)情,與時(shí)俱進(jìn)地制定適合各個(gè)地方政府和行政事業(yè)單位的發(fā)展策略,從單位內(nèi)部結(jié)構(gòu)和運(yùn)行作為出發(fā)點(diǎn),才能最大程度的完善內(nèi)部管理體制。為了更好地適應(yīng)市場(chǎng)經(jīng)濟(jì)的大環(huán)境,行政事業(yè)單位需要在行政功能和公共服務(wù)等方面進(jìn)行相應(yīng)的人力和資源的整合工作,同時(shí)配合政策出臺(tái)的管理?xiàng)l例,更加切實(shí)有效地開(kāi)展新時(shí)期賦予行政事業(yè)單位的歷史任務(wù)。
import jieba
from wordcloud import WordCloud,ImageColorGenerator
#以下功能為:添加新詞(未登錄詞)
list1=['中國(guó)特色','新時(shí)代','一帶一路']
for i in list1:
jieba.add_word(i)
#以下自定義函數(shù)的功能是分詞、統(tǒng)計(jì)詞頻、去除標(biāo)點(diǎn)符號(hào)和單字詞等
def keyword(filename): #生成分詞列表(高頻詞)
kw_jieba = list(jieba.cut(text,cut_all=False, HMM=False)) #分詞
kw=Counter(kw_jieba) #統(tǒng)計(jì)詞頻
kw_common=kw.most_common(5000) #選取前n 個(gè)高頻詞
#以下功能為:去除標(biāo)點(diǎn)符號(hào)和單字詞
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
#以下為創(chuàng)建詞云自定義函數(shù)
def kw_wc(kwlist,out_jpg):
masck_pic = np.array(Image.open('D:MyPython p01.jpg'))#讀取背景圖片
wc=WordCloud(
font_path='simhei.ttf', #設(shè)置字體格式,如不設(shè)置顯示不了中文
background_color="white", #設(shè)置背景顏色
max_words=100, #設(shè)置最大詞數(shù)
mask=masck_pic, #設(shè)置背景圖片
max_font_size=50 #設(shè)置字體最大值
)
wc.generate_from_frequencies(dict(kwlist)) #生成詞云
plt.figure(out_jpg) #新建一個(gè)名為out_jpg 的畫(huà)圖窗口
plt.imshow(wc) #直接顯示(顏色隨機(jī)分配)
plt.axis('off') #去掉坐標(biāo)軸
plt.show() #顯示詞云圖
wc.to_file(out_jpg) #將詞云輸出到名為out_jpg 的文件
return wc
###############主程序#############
kw18=keyword('D:MyPythond18.txt')#處理“十八大報(bào)告”文本
kw19=keyword('D:MyPythond19.txt')#處理“十九大報(bào)告”文本
#以下功能為從kw19 中去除kw18 中出現(xiàn)的詞
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")
#創(chuàng)建新詞詞云