现在的位置: 首页 > 综合 > 正文

lucene 中文分词

2014年01月14日 ⁄ 综合 ⁄ 共 3136字 ⁄ 字号 评论关闭

内容提要:以ChineseAnalyzer为例,简单讲讲lucene分析器,也就是analyzer的分析过程

一:分析器原理

语料——>过滤器过滤——>tokeniner分词器分词——>词元——>放进字典(记录词元和位置信息)

二:代码分析

1:一共有5个类,第一个是ChineseAnalyzer分析器类,还有ChineseFilter过滤器类和它的工厂类,和ChineseTokenizer类和它的工厂类

2:ChineseAnalyzer类

[java] view
plain
copy

  1. public final class ChineseAnalyzer extends Analyzer {  
  2.   
  3.     @Override  
  4.     protected TokenStreamComponents createComponents(String fieldName,  
  5.         Reader reader) {  
  6.       final Tokenizer source = new ChineseTokenizer(reader);//new一个tokenizer  
  7.       return new TokenStreamComponents(source, new ChineseFilter(source));//把tokonizer和过滤器放入语汇流处理器组建中  
  8.     }  
  9. }  


3:ChineseFilter类,默认按照空格来切割文档字词,主要处理停用词,和把英文字符长度为1的去掉

[java] view
plain
copy

  1. public final class ChineseFilter extends TokenFilter {  
  2.   
  3.   
  4.     // Only English now, Chinese to be added later.停用词,可以添加在这里  
  5.     public static final String[] STOP_WORDS = {  
  6.     "and""are""as""at""be""but""by",  
  7.     "for""if""in""into""is""it",  
  8.     "no""not""of""on""or""such",  
  9.     "that""the""their""then""there""these",  
  10.     "they""this""to""was""will""with"  
  11.     };  
  12.   
  13.   
  14.     private CharArraySet stopTable;  
  15.   
  16.     private CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);  
  17.       
  18.     public ChineseFilter(TokenStream in) {  
  19.         super(in);  
  20.   
  21.         stopTable = new CharArraySet(Version.LUCENE_CURRENT, Arrays.asList(STOP_WORDS), false);  
  22.     }  
  23.   
  24.     @Override  
  25.     public boolean incrementToken() throws IOException {  
  26.   
  27.         while (input.incrementToken()) {  
  28.             char text[] = termAtt.buffer();//以空格为截断符截取出来的的字符数组  
  29.             int termLength = termAtt.length();  
  30. //过滤器的主要功能,字符是先按照空格截取后的字符数组,先判断是不是在停用词里面,然后判断是不是英文字母,在判断是不是其他字符  
  31.           // why not key off token type here assuming ChineseTokenizer comes first?  
  32.             if (!stopTable.contains(text, 0, termLength)) {//是不是在停用词里面  
  33.                 switch (Character.getType(text[0])) {  
  34.   
  35.                 case Character.LOWERCASE_LETTER://是不是引文字母  
  36.                 case Character.UPPERCASE_LETTER:  
  37.   
  38.                     // English word/token should larger than 1 character.  
  39.                     if (termLength>1) {//要是英文字母,且长度大于1才回返回给语汇处理器  
  40.                         return true;  
  41.                     }  
  42.                     break;  
  43.                 case Character.OTHER_LETTER://要是其他字符,直接返回  
  44.   
  45.                     // One Chinese character as one Chinese word.  
  46.                     // Chinese word extraction to be added later here.  
  47.   
  48.                     return true;  
  49.                 }  
  50.   
  51.             }  
  52.   
  53.         }  
  54.         return false;  
  55.     }  
  56.   
  57. }  

4:ChineseTokenizer类,是处理分词的

[java] view
plain
copy

  1. public final class ChineseTokenizer extends Tokenizer {  
  2.     public ChineseTokenizer(Reader in) {  
  3.       super(in);  
  4.     }  
  5.     public ChineseTokenizer(AttributeSource source, Reader in) {  
  6.       super(source, in);  
  7.     }  
  8.     public ChineseTokenizer(AttributeFactory factory, Reader in) {  
  9.       super(factory, in);  
  10.     }  
  11.          
  12.     private int offset = 0, bufferIndex=0, dataLen=0;  
  13.     private final static int MAX_WORD_LEN = 255;  
  14.     private final static int IO_BUFFER_SIZE = 1024;  
  15.     private final char[] buffer = 

抱歉!评论已关闭.