基于文本分析的场景有词云图、基于距离的文本聚类、基于监督的文本分类、情感分析等等。不管是文档库,文章、段落或句子,针对文本挖掘的基础都集中于词的分析,即针对文档库/段落/句子等的分词(切词)。词是很多中文自然语言处理的基础,分词有助于提取文档的特征,对后续的分类模型构建有很大影响。jiebaR包的切词手段有多种,比如基于最大概率法mp,隐马尔科夫hmm,最大概率法+隐马尔科夫混合法mix,查询法query。jiebaR 包参考链接: http://qinwenfeng.com/jiebaR/。
分词引擎worker
worker()用法
#worker(type = "mix", dict = DICTPATH, hmm = HMMPATH,
user = USERPATH, idf = IDFPATH, stop_word = STOPPATH, write = T,
qmax = 20, topn = 5, encoding = "UTF-8", detect = T,
symbol = F, lines = 1e+05, output = NULL, bylines = F,
user_weight = "max")
type:切词方法,默认使用混合法返回类型。tag词性标注,keywords关键词抽提。
dict:指定主词典的路径,相当于词库。
hmm:隐马尔科夫模式的路径。
user:自定义字典的路径。
idf:逆文档频次的路径。
stop_word:指定停止词的路径。
write:输出结果的路径。
qmax:在使用查询模式的时候,可指定最大的查询词的长度。
topn:提取文档关键词的个数,默认前5个。
encoding:指定输入文件的编码UTF8。
lines:指定最大的读取行数。
output:指定输出的文件路径。
user_weight:用户自定义字典权重设定,当使用自定义词典时,默认权重为最高。
#segment(code,jiebar,mod=NULL)
code:文本句子。
jiebar:设置分组的引擎worker。
mod:指定返回分词的结果类型,也是相当于切词的手段(mp/hmm/mix/query)。
#例子1
> sentence<-"脱贫攻坚是我们党对全国各族人民的庄严承诺,事关全面小康、家国梦想。扶贫路上最美的风景是群众笑脸,群众满意是最好的“民生答卷”"
> jiebar<-worker()#默认混合模式
> segment(sentence,jiebar)
[1] "脱贫" "攻坚" "是" "我们" "党" "对" "全国" "各族人民"
[9] "的" "庄严" "承诺" "事关" "全面" "小康" "家" "国"
[17] "梦想" "扶贫" "路上" "最美" "的" "风景" "是" "群众"
[25] "笑脸" "群众满意" "是" "最好" "的" "民生" "答卷"
#例子2
> engine<-worker()
> egvector<-c('群众满意是最好的“民生答卷”','天气真好')
> engine<=egvector
[1] "群众满意" "是" "最好" "的" "民生" "答卷" "天气" "真好"
词性标注
> cutter=worker(type = "tag")
> cutter_words<-cutter<="我爱厦门"
> cutter_words
r v ns
"我" "爱" "厦门"
r:表示代词
v:表示动词
ns:表示地名
中文词性标识以及含义表获取方式:
关注公众号
后台回复【中文词性标识】
停止词处理
“的”,“哦”,“哎呦”,“而且”,“了”,“是”等一般被视为停用词。在jiebaR 中,可以通过词性标注去除停用词,也可通过指定停用词词典去除停用词。
1、词性标注法
> stop=c('r','p')。
> sentence=worker(type = "tag")
> sentence_words<-sentence<="脱贫攻坚是我们党对全国各族人民的庄严承诺,事关全面小康、家国梦想"
> sentence_words[!(names(sentence_words) %in% stop)]#去除停止词是代词,介词。
v vn v n n l uj a v
"脱贫" "攻坚" "是" "党" "全国" "各族人民" "的" "庄严" "承诺"
n n nr q n n
"事关" "全面" "小康" "家" "国" "梦想"
问题1:如果要把“脱贫攻坚”,“家国梦想”,“民生答卷”,“群众笑脸”这四个词不切开,以固定名词出现,该如何切词??
2、指定停用词词典
假设停用词词典txt文本文件,如下:
注:停用词典txt文件一定要放在R语言的工作目录下才行,而且txt文件的第一行需为空行否则无法导入停用词典,当前工作目录路径采用getwd()得知。
> sentence=worker(stop_word='stop.txt')
> sentence_words<-sentence<="脱贫攻坚是我们党对全国各族人民的庄严承诺,事关全面小康、家国梦想"
> sentence_words
[1] "脱贫" "攻坚" "党" "全国" "各族人民" "庄严" "承诺" "事关"
[9] "全面" "小康" "家" "国" "梦想"
自定义分词词典
jiebaR自定义分词词典格式包含词、词频、词性,如下。
人民群众 12 n
老百姓 23 nz
中国 12 nz
其中“12”表示“人民群众”的词频,n越大被分词的可能性越高。设置自定义分词词典 user.txt 文本文件。
> user_dict=worker(type = "mix",user="user.txt")
> user_dict<="脱贫攻坚是我们党对全国各族人民的庄严承诺,事关全面小康、家国梦想。扶贫路上最美的风景是群众笑脸,群众满意是最好的“民生答卷”"
[1] "脱贫攻坚" "是" "我们" "党" "对" "全国" "各族人民" "的"
[9] "庄严" "承诺" "事关" "全面" "小康" "家国梦想" "扶贫" "路上"
[17] "最美" "的" "风景" "是" "群众笑脸" "群众满意" "是" "最好"
[25] "的" "民生答卷"
以上自定义词典很方便的解决了问题1,特别适合量大文档库处理。针对问题1,还可用新增词函数解决:
new_user_word(worker,tags=rep("n",length(words)))
worker:已经指定的分词引擎
words:自定义词
tags:默认为名词词性
> sentence<-"脱贫攻坚是我们党对全国各族人民的庄严承诺,事关全面小康、家国梦想。扶贫路上最美的风景是群众笑脸,群众满意是最好的“民生答卷”"
> jiebar<-worker()#默认混合模式
> new_user_word(jiebar,c('民生答卷','群众笑脸','家国梦想','脱贫攻坚'))
[1] TRUE
> segment(sentence,jiebar)
修改前后对比如下:
前
后