1. 程式人生 > >中文分詞及繪製詞雲

中文分詞及繪製詞雲

文字分析一直以來是資料分析的一塊重要內容,隨著語言識別技術,大資料分析技術的發展,文字分析越來越受到關注和重視。比如要快速地提取某論壇中某個熱點新聞主要觀點,我們需要先對這些評論進行文字分析。分詞是將一句完整的語句切分成若干一個一個的詞語。在現實文字分析中分詞處理應用非常廣泛,如對文字去重時通常需要先對文字內容進行分詞處理,然後利用詞語之間的差異距離分析文字間的相似度。在R語言中,已經有非常好的分詞處理包,包括jiebaR、Rwordseg等。本文主要基於jiebaR包,討論如何對文字內容進行分詞以及基於wordcloud2繪製詞雲。
一、jiebaR包簡介
在諸多的開源包中,jiebaR是分詞效果相對較好的包,該包主要由Qin Wenfeng等開發,可用於中文語句的分詞處理。目前該包已公佈到CAN官網,可按照R包安裝的標準方法進行安裝:install.packages(‘jiebaR’)。jiebaR提供了函式worker()來初始化分詞引擎,並使用函式segment()進行分詞。基於四種演算法其提供了四種分詞模式:
(1)最大概率法(MPSegment),根據Trie樹構建有向無環圖和進行動態規劃演算法。
(2)隱式馬爾科夫模型(HMMSegment),基於人民日報等語料庫構建的HMM模型來進行分詞,主要演算法思路是根據(B,E,M,S)四個狀態來代表每個字的隱藏狀態。HMM模型由dict/hmm_model.utf8提供。分詞演算法即viterbi演算法。
(3)混合模型(MixSegment)是四個分詞引擎裡面分詞效果較好的類,它結合使用了最大概率法和隱式馬爾科夫模型。預設情況下選擇該模型。
(4)索引模型(QuerySegment)先使用混合模型進行切詞,再將切出來的較長的詞,列舉句子中所有可能成詞的情況。
JiebaR進行分詞處理時,可採用多種方法,但不管哪種方法,首先需要啟動分詞引擎,下面舉例子說明。

library(jiebaR)
texts<-'這是一個例子,說明分詞jiebaR包的使用方法'
#啟動分詞引擎
wk<-worker()
#分詞處理
wk[texts]
[1] "這是"   "一個"   "例子"   "說明"   "分詞"   "jiebaR" "包"     "的"     "使用"  
[10] "方法"

其中在進行分詞處理時也可以使用wk<=texts,結果是一樣的。在這裡我們使用了預設的引擎設定,如果我們不想使用預設設定,可以在引擎啟動時設定相關引數。
採用最大概率法分詞:

wk<-worker(type = 'mp')
wk[texts]
[1
] "這是" "一個" "例子" "說明" "分詞" "jiebaR" "包" "的" "使用" [10] "方法"

採用隱式馬爾科夫模型,並採用自定義字典庫:

wk<-worker(type='hmm',user='C:/Users/yjs/Documents/R/win-library/3.4/jiebaRD/dict/user.dict.utf8')
segment(texts,wk)
[1] "這是"   "一個"   "例子"   "說明"   "分詞"   "jiebaR" "包"     "的"     "使"    
[10] "用"     "方法"

採用索引模型:

wk<-worker(type='query')
wk<=texts
[1] "這是"   "一個"   "例子"   "說明"   "分詞"   "jiebaR" "包"     "的"     "使用"  
[10] "方法"  

同時,該包也提供了一種快速分詞模式,即不用worker()函式設定引擎,而直接採用qseg()函式qseg<=texts,這裡可以檢視qseg的預設設定:

> qseg
Worker Type:  Jieba Segment
Default Method  :  mix
Detect Encoding :  TRUE
Default Encoding:  UTF-8
Keep Symbols    :  FALSE
Output Path     :  
Write File      :  TRUE
By Lines        :  FALSE
Max Word Length :  20
Max Read Lines  :  1e+05
Fixed Model Components:  
$dict
[1] "C:/Users/yjs/Documents/R/win-library/3.4/jiebaRD/dict/jieba.dict.utf8"
$user
[1] "C:/Users/yjs/Documents/R/win-library/3.4/jiebaRD/dict/user.dict.utf8"
$hmm
[1] "C:/Users/yjs/Documents/R/win-library/3.4/jiebaRD/dict/hmm_model.utf8"
$stop_word
NULL
$user_weight
[1] "max"
$timestamp
[1] 1511485748
$default $detect $encoding $symbol $output $write $lines $bylines can be reset.

因此,採用快速模式時,也相當於先運行了一遍程式碼:qseg<-worker(type=”mix”)
除了可以進行分詞處理外,jiebaR包還可以進行關鍵詞提取,如下:

keyword<-worker(type = 'keywords',topn = 2)
keyword[texts]
11.7392  11.7035  
"jiebaR"   "分詞"

二、文字的分詞示例
前面已經對jiebaR包分詞過程的方法進行了簡單介紹,接下來,我們再以一個實際例子對該包的使用方法進行說明,這裡繪製一篇論文的詞雲。首先,我們需要將論文儲存為txt文字,然後讀入記憶體。

usetr<-'C:/Users/yjs/Documents/R/win-library/3.4/jiebaRD/dict/user.dict.utf8'
f<-scan('paper.txt',what = "",encoding = 'utf8')
seg<-qseg[f]

也可以直接讀入檔案

wk<-worker(type=’mix’,user=usetr,write=F)
seg<-wk['paper.txt']
#將字元小於1的詞去掉
seg<-seg[nchar(seg)>1]
#計算詞頻
seg<-table(seg)
#去掉數字
seg<-seg[!grepl('[0-9]+',names(seg))]
#取詞頻數前100的詞
seg<-sort(seg,decreasing = T)[1:100]

三、繪製詞雲圖
這裡我們採用wordcloud2包進行詞雲繪製,直接上程式碼:

bmp('paper.bmp',width = 500,height = 500)
par(bg="black")
#將結果繪製為橢圓形圖雲
wordcloud2(data=seg,size=0.5,color='random-light',backgroundColor='grey')
dev.off()

這裡寫圖片描述

#將結果繪製為字母R形圖雲
letterCloud(data = seg,word = 'R',size=0.5)
#關閉繪圖

這裡寫圖片描述