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)