lucene--5.支持中文分词

1      分析器

1.1.  分析器(Analyzer)的执行过程

如下图是语汇单元的生成过程:

  

从一个Reader字符流开始,创建一个基于Reader的Tokenizer分词器,经过三个TokenFilter生成语汇单元Tokens。

要看分析器的分析效果,只需要看Tokenstream中的内容就可以了。每个分析器都有一个方法tokenStream,返回一个tokenStream对象。

 

1.2.  分析器的分词效果(中文)

// 查看标准分析器的分词效果
   @Test
   public void testTokenStream() throws Exception {
      // 创建一个标准分析器对象
      Analyzer analyzer = new StandardAnalyzer();
      // 获得tokenStream对象
      // 第一个参数:域名,可以随便给一个
      // 第二个参数:要分析的文本内容
      TokenStream tokenStream = analyzer.tokenStream("test",
            "The Spring Framework provides a comprehensiveprogramming and configuration model.");
      // 添加一个引用,可以获得每个关键词
      CharTermAttribute charTermAttribute =tokenStream.addAttribute(CharTermAttribute.class);
      // 添加一个偏移量的引用,记录了关键词的开始位置以及结束位置
      OffsetAttribute offsetAttribute =tokenStream.addAttribute(OffsetAttribute.class);
      // 将指针调整到列表的头部
      tokenStream.reset();
      // 遍历关键词列表,通过incrementToken方法判断列表是否结束
      while (tokenStream.incrementToken()) {
         // 关键词的起始位置
         System.out.println("start->" + offsetAttribute.startOffset());
         // 取关键词
         System.out.println(charTermAttribute);
         // 结束位置
         System.out.println("end->" + offsetAttribute.endOffset());
      }
      tokenStream.close();
   }

2      中文分析器

2.1    Lucene自带中文分词器

l StandardAnalyzer:

单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”,
效果:“我”、“爱”、“中”、“国”。

 

l CJKAnalyzer

二分法分词:按两个字进行切分。如:“我是中国人”,效果:“我是”、“是中”、“中国”“国人”。

 

上边两个分词器无法满足需求。

l SmartChineseAnalyzer

对中文支持较好,但扩展性差,扩展词库,禁用词库和同义词库等不好处理

 

2.2    第三方中文分析器

·  paoding: 庖丁解牛最新版在 https://code.google.com/p/paoding/ 中最多支持Lucene 3.0,且最新提交的代码在 2008-06-03,在svn中最新也是2010年提交,已经过时,不予考虑。

·  mmseg4j:最新版已从 https://code.google.com/p/mmseg4j/ 移至 https://github.com/chenlb/mmseg4j-solr,支持Lucene 4.10,且在github中最新提交代码是2014年6月,从09年~14年一共有:18个版本,也就是一年几乎有3个大小版本,有较大的活跃度,用了mmseg算法。

·  IK-analyzer: 最新版在https://code.google.com/p/ik-analyzer/上,支持Lucene 4.10从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。 但是也就是2012年12月后没有在更新。

·  ansj_seg:最新版本在 https://github.com/NLPchina/ansj_seg tags仅有1.1版本,从2012年到2014年更新了大小6次,但是作者本人在2014年10月10日说明:“可能我以后没有精力来维护ansj_seg了”,现在由”nlp_china”管理。2014年11月有更新。并未说明是否支持Lucene,是一个由CRF(条件随机场)算法所做的分词算法。

·  imdict-chinese-analyzer:最新版在 https://code.google.com/p/imdict-chinese-analyzer/ ,最新更新也在2009年5月,下载源码,不支持Lucene 4.10 。是利用HMM(隐马尔科夫链)算法。

·  Jcseg:最新版本在git.oschina.net/lionsoul/jcseg,支持Lucene 4.10,作者有较高的活跃度。利用mmseg算法。

2.3    IKAnalyzer

2.3.1  使用

使用方法:

第一步:把jar包添加到工程中

 

第二步:把配置文件和扩展词典和停用词词典添加到classpath下

注意:mydict.dic和ext_stopword.dic文件的格式为UTF-8,注意是无BOM的UTF-8 编码。

 

2.3.2  示列

 

// 查看标准分析器的分词效果
@Test
public void testTokenStream() throws Exception {
   // 创建一个标准分析器对象
   Analyzer analyzer = new IKAnalyzer();
   // 获得tokenStream对象
   // 第一个参数:域名,可以随便给一个
   // 第二个参数:要分析的文本内容
   TokenStream tokenStream = analyzer.tokenStream("test",
         "高富帅可以用二维表结构来逻辑表达实现的数据");
   // 添加一个引用,可以获得每个关键词
   CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
   // 添加一个偏移量的引用,记录了关键词的开始位置以及结束位置
   OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
   // 将指针调整到列表的头部
   tokenStream.reset();
   // 遍历关键词列表,通过incrementToken方法判断列表是否结束
   while (tokenStream.incrementToken()) {
      // 关键词的起始位置
      System.out.println("start->" + offsetAttribute.startOffset());
      // 取关键词
      System.out.println(charTermAttribute);
      // 结束位置
      System.out.println("end->" + offsetAttribute.endOffset());
   }
   tokenStream.close();
}

3      Analyzer使用时机

3.1    索引时使用Analyzer

         输入关键字进行搜索,当需要让该关键字与文档域内容所包含的词进行匹配时需要对文档域内容进行分析,需要经过Analyzer分析器处理生成语汇单元(Token)。分析器分析的对象是文档中的Field域。当Field的属性tokenized(是否分词)为true时会对Field值进行分析,如下图:

 

对于一些Field可以不用分析:

1、不作为查询条件的内容,比如文件路径

2、不是匹配内容中的词而匹配Field的整体内容,比如订单号、身份证号等。

 

3.2    搜索时使用Analyzer

         对搜索关键字进行分析和索引分析一样,使用Analyzer对搜索关键字进行分析、分词处理,使用分析后每个词语进行搜索。比如:搜索关键字:spring web ,经过分析器进行分词,得出:spring  web拿词去索引词典表查找 ,找到索引链接到Document,解析Document内容。

         对于匹配整体Field域的查询可以在搜索时不分析,比如根据订单号、身份证号查询等。

 

         注意:搜索使用的分析器要和索引使用的分析器一致。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值