中文分詞工具Rwordseg

Rwordseg是一個R環境下的中文分詞工具,引用Ansj包(使得Ansj可用於人名識別、地名識別、組織機構名識別、多級詞性標註、關鍵詞提取、指紋提取等領域)支持行業詞典、用戶自定義詞典,Ansj是開源的java中文分詞工具,基於中科院ictclas中文分詞算法,採用隱馬爾科夫模型(HMM)。Rwordseg特點有三,一是分詞準確,二是分詞速度超快,三是可以導入自定義詞庫,也可導入搜狗輸入法的細胞詞庫(sqel格式) 

Rwordseg分詞速度達到每秒鐘大約200萬字左右,準確率能達到96%以上。Rwordseg放在Rforge,因此如果直接install.packages,基本都會失敗告終。正確方法是下載源碼,本地安裝

安裝Rwordseg,這個包不在CRAN上,所以不能在R中直接選擇在線安裝,需要用下面兩種方式來安裝,輸入:

①如果是最新版本的R軟件,不用寫type

install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")

②如果R語言版本爲舊的,則上面不能安裝,採用下面語句

install.packages("Rwordseg", repos = "http://R-Forge.R-project.org", type = "source")

需要安裝並裝載兩個library,Rwordseg、rJava。rJava的作用是提供java的庫,供Rwordseg調用。安裝後,調用語句如下:

library(rJava)
library(Rwordseg)		#建議數據量<1G

segmentCN函數解釋

segmentCN(strwords,analyzer = get("Analyzer", envir = .RwordsegEnv),nature = FALSE, nosymbol = TRUE, returnType = c("vector", "tm"), isfast = FALSE, outfile = "", blocklines = 1000)
#strwords:中文句子
#analyzer:分析的java對象
#nature:是否識別詞組詞性(動詞、形容詞)
#nosymbol:是否保留句子符號
#returnType:默認是一個字符串,也可以保存成其他樣式,如tm格式以供tm包分析
#isfast:false代表劃分成一個個字符,true代表保留句子只是斷句
#outfile:如果輸出是一個文件,文件路徑
#blocklines:一行的最大讀入字符數
#recognition:是否關閉人名識別

參數isNameRecognition 可用來人名識別

segment.options(isNameRecognition = TRUE)

除人名外,Rwordseg還有兩類識別

數字識別(isNumRecognition ,默認TRUE,默認識別數字)

量詞識別(isQuantifierRecognition,默認TRUE,默認識別量詞)

加詞刪詞,臨時添加,未記錄下來

insertWords("錯過",save=FALSE) 
segmentCN(c("如果你因爲錯過太陽而流淚", "你也會錯過星星"))

有些情況下不希望某個詞被分出來,例如“錯過”,這裏“錯”和“過”語義上已經不應該是一個詞語了,所以可從詞典中刪除這個詞,再添加上需要的詞語,繼續做分詞

deleteWords("錯過") 
insertWords("過去") 
segmentCN("這個錯過去你可以犯,但是現在再犯就不應該了") 

安裝卸載詞典

分詞處理時可能會遇到一些精而專文章,專業詞彙在詞庫裏面並沒有,這時候就需要去找相關詞典安裝到R中。例如在做新聞分析中,一些娛樂新聞裏會有很多明星歌手名字出現,這些名字在做分詞時,不會被識別爲一個個詞。此時可能需要添加一個名字詞典,詞典可以是自己建也可以從網上找。推薦從搜搜狗輸入法的詞庫下載地址

http://pinyin.sogou.com/dict/,可以選擇需要的分類詞典下載

segmentCN("2015年的幾部開年戲都出現了唐嫣的身影") 
installDict("D:\\R\\sources\\Dictionaries\\singers.scel", dictname ="names")
#裝載自定義詞庫(可以是一個文本文件,每行一個詞)
listDict() 
#在不需要添加的詞典時,可刪除
uninstallDict()
#在分詞過程中,先除去數據中可能存在的數字和一些特殊符號
hlzj<-readLines("d:\\R\\RWorkspace\\orgData.txt",encoding ="UTF-8") 
hlzjTemp<-gsub("[0-90123456789 < > ~]","",hlzj) 
hlzjTemp<-segmentCN(hlzjTemp) 
#整理一個停用詞表,根據實際內容中出現的一些無實際分析意義的詞語
stopwords<- unlist(read.table("D:\\R\\RWorkspace\\StopWords.txt",stringsAsFactors=F));

#x爲分詞後的結果
removeStopWords<-function(x,stopwords) { 
temp<-character(0) 
index<-1 
xLen<-length(x) 
while(index<=xLen) { 
if (length(stopwords[stopwords==x[index]])<1) 
temp<-c(temp,x[index]) 
index<-index+1 
} 
temp 
}
hlzjTemp2 <-lapply(hlzjTemp,removeStopWords,stopwords)

#詞雲展現
words<-lapply(hlzjTemp2,strsplit," ")	#將向量拆分成列表
wordsNum<-table(unlist(words)) 
wordsNum<-sort(wordsNum)
wordsData<-data.frame(words=names(wordsNum),freq=wordsNum) 

library(wordcloud) 
weibo.top150<-tail(wordsData,150)	#取前150個詞 
colors=brewer.pal(8,"Dark2") 
wordcloud(weibo.top150$words,weibo.top150$freq,scale=c(8,0.5),colors=colors,random.order=F) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章