专栏首页机器学习AI算法工程中文分词实践(基于R语言)

中文分词实践(基于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语言 实现 代码

  1. # 加载rJava、Rwordseg库
  2. library(rJava);
  3. library(Rwordseg);
  4. # == 读入数据
  5. lecture=read.csv("E:\\worldcup_test.txt",sep=",",header=TRUE,fileEncoding="UTF-8");
  6. # 查看前几行,看是否有字符编码问题
  7. head(lecture);
  8. # 获取数据集长度
  9. n=length(lecture[,1]);
  10. print(n)
  11. # == 文本预处理
  12. res=lecture[lecture!=" "];
  13. #剔除URL
  14. res=gsub(pattern="http:[a-zA-Z\\/\\.0-9]+","",res);
  15. #剔除特殊词
  16. res=gsub(pattern="[我|你|的|了|是]","",res);
  17. # == 分词+频数统计
  18. words=unlist(lapply(X=res, FUN=segmentCN));
  19. word=lapply(X=words, FUN=strsplit, " ");
  20. v=table(unlist(word));
  21. # 降序排序
  22. v=rev(sort(v));
  23. d=data.frame(word=names(v), freq=v);
  24. # 过滤掉1个字和词频小于100的记录
  25. d=subset(d, nchar(as.character(dword))>1 & dword))>1 & dfreq>=100)
  26. # == 输出结果
  27. write.csv(d, file="E:\\worldcup_keyword.txt", row.names=FALSE)

将文本信息存放在E:\\worldcup_test.txt中,运行后E:\\worldcup_keyword.txt就是保存了统计完的结果了.

* 常见问题:一些词没被识别 => 手动添加词库

只使用默认词库的分词效果不是很好,最主要问题就是一些球星名字没有被识别出来.

这种情况需要手动添加一些词库进来,一般使用Sougou词库,在Sougou输入法的工具箱里,有细胞词库一栏,点击后即可在其官网下载需要的词库。

除了使用网上的词库,也可以自己手动添加一些词进去,每个词一行写到.txt文件上,调用installDict()添加即可

  1. # == 添加新词库(跑一遍即可)
  2. installDict("D:\\Program Files\\R\\R-3.1.0\\libword\\myword.txt", dictname="myword")
  3. installDict("D:\\Program Files\\R\\R-3.1.0\\libword\\foodball.scel", dictname="foodball")
  4. # 显示当前手动添加的词库
  5. listDict()

手工添加完词库后,分词效果明显就上来了:

* 常见问题:文本存在乱码和特殊字符 => 脚本过滤

由于帖子属于UGC内容,一些乱码和特殊字符会影响R语言处理文本。比如read.cvs()读入文件读到乱码就返回了,没能读入全部文本。

这里没有深入去看R语言的字符处理方式,而是选择绕开这个问题,统一将utf8文本转成unicode,写了段Python根据中文的编码范围来过滤掉乱码(替换为" "):

* 常见问题:文本数据量过大 => 切分文件分批次计算、或使用Hadoop+Smallseg库

==================================================

* 中文分词基础

1、分词算法: a、基于规则(即字符串匹配,词库组织成字典树) - 正向最大匹配:从左到右,"不知道|你|在|说什么" - 反向最大匹配:从右到左,"不|知道|你在|说|什么" - 最短路径:切出来的词最少,"不知道|你在|说什么"(效果较好) b、基于词义(还不成熟) c、基于统计(概率论) 2、语料库(词库):来源于大量真实文本的加工和训练

* 中科院ictclas中文分词系统

中科院的ictclas应该是国内做得最好的中文分词系统了,例子使用的Rwordseg分词包就是基于ictclas算法实现,具体算法思路可在其官网贴出的相关论文学习到:( http://www.ictclas.org/

本文分享自微信公众号 - 大数据挖掘DT数据分析(datadw)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Twitter 数据分析师: 我们实际工作内容究竟是哪些

    今天就让我们走进 Twitter 的数据分析世界,看看科技公司对于一个数据分析师的要求是什么?他们的实际工作内容究竟是哪些? ...

    机器学习AI算法工程
  • 文本挖掘:手把手教你分析携程网评论数据

    作者:飘雪 http://www.itongji.cn/cms/article/articledetails?articleid=1114 中文文本挖掘包tm...

    机器学习AI算法工程
  • Twitter情感分析及其可视化

    主要是基于twitter的内容有: 实时热点话题检测 情感分析 结果可视化 Twitter数据挖掘平台的设计与实现 实时热点话题挖掘 Twitter的数据量是十...

    机器学习AI算法工程
  • LeetCode Weekly Contest 45解题思路

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • LeetCode 30 Substring with Concatenation of All Words

    ShenduCC
  • Qt编写自定义控件25-自定义QCustomPlot

    上次在写大屏数据可视化电子看板系统时候,提到过改造QCustomPlot来实现柱状分组图、横向柱状图、横向分组图、鼠标悬停提示等。这次单独列出来描述,有很多人疑...

    feiyangqingyun
  • 这才是面试官想听的:详解「递归」正确的打开方式

    递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。

    TTTEED
  • HDU 1010 Tempter of the Bone(dfs+剪枝)

           题意是问从S出发,终点为D,如果能刚好k步到达终点就输出YES,否则输出NO。如果直接深搜会超时,所以这里需要进行奇偶剪枝。

    Ch_Zaqdt
  • LeetCode 829. 连续整数求和(数学)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/consecutive-numbers-sum 著作...

    Michael阿明
  • UVA 10881 - Piotr's Ants【模拟+思维】

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券