zoukankan      html  css  js  c++  java
  • 中文分词实践(基于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这些包解压后放到RR-3.1.0library就可以 

    * R语言实现代码

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

    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/

  • 相关阅读:
    用socket方式传输Image和Sound文件
    maven常用构建命令
    文件大小转换成可显示的Mb,Gb和kb方法
    关于<img>标签与文字垂直居中
    socket编程---一个简单例子
    Java实现RC4加解密
    build path功能详解
    struts2中改变struts.xml默认路径
    OpenSessionInViewFilter 的配置及作用
    web.xml元素介绍
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6880401.html
Copyright © 2011-2022 走看看