关于lucene的分词(二)

Luceneanalyisis包下的Standard包下的StandardAnalyzer()功能很强大,而且支持CJK分词,我们简要说一下.

此包下的文件是有StandardTokenizer.jj经过javac命令生成的.由于是机器自动生成的代码,可能可读性很差,想了解的话好好看看那个StandardTokenizer.jj文件就会比较明了了.

Lucene常用的Analyzer功能概述.

WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase,不支持中文

SimpleAnalyzer:功能强于WhitespaceAnalyzer,将除去letter之外的符号全部过滤掉,并且将所有的字符lowcase,不支持中文

StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上
   
增加了去除StopWords的功能,不支持中文

StandardAnalyzer:英文的处理能力同于StopAnalyzer.支持中文采用的方法为单字切分.

ChineseAnalyzer:来自于Lucenesand box.性能类似于StandardAnalyzer,缺点是不支持中英文混和分词.

CJKAnalyzer:chedong写的CJKAnalyzer的功能在英文处理上的功能和StandardAnalyzer相同
   
但是在汉语的分词上,不能过滤掉标点符号,即使用二元切分

TjuChineseAnalyzer:我写的,功能最为强大.TjuChineseAnlyzer的功能相当强大,在中文分词方面由于其调用的为ICTCLASjava接口.所以其在中文方面性能上同与ICTCLAS.其在英文分词上采用了LuceneStopAnalyzer,可以去除 stopWords,而且可以不区分大小写,过滤掉各类标点符号.

各个Analyzer的功能已经比较介绍完毕了,现在咱们应该学写Analyzer,如何diy自己的analyzer??

如何DIY一个Analyzer

咱们写一个Analyzer,要求有一下功能

(1)    可以处理中文和英文,对于中文实现的是单字切分,对于英文实现的是以空格切分.

(2)    对于英文部分要进行小写化.

(3)    具有过滤功能,可以人工设定StopWords列表.如果不是人工设定,系统会给出默认的StopWords列表.

(4)    使用P-stemming算法对于英文部分进行词缀处理.

代码如下:

public final class DiyAnalyzer

    extends Analyzer

{

private Set stopWords;

public static final String[] CHINESE_ENGLISH_STOP_WORDS =

      {

      "a", "an", "and", "are", "as", "at", "be", "but", "by",

      "for", "if", "in", "into", "is", "it",

      "no", "not", "of", "on", "or", "s", "such",

      "t", "that", "the", "their", "then", "there", "these",

      "they", "this", "to", "was", "will", "with",

      "", "我们"

};

public DiyAnalyzer()

{

    this.stopWords=StopFilter.makeStopSet(CHINESE_ENGLISH_STOP_WORDS);

}

 

public DiyAnalyzer(String[] stopWordList)

{

    this.stopWords=StopFilter.makeStopSet(stopWordList);

}

 

public TokenStream tokenStream(String fieldName, Reader reader)

{

    TokenStream result = new StandardTokenizer(reader);

    result = new LowerCaseFilter(result);

 

    result = new StopFilter(result, stopWords);

    result = new PorterStemFilter(result);

    return result;

}

 

public static void main(String[] args)

{

    //好像英文的结束符号标点.,StandardAnalyzer不能识别

    String string = new String("我爱中国,我爱天津大学!I love China!Tianjin is a City");

    Analyzer analyzer = new DiyAnalyzer();

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

    Token token;

    try

    {

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

      {

        System.out.println(token.toString());

      }

    }

    catch (IOException ioe)

    {

      ioe.printStackTrace();

    }

}

}

可以看见其后的结果如下:

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

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

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

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

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

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

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

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

Token's (termText,startOffset,endOffset,type,positionIncrement) is:(i,12,13,<ALPHANUM>,1)

Token's (termText,startOffset,endOffset,type,positionIncrement) is:(love,14,18,<ALPHANUM>,1)

Token's (termText,startOffset,endOffset,type,positionIncrement) is:(china,19,24,<ALPHANUM>,1)

Token's (termText,startOffset,endOffset,type,positionIncrement) is:(tianjin,25,32,<ALPHANUM>,1)

Token's (termText,startOffset,endOffset,type,positionIncrement) is:(citi,39,43,<ALPHANUM>,1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值