分词器概念介绍:

Analyzer类(分词器)就是把一段文本中的词按某些规则取出,提供和以后查询时使用的工具类,注意在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果

分词器工作流程:

1, 切分关键词

2, 去除停用词

3, 对于英文单词,把所有字母转为小写(搜索时不区分大小写)

停用词:

  有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的“的、了、着、是”,以及各种标点符号等。文本经过分词之后,停用词通常被过滤掉,不会被进行索引这样的词称为停用词(stop word)。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度,减小索引库文件的大小。

常用的中文分词器

  中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在“帽子和服装”中,“和服”就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。

单字分词:就是按照中文一个字一个字地进行分词。如:“我们是中国人”,
效果:“我”、“们”、“是”、“中”、“国”、“人”。(StandardAnalyzer就是这样)。

  二分法分词:按两个字进行切分。如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。

  词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:“我们是中国人”,效果为:“我们”、“中国人”。(使用极易分词的MMAnalyzer。可以使用“极易分词”,或者是“庖丁分词”分词器、IKAnalyzer)。

中文分词器使用IKAnalyzer,主页:http://www.oschina.net/p/ikanalyzer

实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。具体的使用方式参见其文档。

注意:扩展的词库与停止词文件要是UTF-8的编码,并且在要文件头部加一空行。

各种分词器测试

需要添加 lucene-analyzers-3.0.0.jar

// 不同的分词器,中文代码测试
public void testAnalyzer(Analyzer analyzer, String text) throws Exception {
System.out.println("当前使用的分词器:" + analyzer.getClass().getSimpleName());
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));
tokenStream.addAttribute(TermAttribute.class);
while (tokenStream.incrementToken()) {
TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);
System.out.println(termAttribute.term());
}
System.out.println();
} 测试代码如下:
@Test
public void testAnalyzer()throws Exception{
helloWorld.testAnalyzer(new SimpleAnalyzer(),"钓鱼岛是中国的");
helloWorld.testAnalyzer(new StandardAnalyzer(Version.LUCENE_30),"钓鱼岛是中国的");
helloWorld.testAnalyzer(new CJKAnalyzer(Version.LUCENE_30),"钓鱼岛是中国的");
}

测试结果

IK Analyzer 3.X介绍

IK Analyzer 是一个开源的,基于 java诧言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 3 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的 IK Analyzer 3.X 则发展为面吐 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对Lucene的默认优化实现。

GoogleCode开源项目  :http://code.google.com/p/ik-analyzer/

GoogleCode SVN下载:http://ik-analyzer.googlecode.com/svn/trunk/

IK Analyzer 3.X的使用

@Test
public void testAnalyzer()throws Exception{
// false 细粒度切分
helloWorld.testAnalyzer(new IKAnalyzer(false),"钓鱼岛是中国的");
// true 最大词长切分
helloWorld.testAnalyzer(new IKAnalyzer(true),"钓鱼岛是中国的");
}

基于配置的词典扩充

1. IK 分词器还支持通过配置 IKAnalyzer.cfg.xml 文件来扩充您的与有词典以及停止词典(过滤词典) UTF-8格式

2. 部署IKAnalyzer.cfg.xml ,IKAnalyzer.cfg.xml 部 署 在 代 码 根 目 录 下 ( 对 于 web 项 目,通 常 是WEB-INF/classes 目录)同 hibernate、log4j 等配置文件相同。

3. IKAnalyzer.cfg.xml配置如下:

其中/mydict.dic用来配置扩展词典, 而/ext_stopword.dic 用来配置停用词典,配置后细粒度和最大词拆分如下:

排序:

1. 相关度得分是在查询时根据查询条件实进计算出来的

2. 设置按指定的字段排序.(注意,如果设置了指定的字段排序. 相关度排序则无效)

如果需要配置文件或者 代码jar包的可以留言 我发给大家

lucene的分词器宝典的更多相关文章

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

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

  2. (五)Lucene——中文分词器

    1. 什么是中文分词器 对于英文,是安装空格.标点符号进行分词 对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词. 比如:“我的中国人”,分词:我.的.中国.中国人.国人. 2 ...

  3. Lucene的中文分词器IKAnalyzer

    分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Ana ...

  4. Apache Lucene(全文检索引擎)—分词器

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...

  5. 【原创】Lucene.Net+盘古分词器(详细介绍)

    本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4.结束语(Demo下载) Lucene.Net简介 Lucene.net是Lucene的.net移 ...

  6. lucene分词器与搜索

    一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...

  7. Lucene.Net+盘古分词器(详细介绍)(转)

    出处:http://www.cnblogs.com/magicchaiy/archive/2013/06/07/LuceneNet%E7%9B%98%E5%8F%A4%E5%88%86%E8%AF%8 ...

  8. lucene定义自己的分词器将其分成单个字符

    问题描写叙述:将一句话拆分成单个字符.而且去掉空格. package com.mylucene; import java.io.IOException; import java.io.Reader; ...

  9. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

随机推荐

  1. 10张Gif动图让你弄懂递归等概念

    图像(包括动图)是传递信息的一种高效方式,往往能增强表象.记忆与思维等方面的反应强度.所谓一图胜千言,说的就是这个道理. 今天为大家整理了十张动图GIFS,有助于认识循环.递归.二分检索等概念的具体运 ...

  2. PAT 1036 Boys vs Girls[简单]

    1036 Boys vs Girls (25 分) This time you are asked to tell the difference between the lowest grade of ...

  3. std::bind

    参考资料 • cplusplus.com:http://www.cplusplus.com/reference/functional/bind/ • cppreference.com:http://e ...

  4. 关于/proc/进程idpid/fd ,根据fd来查找连接

    当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽 ...

  5. @Transactional(rollbackFor=Exception.class)的使用

    转载: java阿里巴巴规范提示:方法[edit]需要在Transactional注解指定rollbackFor或者在方法中显示的rollback. 先来看看异常的分类 error是一定会回滚的 这里 ...

  6. Maven详解(转)

    原文出自: http://www.cnblogs.com/hongwz/p/5456578.html http://ifeve.com/maven-1/ Maven介绍: Maven是一个强大的Jav ...

  7. 【转】html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  8. 论文笔记:IRGAN——A Minimax Game for Unifying Generative and Discriminative Information

    2017 SIGIR 简单介绍 IRGAN将GAN用在信息检索(Information Retrieval)领域,通过GAN的思想将生成检索模型和判别检索模型统一起来,对于生成器采用了基于策略梯度的强 ...

  9. c++之旅:模板库中的容器

    容器 C++中的容器包括array, vector, list,map,set 数组 array不可变长,创建时其大小就固定了,array中可以存储各种数据类型包括对象,不过array是在栈上分配的, ...

  10. 简单封装get和jsonp

    /** * 向服务器发送GET请求. *  * @param {type} url * @param {type} async 是否异步调用 * @param {type} fnCallback 回调 ...