ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

R语言文本数据挖掘(三)

2022-05-21 12:02:11  阅读:194  来源: 互联网

标签:jiebaR 语言 utf8 dict user 词库 数据挖掘 文本 分词


文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息。例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤。R语言中,对中文分词支持较好的包有RWordseg包和jiebaR包,这里学习jiebaR包。

一、jiebaR包简介

jiebaR 是中文分词的R语言版本,支持最大概率法(Maximum Probability),隐式马尔科夫模型(Hidden Markov Model),索引模型(QuerySegment),混合模型(MixSegment),共四种分词模式,同时有词性标注,关键词提取,文本Simhash相似度比较等功能。如果你想要用 R 语言做中文分词的话,我强烈建议你使用 jiebaR 包,其下载和使用都比较简单,都不需要复杂的配置,上手比较容易。

1. jiebaR包的安装和调用

install.packages("jiebaR")
library("jiebaR")

library(wordcloud2)       #用于绘制词云图;
library(dplyr)            #高效的数据整理工具。

2. jiebaR分词示例

work <- worker()                               #用到worker()函数,赋值给work
work["杭州的四月真美丽,想到西湖边吹吹风。"]      #方括号中是要进行分词的语句
#运行结果
 [1] "杭州" "的"   "四月" "真"   "美丽" "想到" "西湖" "边"   "吹"   "吹风"

3. 分词函数用法

worker()和segment()语法:jiebaR通过函数worker()来初始化分词引擎,使用函数segment()进行分词。两个函数语法:

——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")

——segment()函数
segment(code, jiebar, mod = NULL)
code:A Chinese sentence or the path of a text file.       #分词文本
mod:change default result type, value can be "mix","hmm","query","full" or "mp"    #分词算法

二、用户自定义词或词库的添加

1. 使用new_user_word函数

work_new_word<-worker()
new_user_word(work_new_word, c("吹吹风","太子湾","八卦田"))
segment(juzi,work_new_word)

2. 使用user参数添加词库

利用Notepad++编写一个名为ciku.txt的文档,放了三个词:吹吹风、太子湾、八卦田。把这个txt存入getwd()的路径里。再利用worker(user)调用:

work_user<-worker(user="ciku.txt")
segment(juzi,work_user)

(可能会问,为什么不直接用txt文本呢?我一开始也是直接用txt写的,发现有毒,一引用R就崩了。有人给出了解答:如果你的词库是用记事本写的话,因为编码有时不是UTF-8,使用时会出现各种错误,甚至软件奔溃。所以建议使用notepad++编辑,将编码设置为utf-8,另存为txt文件。)

3. 使用user参数添加词库借用搜狗细胞词库

搜狗提供了大量的专业领域词汇,其词库具有专门的.scel格式,词库导出与导入非常麻烦,这时,需要用到搜狗细胞词库转化包cidian,它不仅能够在R中将搜狗词库的scel格式转化为可读的词库,并且还能直接被分词包jiebaR调用!但需要注意的是:cidian包没有发布在CRAN,而是发布在github中,所以需要先获得开发者工具Rtools才能进行安装,也要用到install_github()函数。

#安装cidian包
install.packages("devtools")      #R的开发者工具
install.packages("stringi")       #强大的字符处理包
install.packages("pbapply")       #能够为*apply族函数增加进度条
install.packages("Rcpp")
install.packages("RcppProgress")  #Rcpp和RcppProgress让R直接调用外部的C++程序,增加运算速度
library(devtools)
install_github("qinwf/cidian")    #用来从github上安装R包的函数,“qinwf”应该是cidian的作者
library(cidian)

cidian包安装完后,下一步,需要自己到搜狗词库里下载想要的词库,如图:

点进去下载后,词库名为:杭州市城市信息精选.scel,把这个scel文件复制到getwd()路径里,我是放在默认的C盘用户文档里。

decode_scel(scel = "./杭州市城市信息精选.scel",cpp = TRUE)
output file: ./杭州市城市信息精选.scel_2018-04-19_00_57_55.dict
#转好后,查看生成的词典文件:
 scan(file="./杭州市城市信息精选.scel_2018-04-19_00_57_55.dict",
       what=character(),nlines=30,sep='\n',
       encoding='utf-8',fileEncoding='utf-8')
#Read 30 items,输出为:
 [1] "阿棒 n"         "阿宝 n"         "阿宝饭店 n"     "阿宝童装 n"    
 [5] "阿波罗 n"       "阿波罗酒店 n"   "阿初 n"         "阿迪达斯 n"    
 [9] "阿东饭店 n"     "阿芬 n"         "阿国饭店 n"     "阿拉丁 n"      
[13] "阿里山大酒店 n" "阿良饭店 n"     "阿龙造型 n"     "阿玛施 n"      
[17] "阿玛施服饰 n"   "阿曼尼 n"       "阿明网吧 n"     "阿潘老汤面 n"  
[21] "阿三饭店 n"     "阿汤面馆 n"     "阿伟 n"         "阿香婆 n"      
[25] "阿依莲 n"       "阿英煲 n"       "阿英川菜馆 n"   "爱得利 n"      
[29] "爱德医院 n"     "爱都 n"   

接下来,需要把这个想要的词典放到R的分词库里。用show_dictpath()函数查看默认词典位置。查看目前系统自带的词库:

dir(show_dictpath())
 [1] "backup.rda"      "hmm_model.utf8"  "hmm_model.zip"   "idf.utf8"       
 [5] "idf.zip"         "jieba.dict.utf8" "jieba.dict.zip"  "model.rda"      
 [9] "README.md"       "stop_words.utf8" "user.dict.utf8" 

