分享

基于lucene的案例开发6:分词器介绍

本帖最后由 nettman 于 2015-4-16 22:41 编辑

问题导读

1.StandardAnalyzer有什么优点和缺点?
2.基于Lucene的第三方中文分词是什么技术?
3.IKAnalyzer分词技术有什么缺点?
4.你使用过哪些分词技术?





接上篇
基于lucene的案例开发5:搜索索引



  在lucene创建索引的过程中,数据信息的处理是一个十分重要的过程,在这一过程中,主要的部分就是这一篇博客的主题:分词器。在下面简单的demo中,介绍了7中比较常见的分词技术,即:CJKAnalyzer、KeywordAnalyzer、SimpleAnalyzer、StopAnalyzer、WhitespaceAnalyzer、StandardAnalyzer、IKAnalyzer;自己可以通过注释的形式一一验证。源程序如下:

Analyzer分词demo

  1. /**   
  2. *@Description:    分词技术demo
  3. */   
  4. package com.lulei.lucene.study;   
  5.   
  6. import java.io.StringReader;  
  7.   
  8. import org.apache.lucene.analysis.Analyzer;  
  9. import org.apache.lucene.analysis.TokenStream;  
  10. import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
  11. import org.apache.lucene.analysis.core.KeywordAnalyzer;  
  12. import org.apache.lucene.analysis.core.SimpleAnalyzer;  
  13. import org.apache.lucene.analysis.core.StopAnalyzer;  
  14. import org.apache.lucene.analysis.core.WhitespaceAnalyzer;  
  15. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  16. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  17. import org.apache.lucene.util.Version;  
  18. import org.wltea.analyzer.lucene.IKAnalyzer;  
  19.    
  20. public class AnalyzerStudy {  
  21.   
  22.     public static void main(String[] args) throws Exception {  
  23.         //需要处理的测试字符串  
  24.         String str = "这是一个分词器测试程序,希望大家继续关注我的个人系列博客:基于Lucene的案例开发,这里加一点带空格的标签 LUCENE java 分词器";  
  25.         Analyzer analyzer = null;  
  26.         //标准分词器,如果用来处理中文,和ChineseAnalyzer有一样的效果,这也许就是之后的版本弃用ChineseAnalyzer的一个原因  
  27.         analyzer = new StandardAnalyzer(Version.LUCENE_43);  
  28.         //第三方中文分词器,有下面2中构造方法。  
  29.         analyzer = new IKAnalyzer();  
  30.         analyzer = new IKAnalyzer(false);  
  31.         analyzer = new IKAnalyzer(true);  
  32.         //空格分词器,对字符串不做如何处理  
  33.         analyzer = new WhitespaceAnalyzer(Version.LUCENE_43);  
  34.         //简单分词器,一段一段话进行分词  
  35.         analyzer = new SimpleAnalyzer(Version.LUCENE_43);  
  36.         //二分法分词器,这个分词方式是正向退一分词(二分法分词),同一个字会和它的左边和右边组合成一个次,每个人出现两次,除了首字和末字  
  37.         analyzer = new CJKAnalyzer(Version.LUCENE_43);  
  38.         //关键字分词器,把处理的字符串当作一个整体  
  39.         analyzer = new KeywordAnalyzer();  
  40.         //被忽略的词分词器  
  41.         analyzer = new StopAnalyzer(Version.LUCENE_43);  
  42.          
  43.         //使用分词器处理测试字符串  
  44.         StringReader reader = new StringReader(str);  
  45.         TokenStream  tokenStream  = analyzer.tokenStream("", reader);  
  46.         tokenStream.reset();  
  47.         CharTermAttribute  term = tokenStream.getAttribute(CharTermAttribute.class);  
  48.         int l = 0;  
  49.         //输出分词器和处理结果  
  50.         System.out.println(analyzer.getClass());  
  51.         while(tokenStream.incrementToken()){   
  52.             System.out.print(term.toString() + "|");  
  53.             l += term.toString().length();  
  54.             //如果一行输出的字数大于30,就换行输出  
  55.             if (l > 30) {  
  56.                 System.out.println();  
  57.                 l = 0;  
  58.             }  
  59.         }   
  60.     }  
  61. }  
复制代码


注:上述程序对analyzer进行了9次赋值,自己可以通过一一注解的形式查看每一种分词技术的分词效果。

分词器介绍
       下面将会对这些分词器做一些简单的介绍,以及上述程序在该分词器下的运行截图:

StandardAnalyzer
       StandardAnalyzer标准分词器,如果用来处理中文,和ChineseAnalyzer有一样的效果,这也许就是之后的版本弃用ChineseAnalyzer的一个原因。用StandardAnalyzer处理英文效果还不错,但是对中文的处理只是将其分成单个汉字,并不存在任何语义或词性,如果实在没有其他的分词器,用StandardAnalyzer来处理中文还是可以的,上述事例使用StandardAnalyzer分词技术的运行结果如下图:

1.png


IKAnalyzer

      IKAnalyzer是基于Lucene的第三方中文分词技术,该分词技术基于现有的中文词库实现的,在构造Analyzer对象时有两种构造方法,无参构造等同于new IKAnalyzer(false) ,在介绍true/false两种参数下分词器的不同之前先看看这两种情况下的事例运行结果:
