* 中文分词常用实现:
单机: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、基于规则(即字符串匹配,词库组织成字典树)
- 正向最大匹配:从左到右,"不知道|你|在|说什么"
- 反向最大匹配:从右到左词系统
中科院的ictclas应该是国内做得最好的中文分词系统了,例子使用的Rwordseg分词包就是基于ictclas算法实现,具体算法思路可在其官网贴出的相关论文学习到:(http://www.ictclas.org/)