一、前言

之前做solr索引的时候就使用了ANSJ进行中文分词,用着挺好,然而当时没有写博客记录的习惯。最近又尝试了好几种JAVA下的中文分词库,个人感觉还是ANSJ好用,在这里简单总结之。

二、什么是中文分词

百度百科对其定义如下:

中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。

简单说来。比如说小明和服务生小黄相爱了,这句简单的话我们一看就明白,这说的是两个人打架了,但是对于计算机来说他根本不明白你在说什么,即使你将中文所有词语库告诉电脑,它也不知道到底是小明和小黄的爱情故事还是小明和和服诱惑的故事。这就是中文分词。

关于中文分词的深层理论等,我就不在此讲述了,我本身也对此块理论没有深入的领会,直接来讲述ANSJ的使用。

三、ANSJ中文分词

3.1 ANSJ简介

其Github地址为https://github.com/NLPchina/ansj_seg。其中有对其简单介绍:

这是一个基于n-Gram+CRF+HMM的中文分词的java实现.

分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上

目前实现了.中文分词. 中文姓名识别 . 用户自定义词典,关键字提取,自动摘要,关键字标记等功能

可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目.

3.2 ANSJ安装

最简单的方式是下载jar包,直接导入项目中,在Github上都有详细介绍。在这里需要说明的是请下载其各种词库(library文件夹),然后直接将该文件夹拷贝到项目的根目录下。这样项目启动的时候就会自动加载词库。https://github.com/NLPchina/ansj_seg/wiki/在上述项目WIKI中也详细讲述了ANSJ的理论及使用方法等。

3.3 ANSJ使用

  1. 分词方式

ANSJ提供了多种分词方式,如下:

System.out.println("BASE");
System.out.println(BaseAnalysis.parse(str));
System.out.println("TO");
System.out.println(ToAnalysis.parse(str));
System.out.println("DIC");
System.out.println(DicAnalysis.parse(str));
System.out.println("INDEX");
System.out.println(IndexAnalysis.parse(str));
System.out.println("NLP");
System.out.println(NlpAnalysis.parse(str));

https://github.com/NLPchina/ansj_seg/wiki/%E5%88%86%E8%AF%8D%E6%96%B9%E5%BC%8F中详细介绍了以上几种分词方式。我对比了ANSJ提供的上述几种分词方式,发现ToAnalysis的方式最好,速度最快,分词效果也很好,所以建议大家直接使用此种分词方式,当然如果你有其他特殊需求也可以测试另外几种分词方式。

当然我在这里要讲述的是词典部分。如果你的业务逻辑很清楚,如某个词语在你的系统中是特殊含义,那么你可以直接将其加到ambiguity.dic文件中。格式如下:

邓颖超  nr  生前    t
习大大 nr

即碰到“习大大”或“邓颖超生前”的时候都按照这种方式进行分词,并且该词的属性就为后面的字母。但是实际中我发现如果default.dic中有此词,ambiguity.dic再添加的话会不起作用,将default.dic中的该词删除即可。

当然如果业务逻辑不是那么明确,也可以在default.dic中添加分词规则,方式如下:

重要    a   37557

此处每行只能添加一个词,第一个为词语,第二个为该词的属性,第三个表示权重,即权重越大,越有可能按照此种方式进行分词。

  1. 关键词提取

使用方式如下:

System.out.println("关键词提取");
KeyWordComputer kwc = new KeyWordComputer(5);
Collection<Keyword> result = kwc.computeArticleTfidf(str);
System.out.println(result);

或者如WIKI中给出标题:

KeyWordComputer kwc = new KeyWordComputer(5);
String title = "维基解密否认斯诺登接受委内瑞拉庇护";
String content = "有俄罗斯国会议员,9号在社交网站推特表示,美国中情局前雇员斯诺登,已经接受委内瑞拉的庇护,不过推文在发布几分钟后随即删除。俄罗斯当局拒绝发表评论,而一直协助斯诺登的维基解密否认他将投靠委内瑞拉。  俄罗斯国会国际事务委员会主席普什科夫,在个人推特率先披露斯诺登已接受委内瑞拉的庇护建议,令外界以为斯诺登的动向终于有新进展。  不过推文在几分钟内旋即被删除,普什科夫澄清他是看到俄罗斯国营电视台的新闻才这样说,而电视台已经作出否认,称普什科夫是误解了新闻内容。  委内瑞拉驻莫斯科大使馆、俄罗斯总统府发言人、以及外交部都拒绝发表评论。而维基解密就否认斯诺登已正式接受委内瑞拉的庇护,说会在适当时间公布有关决定。  斯诺登相信目前还在莫斯科谢列梅捷沃机场,已滞留两个多星期。他早前向约20个国家提交庇护申请,委内瑞拉、尼加拉瓜和玻利维亚,先后表示答应,不过斯诺登还没作出决定。  而另一场外交风波,玻利维亚总统莫拉莱斯的专机上星期被欧洲多国以怀疑斯诺登在机上为由拒绝过境事件,涉事国家之一的西班牙突然转口风,外长马加略]号表示愿意就任何误解致歉,但强调当时当局没有关闭领空或不许专机降落。";
Collection<Keyword> result = kwc.computeArticleTfidf(title, content);
System.out.println(result);

