Lucene04---分词器

来源:互联网 发布:面向对象编程的语言 编辑:程序博客网 时间:2024/06/11 10:42
 

我们知道,Lucene所做的事情主要就两件,一是创建索引,一是搜索。那么这里就有一个很重要的东西就是分词器,分词器在http://xdwangiflytek.iteye.com/blog/1389308里就提到了,这里再说说,分词器,对文本资源进行切分,将文本按规则切分成一个个进行索引的最小单位(关键词)。建立索引和进行搜索时都要用到分词器,为了保证正确的搜索到结果,在建立索引与进行搜索时使用的分词器应为同一个。

       分词器,我们涉及到的是两种,一是英文的,一是中文的,英文的相对中文来说要简单点。

       直接上代码吧

 

 

AnalyzerDemo.java:

Java代码 复制代码 收藏代码
  1. package com.iflytek.lucene;   
  2.   
  3. import java.io.StringReader;   
  4.   
  5. import org.apache.lucene.analysis.Analyzer;   
  6. import org.apache.lucene.analysis.SimpleAnalyzer;   
  7. import org.apache.lucene.analysis.TokenStream;   
  8. import org.apache.lucene.analysis.cjk.CJKAnalyzer;   
  9. import org.apache.lucene.analysis.standard.StandardAnalyzer;   
  10. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;   
  11. import org.apache.lucene.util.Version;   
  12.   
  13. /**  
  14.  * @author xudongwang 2012-2-4  
  15.  *   
  16.  *         Email:xdwangiflytek@gmail.com  
  17.  */  
  18. public class AnalyzerDemo {   
  19.   
  20.     public void analyze(Analyzer analyzer, String text) throws Exception {   
  21.         System.out.println("----------------------->分词器:" + analyzer.getClass());   
  22.         TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));   
  23.   
  24.         CharTermAttribute termAtt = (CharTermAttribute) tokenStream.getAttribute(CharTermAttribute.class);   
  25.         // TypeAttribute typeAtt = (TypeAttribute) tokenStream   
  26.         // .getAttribute(TypeAttribute.class);   
  27.   
  28.         while (tokenStream.incrementToken()) {   
  29.   
  30.             System.out.println(termAtt.toString());   
  31.   
  32.             // System.out.println(typeAtt.type());   
  33.   
  34.         }   
  35.     }   
  36.   
  37.     public static void main(String[] args) throws Exception {   
  38.   
  39.         AnalyzerDemo demo = new AnalyzerDemo();   
  40.         System.out.println("---------------->测试英文");   
  41.         String enText = "Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com";   
  42.         System.out.println(enText);   
  43.         System.out.println("By StandardAnalyzer 方式分词:");   
  44.         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);   
  45.         demo.analyze(analyzer, enText);   
  46.         System.out.println("By SimpleAnalyzer 方式分词:");   
  47.         Analyzer analyzer2 = new SimpleAnalyzer(Version.LUCENE_35);   
  48.         demo.analyze(analyzer2, enText);   
  49.         System.out.println("通过上面的结果发现StandardAnalyzer分词器不会按.来区分的,而SimpleAnalyzer是按.来区分的");   
  50.         System.out.println();   
  51.   
  52.         System.out.println("---------------->测试中文");   
  53.         String znText = "我叫王旭东";   
  54.         System.out.println(znText);   
  55.         System.out.println("By StandardAnalyzer 方式分词:");   
  56.         // 通过结果发现它是将每个字都作为一个关键字,这样的话效率肯定很低咯   
  57.         demo.analyze(analyzer, znText);   
  58.         System.out.println("By CJKAnalyzer 方式(二分法分词)分词:");   
  59.         Analyzer analyzer3 = new CJKAnalyzer(Version.LUCENE_35);   
  60.         demo.analyze(analyzer3, znText);   
  61.   
  62.     }   
  63.   
  64. }  
package com.iflytek.lucene;import java.io.StringReader;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.SimpleAnalyzer;import org.apache.lucene.analysis.TokenStream;import org.apache.lucene.analysis.cjk.CJKAnalyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;import org.apache.lucene.util.Version;/** * @author xudongwang 2012-2-4 *  *         Email:xdwangiflytek@gmail.com */public class AnalyzerDemo {public void analyze(Analyzer analyzer, String text) throws Exception {System.out.println("----------------------->分词器:" + analyzer.getClass());TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));CharTermAttribute termAtt = (CharTermAttribute) tokenStream.getAttribute(CharTermAttribute.class);// TypeAttribute typeAtt = (TypeAttribute) tokenStream// .getAttribute(TypeAttribute.class);while (tokenStream.incrementToken()) {System.out.println(termAtt.toString());// System.out.println(typeAtt.type());}}public static void main(String[] args) throws Exception {AnalyzerDemo demo = new AnalyzerDemo();System.out.println("---------------->测试英文");String enText = "Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com";System.out.println(enText);System.out.println("By StandardAnalyzer 方式分词:");Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);demo.analyze(analyzer, enText);System.out.println("By SimpleAnalyzer 方式分词:");Analyzer analyzer2 = new SimpleAnalyzer(Version.LUCENE_35);demo.analyze(analyzer2, enText);System.out.println("通过上面的结果发现StandardAnalyzer分词器不会按.来区分的,而SimpleAnalyzer是按.来区分的");System.out.println();System.out.println("---------------->测试中文");String znText = "我叫王旭东";System.out.println(znText);System.out.println("By StandardAnalyzer 方式分词:");// 通过结果发现它是将每个字都作为一个关键字,这样的话效率肯定很低咯demo.analyze(analyzer, znText);System.out.println("By CJKAnalyzer 方式(二分法分词)分词:");Analyzer analyzer3 = new CJKAnalyzer(Version.LUCENE_35);demo.analyze(analyzer3, znText);}}

 

 

 运行结果:

 

---------------->测试英文

Hello, my name is wang xudong, I in iteye blog address is xdwangiflytek.iteye.com

By StandardAnalyzer 方式分词:

----------------------->分词器:class org.apache.lucene.analysis.standard.StandardAnalyzer

hello

my

name

wang

xudong

i

iteye

blog

address

xdwangiflytek.iteye.com

By SimpleAnalyzer 方式分词:

----------------------->分词器:class org.apache.lucene.analysis.SimpleAnalyzer

hello

my

name

is

wang

xudong

i

in

iteye

blog

address

is

xdwangiflytek

iteye

com

通过上面的结果发现StandardAnalyzer分词器不会按.来区分的,而SimpleAnalyzer是按.来区分的

 

---------------->测试中文

我叫王旭东

By StandardAnalyzer 方式分词:

----------------------->分词器:class org.apache.lucene.analysis.standard.StandardAnalyzer

By CJKAnalyzer 方式(二分法分词)分词:

----------------------->分词器:class org.apache.lucene.analysis.cjk.CJKAnalyzer

我叫

叫王

王旭

旭东

 

上面讲的分词方式中对于中文来说最好的还是语义分词,就是中科院的那个。

 

后面对于具体中文分词器,我会在专门的专题中去说的,这里先简单了解一下.

原创粉丝点击