Analysis包分析

Analysis包分析

算法和数据结构分析:

由于Analysis包比较简单,不详述了!

算法:基于机械分词 1-gram,2-gram,HMM(如果使用ICTCLAS接口的话)

数据结构:部分源码用到了Set ,HashTable,HashMap

认真理解Token

Lucene中的Analysis包专门用于完成对于索引文件的分词.Lucene中的Token是一个非常重要的概念.

看一下其源码实现:

public final class Token ...{

  String termText;                        
// the text of the term

  
int startOffset;                           // start in source text

  
int endOffset;                            // end in source text

  String type 
= "word";                        // lexical type

  
private int positionIncrement = 1;

  
public Token(String text, int start, int end)

  
public Token(String text, int start, int end, String typ)

  
public void setPositionIncrement(int positionIncrement)

  
public int getPositionIncrement() ...return positionIncrement; }

  
public final String termText() ...return termText; }

  
public final int startOffset() ...return startOffset; }

public void setStartOffset(int givenStartOffset)

  
public final int endOffset() ...return endOffset; }

public void setEndOffset(int givenEndOffset)

  
public final String type() ...return type; }

  
public String toString()

 }


下面编一段代码来看一下

TestToken.java

package org.apache.lucene.analysis.test;

import org.apache.lucene.analysis.*;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import java.io.*;

public class TestToken

...{

  
public static void main(String[] args)

  
...{

    String string 
= new String("我爱天大,但我更爱中国");

//Analyzer analyzer = new StandardAnalyzer();

Analyzer analyzer 
= new TjuChineseAnalyzer();

//Analyzer analyzer= new StopAnalyzer();

    TokenStream ts 
= analyzer.tokenStream("dummy",new StringReader(string));

    Token token;

    
try

    
...{

      
int n=0;

      
while ( (token = ts.next()) != null)

      
...{

        System.out.println((n
++)+"->"+token.toString());

      }


    }


    
catch(IOException ioe)

    
...{

      ioe.printStackTrace();

    }


 

  }


}


注意看其结果如下所示

0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,0,1,<CJK>,1)

1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,1,2,<CJK>,1)

2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,2,3,<CJK>,1)

3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,3,4,<CJK>,1)

4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,5,6,<CJK>,1)

5->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,6,7,<CJK>,1)

6->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,7,8,<CJK>,1)

7->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,8,9,<CJK>,1)

8->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,9,10,<CJK>,1)

9->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,10,11,<CJK>,1)

注意:其中”,”StandardAnalyzer给过滤掉了,所以大家注意第4Token直接startOffset5开始.

如果改用StopAnalyzer()

0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我爱天大,0,4,word,1)

1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(但我更爱中国,5,11,word,1)

改用TjuChineseAnalyzer(我写的,下文会讲到如何去写)

0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,3,4,word,1)

1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(天大,6,8,word,1)

2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,19,20,word,1)

3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(,22,23,word,1)

4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中国,25,27,word,1)

讲明白了Token,咱们来看以下其他的东西

一个TokenStream是用来走访Tokeniterator(迭代器)

看一下其源代码:

public abstract class TokenStream ...{

  
public abstract Token next() throws IOException;

  
public void close() throws IOException ...{}

}


一个Tokenizeris-a TokenStream(派生自TokenStream),其输入为Reader

看一下其源码如下:

public abstract class Tokenizer extends TokenStream ...{

  
protected Reader input;

  
protected Tokenizer() ...{}

  
protected Tokenizer(Reader input) ...{

    
this.input = input;

  }


  
public void close() throws IOException ...{

    input.close();

  }


}


一个TokenFilter is–a TokenStream(派生自TokenStream),其义如名就是用来完成对TokenStream的过滤操作,譬如

StopWords,将Token变为小写等。

源码如下:

public abstract class TokenFilter extends TokenStream ...{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值