false运行结果如下图:

2.png

true运行结果如下图:

3.png

       从上述事例中,我们可以简单的看出,false的情况下会对已分的词进行再分,如果存在长度较小的词元,也将其作为一个分词结果。IKAnalyzer是一种比较常用的中文分词技术,但是其分词效果过于依赖字典,所以要使其达到更好的效果,需要不断的升级自己的字典。

WhitespaceAnalyzer

      WhitespaceAnalyzer空格分词,这个分词技术就相当于按照空格简单的切分字符串,对形成的子串不做其他的操作,结果同string.split(" ")的结果类似。上述事例在WhitespaceAnalyzer分词技术下的运行结果如下图:

4.png

      这种分词技术也许你会绝对没有太大的作用,它对输入的字符串几乎没有做太多的处理,对语句的处理结果也不是太好,如果这样想就错了,下面就简单的想一下这个问题,这篇博客的标签是 lucene、java、分词器,那这三个词在索引中又该如何的存储,采用何种分词技术呢?这里不做任何解答,自己思考下,在以后的小说案例中会对标签这个域提出具体的解决方案。

SimpleAnalyzer


      SimpleAnalyzer简单分词器,与其说是一段话进行分词,不如说是一句话就是一个词,遇到标点、空格等,就将其之前的内容当作一个词。上述事例在SimpleAnalyzer分词技术下的运行结果如下图:

5.png

CJKAnalyzer


      CJKAnalyzer是二分法分词器,这个分词方式是正向退一分词(二分法分词),同一个字会和它的左边和右边组合成一个次,每个人出现两次,除了首字和末字,也就是说会将任何两个相邻的汉字当作是一个词,这种分词技术会产生大量的无用词组。上述事例在CJKAnalyzer分词技术下的运行结果如下图:


6.png

KeywordAnalyzer

      KeywordAnalyzer关键字分词器,把处理的字符串当作一个整体,这个分词器,在lucene之前的版本中或许还有点作用,但最近的几个版本中,Lucene对域的类型做了细分,它的作用就不是太大了,不做在luke中,还是相当重要的。上述事例在KeywordAnalyzer分词技术下的运行结果如下图:

7.png

StopAnalyzer


      StopAnalyzer被忽略的词分词器,被忽略的词就是在分词结果中,被丢弃的字符串,如标点、空格等。上述事例在StopAnalyzer分词技术下的运行结果如下图:

8.png


     上述的7种分词技术都可以对中文做处理,对外文(非英语)的处理有以下几种分词技术:
BrazilianAnalyzer 巴西语言分词
CzechAnalyzer 捷克语言分词
DutchAnalyzer 荷兰语言分词
FrenchAnalyzer 法国语言分词
GermanAnalyzer 德国语言分词
GreekAnalyzer 希腊语言分词
RussianAnalyzer 俄罗斯语言分词
ThaiAnalyzer 泰国语言分词


相关内容:
基于lucene的案例开发1:lucene初始认知

基于lucene的案例开发2:索引数学模型

基于lucene的案例开发3:索引文件结构

基于lucene的案例开发4:创建索引

基于lucene的案例开发5:搜索索引

基于lucene的案例开发6:分词器介绍

基于lucene的案例开发7:Query查询

基于lucene的案例开发8:IndexSearcher中检索方法

基于lucene的案例开发9:案例初识

基于lucene的案例开发10:搜索后台基础,JsonUtil & XmlUtil类介绍

基于lucene的案例开发11:项目常用类ClassUtil & CharsetUtil介绍

基于lucene的案例开发12:数据库连接池

基于lucene的案例开发13:实现实时索引基本原理

基于lucene的案例开发14:实时索引管理类IndexManager

基于lucene的案例开发15:实时索引的检索

基于lucene的案例开发16:实时索引的修改

基于lucene的案例开发17:查询语句创建PackQuery

基于lucene的案例开发18:纵横小说更新列表页抓取

基于lucene的案例开发19:纵横小说简介页采集

基于lucene的案例开发20:纵横小说章节列表采集

基于lucene的案例开发21:纵横小说阅读页采集


出处:http://blog.csdn.net/xiaojimanman/article/details/42836309

已有(5)人评论

跳转到指定楼层
xiaojimanman 发表于 2015-4-8 09:55:54
自己的文章竟让被楼主收录了~  感谢~
更多相关内容可以参照 http://www.llwjy.com/blogtype/lucene.html
回复

使用道具 举报

admin 发表于 2015-4-8 13:16:15
xiaojimanman 发表于 2015-4-8 09:55
自己的文章竟让被楼主收录了~  感谢~
更多相关内容可以参照 http://www.llwjy.com/blogtype/lucene.html

不错值得推荐,博客不错
回复

使用道具 举报

绝版丶小猫 发表于 2015-4-8 14:35:44
想做个题库的站内搜索,是用Lucene还是solr?
回复

使用道具 举报

langke93 发表于 2015-4-8 16:23:40
绝版丶小猫 发表于 2015-4-8 14:35
想做个题库的站内搜索,是用Lucene还是solr?

都可以,关键是对技术熟悉
回复

使用道具 举报

zhujun182104906 发表于 2015-4-10 14:45:51
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条