中文分词实践(基于R语言)
背景:分析用户在世界杯期间讨论最多的话题。
思路:把用户关于世界杯的帖子拉下来。然后做中文分词+词频统计,最后将统计结果简单做个标签云。效果例如以下:
兴许:中文分词是中文信息处理的基础。分词之后。事实上还有特别多有趣的文本挖掘工作能够做。也是个知识发现的过程,以后有机会再学习下。
==================================================
* 中文分词经常使用实现:
单机:R语言+Rwordseg分词包 (建议数据量<1G)
分布式:Hadoop+Smallseg库
词库:Sougou词库,Sougou输入法官网可下载
这里仅仅先介绍单机的实现:
1、R语言:专门用于统计分析、画图的语言
2、Rwordseg分词包:引用了@ansj开发的ansj中文分词工具,基于中科院的ictclas中文分词算法,不管是精确度还是执行效率都超过了rmmseg4j。
* 环境准备 (Windows或Linux版本号都行):
R下载:http://mirrors.ustc.edu.cn/CRAN/
Rwordseg包下载:https://r-forge.r-project.org/R/?group_id=1054
rJava包下载:http://cran.r-project.org/web/packages/rJava/index.html
Rwordseg和rJava这些包解压后放到\R\R-3.1.0\library就可以
* R语言实现代码
- # 载入rJava、Rwordseg库
- library(rJava);
- library(Rwordseg);
- # == 读入数据
- lecture=read.csv("E:\\worldcup_test.txt",sep=",",header=TRUE,fileEncoding="UTF-8");
- # 查看前几行,看是否有字符编码问题
- head(lecture);
- # 获取数据集长度
- n=length(lecture[,1]);
- print(n)
- # == 文本预处理
- res=lecture[lecture!=" "];
- #剔除URL
- res=gsub(pattern="http:[a-zA-Z\\/\\.0-9]+","",res);
- #剔除特殊词
- res=gsub(pattern="[我|你|的|了|是]","",res);
- # == 分词+频数统计
- words=unlist(lapply(X=res, FUN=segmentCN));
- word=lapply(X=words, FUN=strsplit, " ");
- v=table(unlist(word));
- # 降序排序
- v=rev(sort(v));
- d=data.frame(word=names(v), freq=v);
- # 过滤掉1个字和词频小于100的记录
- d=subset(d, nchar(as.character(d$word))>1 & d$freq>=100)
- # == 输出结果
- write.csv(d, file="E:\\worldcup_keyword.txt", row.names=FALSE)
将文本信息存放在E:\\worldcup_test.txt中,执行后E:\\worldcup_keyword.txt就是保存了统计完的结果了,截图例如以下:word列是词、freq列是词频
* 常见问题:一些词没被识别 => 手动加入词库
仅仅使用默认词库的分词效果不是非常好。最主要问题就是一些球星名字没有被识别出来,例如以下图:
这样的情况须要手动加入一些词库进来。一般使用Sougou词库,在Sougou输入法的工具箱里,有细胞词库一栏。点击后就可以在其官网下载须要的词库。
除了使用网上的词库,也能够自己手动加入一些词进去。每一个词一行写到.txt文件上,调用installDict()加入就可以
- # == 加入新词库(跑一遍就可以)
- installDict("D:\\Program Files\\R\\R-3.1.0\\libword\\myword.txt", dictname="myword")
- installDict("D:\\Program Files\\R\\R-3.1.0\\libword\\foodball.scel", dictname="foodball")
- # 显示当前手动加入的词库
- listDict()
手工加入完词库后,分词效果明显就上来了:
* 常见问题:文本存在乱码和特殊字符 => 脚本过滤
因为帖子属于UGC内容,一些乱码和特殊字符会影响R语言处理文本。比方read.cvs()读入文件读到乱码就返回了,没能读入所有文本。
这里没有深入去看R语言的字符处理方式,而是选择绕开这个问题,统一将utf8文本转成unicode,写了段Python依据中文的编码范围来过滤掉乱码(替换为" "):
* 常见问题:文本数据量过大 => 切分文件分批次计算、或使用Hadoop+Smallseg库
==================================================
* 中文分词基础
1、分词算法:
a、基于规则(即字符串匹配,词库组织成字典树)
- 正向最大匹配:从左到右。"不知道|你|在|说什么"
- 反向最大匹配:从右到左,"不|知道|你在|说|什么"
- 最短路径:切出来的词最少,"不知道|你在|说什么"(效果较好)
b、基于词义(还不成熟)
c、基于统计(概率论)
2、语料库(词库):来源于大量真实文本的加工和训练
* 中科院ictclas中文分词系统
中科院的ictclas应该是国内做得最好的中文分词系统了,样例使用的Rwordseg分词包就是基于ictclas算法实现。详细算法思路可在其官网贴出的相关论文学习到:(http://www.ictclas.org/)
中文分词实践(基于R语言)的更多相关文章
- 概率图模型 基于R语言 这本书中的第一个R语言程序
概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...
- 基于R语言的时间序列指数模型
时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...
- 基于R语言的ARIMA模型
A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...
- Twitter基于R语言的时序数据突变检测(BreakoutDetection)
Twitter开源的时序数据突变检测(BreakoutDetection),基于无参的E-Divisive with Medians (EDM)算法,比传统的E-Divisive算法快3.5倍以上,并 ...
- 基于R语言的结构方程:lavaan简明教程 [中文翻译版]
lavaan简明教程 [中文翻译版] 译者注:此文档原作者为比利时Ghent大学的Yves Rosseel博士,lavaan亦为其开发,完全开源.免费.我在学习的时候顺手翻译了一下,向Yves的开源精 ...
- 中文分词实战——基于jieba动态加载字典和调整词频的电子病历分词
分词是自然语言处理中最基本的一个任务,这篇小文章不介绍相关的理论,而是介绍一个电子病历分词的小实践. 开源的分词工具中,我用过的有jieba.hnlp和stanfordnlp,感觉jieba无论安装和 ...
- NLP系列-中文分词(基于词典)
中文分词概述 词是最小的能够独立活动的有意义的语言成分,一般分词是自然语言处理的第一项核心技术.英文中每个句子都将词用空格或标点符号分隔开来,而在中文中很难对词的边界进行界定,难以将词划分出来.在汉语 ...
- 基于R语言的航空公司客户价值分析
分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...
- 【转】基于R语言构建的电影评分预测模型
一,前提准备 1.R语言包:ggplot2包(绘图),recommenderlab包,reshape包(数据处理) 2.获取数据:大家可以在明尼苏达州大学的社会化计算研 ...
随机推荐
- Java IO(四--字符流基本使用
在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...
- vue工程化之项目引入jquery
既然写项目,那么少不了用jq,那我们就引入进来吧 1.因为已经安装了vue脚手架,所以需要在webpack中全局引入jquery 打开package.json文件,在里面加入这行代码,jquery后面 ...
- hdfs深入:03、hdfs的架构以及副本机制和block块存储
HDFS分布式文件系统设计目标 1. 硬件错误 由于集群很多时候由数量众多的廉价机组成,使得硬件错误成为常态 2. 数据流访问 所有应用以流的方式访问数 ...
- Python学习-列表的修改,删除操作
列表的修改操作 列表中的许多操作和字符串中有许多的相同点,因为列表是一个有顺序可变的元素集合,所以在列表中可以进行增加,删除,修改,查找的操作. 列表的修改操作: 如果你想单个修改列表中的某一个元素, ...
- Tomcat:Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
可能原因一: 在本地tomcat启动正常并且访问正常的项目放在服务器上tomcat报以上错误. 本地tomcat为7.0.68,服务器上为7.0.86 错误原因:服务器tomcat版本过高. 解决办法 ...
- Centos7 64bit Linux系统安装SVN 和 http访问配置
第一步,更新源,并通过yum下载安装svn [root@virde ~]# yum update [root@virde ~]# yum -y install subversion 安装过程中,全部选 ...
- MySQL主从复制遇到的问题
show slave status\G时,io显示:Slave_IO_State: Connecting 1.检查网络是否畅通,方法:ping主机ip.主机通畅. 2.检查复制用户的账号密码是否正确. ...
- NOI模拟(3.6)Assignment
Description 随机生成一个长度为m且每个元素都为1~n之间的整数的单调不下降序列~(即序列的(i>1)都不小于),(随机生成指每一种可能的序列都等概率被生成).请问这个序列的众数出现次 ...
- xtu summer individual 6 E - Find Metal Mineral
Find Metal Mineral Time Limit: 1000ms Memory Limit: 65768KB This problem will be judged on HDU. Orig ...
- nyoj 96 n-1位数(处理前导 0 的情况)(string)
n-1位数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则 ...