词库对应的内容为:
jieba.dict.utf8, 系统词典文件,最大概率法,utf8编码的
hmm_model.utf8, 系统词典文件,隐式马尔科夫模型,utf8编码的
user.dict.utf8, 用户词典文件,utf8编码的
stop_words.utf8,停止词文件,utf8编码的
idf.utf8,IDF语料库,utf8编码的
jieba.dict.zip,jieba.dict.utf8的压缩包
hmm_model.zip,hmm_model.utf8的压缩包
idf.zip,idf.utf8的压缩包
backup.rda,无注释
model.rda,无注释
README.md,说明文件

重点来了,把搜狗词典文件改名,从杭州市城市信息精选.scel_2018-04-19_00_57_55.dict到user.dict.utf8,然后替换D:/R/R-3.4.4/library/jiebaRD/dict目录下面的user.dict.utf8。这样默认的用户词典,就是搜狗词典了,可以检验下新的user.dict.utf8:

scan(file="D:/R/R-3.4.4/library/jiebaRD/dict/user.dict.utf8",what=character(),nlines=30,sep='\n',encoding='utf-8',fileEncoding='utf-8')

三、 停用词过滤

停止词是分词过程中,我们不需要作为结果的词,比如:我、你、的、是,a,the,or,and等。这些词在统计词频的时候意义不大,且会增加噪音,需要对这些词进行过滤。在jiebaR中,过滤停止词有2种方法,一种是通过配置stop_word文件,另一种是使用filter_segment()函数。

1. 配置stop_word文件

先利用Notepad++编写一个名为stop_word.txt的文档,里面包含“的”、“和”。把stop_word.txt存入getwd()的路径里。再利用worker()函数调用:

#加载分词引擎,并配置停止词过滤
work = worker(stop_word="stop_word.txt")
guolv <- segment(juzi,work)
guolv
 [1] "杭州"     "四月"     "真"       "美丽"     "想到"     "西湖"    
 [7] "边"       "吹"       "吹风"     "灵峰"     "孤山"     "梅花"    
[13] "龙井八景" "桃花"     "太子湾"   "郁金香"   "白堤"     "间株"    
[19] "桃柳"     "八卦田"   "油菜花"   "美不胜收"
#禁用“的”,“和”后,运行结果里果然也没有这两个字了。

2. filter_segment()函数

在上面的过滤基础上,利用filter_segment()继续过滤掉“想到”、“边”两个词:

filter<-c("想到","边")
filter_segment(guolv,filter)
 [1] "杭州"     "四月"     "真"       "美丽"     "西湖"     "吹"      
 [7] "吹风"     "灵峰"     "孤山"     "梅花"     "龙井八景" "桃花"    
[13] "太子湾"   "郁金香"   "白堤"     "间株"     "桃柳"     "八卦田"  
[19] "油菜花"   "美不胜收"

四、关键词提取

前面讲了这么多,都是关于如何更好的进行分词。做好分词这一步,更核心的就是提取关键词。TF-IDF算法是提取关键词的经典算法。

TF(Term Frequenc),词频。一个词在文章中出现的次数越多,重要性也越大(过滤停用词)。
IDF(Inverse Document Frequency),逆文档频率。在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词("的"、"是")给予较小的权重,,较少见的词("太子湾"、"八卦田")给予较大的权重。这个权重叫做"逆文档频率",它的大小与一个词的常见程度成反比。jiebaR包中的idf.utf8文件,为IDF语料库,用来模拟语言的使用环境,计算好逆文档频率。

TF-TDF = 词频TF * 逆文档频率IDF

某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。
学习完原理后,可以着手实操一下了。先查看在安装目录中的IDF的语料库——idf.utf8文件。

scan(file="D:/R/R-3.4.4/library/jiebaRD/dict/idf.utf8",what=character(),nlines=20,sep='\n',encoding='utf-8',fileEncoding='utf-8')
#Read 20 items
 [1] "劳动防护 13.900677652"  "生化学 13.900677652"   
 [3] "奥萨贝尔 13.900677652"  "考察队员 13.900677652" 
 [5] "岗上 11.5027823792"     "倒车档 12.2912397395"  
 [7] "编译 9.21854642485"     "蝶泳 11.1926274509"    
 [9] "外委 11.8212361103"     "故作高深 11.9547675029"
[11] "尉遂成 13.2075304714"   "心源性 11.1926274509"  
[13] "现役军人 10.642581114"  "杜勃留 13.2075304714"  
[15] "包天笑 13.900677652"    "贾政陪 13.2075304714"  
[17] "托尔湾 13.900677652"    "多瓦 12.5143832909"    
[19] "多瓣 13.900677652"      "巴斯特尔 11.598092559" 

idf.utf8文件每一行有2列,第一列是词项,第二列为权重,即IDF值,如“生化学”是13.9。然后,计算文档词频(TF),用到freq()函数:

freq(guolv)
keys <- worker("keywords",topn=5)
vector_keywords(guolv,keys)
#vector_keywords(guolv,keys)
 11.8212  11.7392  11.7392  11.7392  11.7392 
  "灵峰" "太子湾"   "桃柳"   "间株" "八卦田" 

参考文献

  1. (R语言:jiebaR 包实现中文分词、统计词频及绘制词云图)[https://zhuanlan.zhihu.com/p/499935064]
  2. (R学习整理笔记(五)——用jiebaR包进行中文分词)[https://zhuanlan.zhihu.com/p/35846130]

标签:jiebaR,语言,utf8,dict,user,词库,数据挖掘,文本,分词
来源: https://www.cnblogs.com/haohai9309/p/16294660.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有