中文分词工具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) 

 

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