R语言文本数据挖掘(三)
文本分词,就是对文本进行合理的分割,从而可以比较快捷地获取关键信息。例如,电商平台要想了解更多消费者的心声,就需要对消费者的文本评论数据进行内在信息的数据挖掘分析,而文本分词是文本挖掘的重要步骤。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
juzi <- "杭州的四月真美丽,想到西湖边吹吹风。
灵峰和孤山的梅花,龙井八景的桃花,太子湾的郁金香,
白堤间株的桃柳,八卦田的油菜花,美不胜收。" #用juzi替代长句子
segment(juzi,work) #调用segment()函数分词
#运行结果
segment(juzi,work)
[1] "杭州" "的" "四月" "真" "美丽" "想到"
[7] "西湖" "边" "吹" "吹风" "灵峰" "和"
[13] "孤山" "的" "梅花" "龙井" "八景" "的"
[19] "桃花" "太子" "湾" "的" "郁金香" "白堤"
[25] "间株" "的" "桃柳" "八卦" "田" "的"
[31] "油菜花" "美不胜收"
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
#利用搜狗细胞词库在线提取转换工具转好后,查看生成的词典文件(22-05-21-11-01-39.jiebaR.user.txt):
scan(file="./22-05-21-11-01-39.jiebaR.user.txt",
what=character(),nlines=30,sep='\n',
encoding='utf-8',fileEncoding='utf-8')
#Read 30 items,输出为:
Read 30 items
[1] "阿六头 n" "啊没 n" "阿咪香 n" "阿太 n" "啊也 n"
[6] "阿姨夫 n" "阿英煲 n" "艾迪康 n" "爱杭州 n" "爱丽芬 n"
[11] "安安单单 n" "安耽 n" "安耽点 n" "暗咯咯 n" "安徽老 n"
[16] "安徽料理 n" "安吉 n" "安吉路 n" "安吉县 n" "暗落落 n"
[21] "安森 n" "岸上蓝山 n" "安职 n" "安之秀果 n" "奥比 n"
[26] "熬不牢 n" "奥达通 n" "奥菲 n" "奥好的 n" "奥康 n"
接下来,需要把这个想要的词典放到R的分词库里。用show_dictpath()函数查看默认词典位置。查看目前系统自带的词库:
dir(show_dictpath())
[1] "C:/Users/hao'hai/Documents/R/win-library/4.1/jiebaRD/dict"
[1] "backup.rda" "hmm_model.zip" "idf.zip" "jieba.dict.zip"
[5] "model.rda" "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的压缩包
重点来了,把搜狗词典文件改名,从22-05-21-11-01-39.jiebaR.user.txt内容复制到user.dict.utf8,然后替换C:/Users/hao'hai/Documents/R/win-library/4.1/jiebaRD/dict目录下面的user.dict.utf8。这样默认的用户词典,就是搜狗词典了,可以检验下新的user.dict.utf8:
scan(file="C:/Users/hao'hai/Documents/R/win-library/4.1/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="C:/Users/hao'hai/Documents/R/win-library/4.1/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
"灵峰" "杭州的" "太子湾" "八卦田" "桃柳"
参考文献
- (R语言:jiebaR 包实现中文分词、统计词频及绘制词云图)[https://zhuanlan.zhihu.com/p/499935064]
- (R学习整理笔记(五)——用jiebaR包进行中文分词)[https://zhuanlan.zhihu.com/p/35846130]
R语言文本数据挖掘(三)的更多相关文章
- R语言︱文本(字符串)处理与正则表达式
处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...
- R语言实战(三)基本图形与基本统计分析
本文对应<R语言实战>第6章:基本图形:第7章:基本统计分析 =============================================================== ...
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
- R语言数据管理(三):数据读入
R的数据读入非常灵活,即可以在R软件中直接输入,也可以读入外部数据. 一.直接输入数据 ①c()函数 ②scan()函数 其功能类似c()函数,scan()实际上是一种键盘输入数据函数.当输入scan ...
- R语言实战(三) 图形初阶
3.1 使用图形 plot:基础绘图 abline:添加回归直线 hist:绘制直方图 boxplot:绘制箱线图 dev.new():returns the return value of the ...
- 【R语言进行数据挖掘】回归分析
1.线性回归 线性回归就是使用下面的预测函数预测未来观测量: 其中,x1,x2,...,xk都是预测变量(影响预测的因素),y是需要预测的目标变量(被预测变量). 线性回归模型的数据来源于澳大利亚的C ...
- 【R语言进行数据挖掘】决策树和随机森林
1.使用包party建立决策树 这一节学习使用包party里面的函数ctree()为数据集iris建立一个决策树.属性Sepal.Length(萼片长度).Sepal.Width(萼片宽度).Peta ...
- [读书笔记] R语言实战 (三) 图形初阶
创建图形,保存图形,修改特征:标题,坐标轴,标签,颜色,线条,符号,文本标注. 1. 一个简单的例子 #输出到图形到pdf文件 pdf("mygrapg.pdf") attach( ...
- R语言实战(三)——模拟随机游走数据
一.模拟随机游走数据示例 x <- matrix(0,1000,1) for(i in 1:1000){ x[i+1] <- x[i]+rnorm(1) } plot(x,type=&qu ...
- R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:情感分析中对文本处理的数据的小技巧要 ...
随机推荐
- Arthas 查询服务器内存数据
1.打开Arthas所在位置 eg:/home 2.java -jar arthas-boot.jar 运行jar包 3.选择要执行的java jar包 eg : 1 4.执行查看命令vmtool - ...
- 消息队列 RocketMQ4.x介绍和新概念讲解
消息队列 RocketMQ4.x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件 RocketMQ4.x特点 支持Broker和Consumer端消 ...
- 三、JMeter实战-快速上手JMeter
1.JMeter基本操作 线JMeter最基本的操作有三个步骤: 先添加一个线程组. 添加HTTP请求. 添加查看结果树. 1.1.添加线程组 在测试计划下新建一个线程组 1.2.添加HTTP请求 在 ...
- 服务器端口对外开放(包括,mysql,django)
1.查看对外开放端口号,并开放端口 查看开放的端口 ,有两个命令 1.1.iptables -L -n (比较清晰明了) 1. 2.firewall-cmd --list-ports 1.3 .打开端 ...
- SQLServer 远程链接MySql数据库
第一步:安装MySQL odbc driver 在SQL SERVER所在主机上安装MYSQL ODBC Driver; 下载地址:http://dev.mysql.com/downloads/con ...
- 安装win10:我们无法创建新的分区,也无法定位现有分区
操作环境:win10企业版ISO,U盘安装,UEFI启动 解决思路:win10 UEFI 安装需要硬盘在GPT模式,如果直接创建分区默认的是MBR,所以将磁盘转换成GPT,再分配一个EFI空白分区,就 ...
- c/s winForm框架 tabpage标签切换窗体
/// <summary> /// 根据窗体Name打开窗体 /// </summary> /// <param name="name">< ...
- 2020/10/3笔记-网络概述、拓扑类型、OSI模型
网络(network) 1.什么是网络 计算机网络(简称为网络)由若干节点(node)和连接的链路组成.网络中的节点可以是计算机.集线器.交换机或路由器等. 2.网络的作用是什么 网络最终为了解决的问 ...
- python中and和or表达式的返回值
a or b 首先明确运算顺序, 从左至右 # 其次只要存在真就会返回真, and返回的是最后一个真, or返回的是第一个真 # 再次, a,b中存在假, 则and返回第一个假, or返回最后一个假 ...
- 编写简单的button配合input实现上传文件操作
<template> <button> 导入文件 <input type="file" @change="fileChange" ...