实际测试两种方式都能达到很好的提取关键词效果,如果有做关键词云的需求可以考虑。

  1. 自定义分词规则

如果有提取邮箱等分词规则,可以自定义一个Recognition继承Recognition即可。方式如下:

public class RdzaRecognition implements Recognition {
private static final long serialVersionUID = -32133440735240290L;
private static final Nature NATURE = new Nature("rdza"); @Override
public void recognition(Result result) { List<Term> terms = result.getTerms(); for (Term term : terms) {
String regExp = "rd[z|a]a";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(term.getName());
if (m.matches()) {
term.setNature(NATURE);
}
} for (Iterator<Term> iterator = terms.iterator(); iterator.hasNext(); ) {
Term term = iterator.next();
if (term.getName() == null) {
iterator.remove();
}
}
}
}

其实现的是将rdza或者rdaa设置为rdaa属性。实现起来很简单,主要是正则表达式,需要自定义匹配规则即可。

调用方式如下:

ToAnalysis.parse(str).recognition(new RdzaRecognition());

即将默认分词的结果再使用上述规则进行分词。

四、总结

本文简单介绍了ANSJ中文分词的使用方法,以后有更详细的使用经验,会直接补充到这里。分享是一种美德。

ANSJ中文分词使用方法的更多相关文章

  1. Solr整合Ansj中文分词器

    Ansj的使用和相关资料下载参考:http://iamyida.iteye.com/blog/2220833 参考 http://www.cnblogs.com/luxh/p/5016894.html ...

  2. R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...

  3. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  4. elasticsearch教程--中文分词器作用和使用

    概述   本文都是基于elasticsearch安装教程 中的elasticsearch安装目录(/opt/environment/elasticsearch-6.4.0)为范例 环境准备 ·全新最小 ...

  5. 中文分词实践(基于R语言)

    背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来.然后做中文分词+词频统计,最后将统计结果简单做个标签云.效果例如以下: 兴许:中文分词是中文信息处理的基础.分词之后.事 ...

  6. 11大Java开源中文分词器的使用方法和分词效果对比

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  7. 开源中文分词工具探析(三):Ansj

    Ansj是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型(可参考我之前写的文章):在Bigram分词的基础上,识别未登录词,以提高 ...

  8. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  9. NLPIR(北理工张华平版中文分词系统)的SDK(C++)调用方法

    一.本文内容简介 二.具体内容 1. 中文分词的基本概念 2.关于NLPIR(北理工张华平版中文分词系统)的基本情况 3.具体SDK模块(C++)的组装方式 ①准备内容: ②开始组装 三.注意事项 一 ...

随机推荐

  1. python+robot framework接口自动化测试

    python+requests实现接口的请求前篇已经介绍,还有不懂或者疑问的可以访问 python+request接口自动化框架 目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出,通过关键字的 ...

  2. 通过取父级for循环的i来理解闭包,iife,匿名函数

    在使用for循环的时候,假如需要在循环体中添加一个匿名函数处理其他的事情,那么,在这个匿名函数内,如果需要用到对应的i,因为闭包的缘故,循环体循环结束后才返回i,所以i最终为最后一次++的数值.   ...

  3. 关于开发环境中的消息在download时没有下载下来时的问题

    业务场景:在开发环境改了一些代码,现在需要将这些代码(包括class和数据库对象)移植到开发环境,整理出了Objectlist(就是该模块定义了哪些数据库对象),然后上传到FTP服务器上时,再执行do ...

  4. C#研究OpenXML之路(2-DocumentFormat.OpenXml命名空间)

    一.OpenXML对象结构预览 昨天感受了一下OpenXML的编程,今天开始准备一头扎进OpenXML了.在了解一门新的知识前,首先最重要的是理清逻辑结构,否则学习起来会感觉摸不着北. 1.首先打开V ...

  5. 提高 webpack 构建 Vue 项目的速度

    前言 最近有人给我的 Vue2 后台管理系统解决方案 提了 issue ,说执行 npm run build 构建项目的时候极其慢,然后就引起我的注意了.在项目中,引入了比较多的第三方库,导致项目大, ...

  6. 使用FSharp 探索Dotnet图像处理功能2--均衡灰度

    重新捡起大学里的图像处理,好像之前什么都没学到,但是我为什么还留着这本书呢?嘿嘿. 看到均衡灰度处理,上来就是积分,概率分布的公式,头微微的有点疼.网上看了点介绍,隔天再拿起书本,总算有了点眉目.简而 ...

  7. MySQL学习笔记(一)—数据库基础

    一.数据库概述 1.数据库的组织结构      (1)数据库就是用来存放信息的仓库.      (2)数据库里的数据集合都存放在数据表(table)里.      (3)数据表由数据行(row)和数据 ...

  8. centos7安装nagios步骤

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  9. 树状数组 && 线段树

    树状数组 支持单点修改 #include <cstdio> using namespace std; int n, m; ], c[]; int lowbit(int x) { retur ...

  10. 大麦盒子(domybox)无法进入系统解决方案!【简单几步】

    大麦无法进入系统解决方案![简单几步]前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络! 前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由 ...