`
lzj0470
  • 浏览: 1272724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Lucene源代码之构造自己的分词器

    博客分类:
  • java
阅读更多
  1. package  org.apache.lucene.analysis.tjuchinese;
  2. import  java.io.IOException;
  3. import  java.io.Reader;
  4. import  java.io.StringReader;
  5. import  java.util.Set;
  6. import  org.apache.lucene.analysis.Analyzer;
  7. import  org.apache.lucene.analysis.StopFilter;
  8. import  org.apache.lucene.analysis.TokenStream;
  9. import  com.xjt.nlp.word.ICTCLAS;
  10. public   final   class  TjuChineseAnalyzer  extends  Analyzer {
  11.      private  Set stopWords;
  12.      // 可以在此扩展English stop words和Chinese stop words
  13.      public   static   final  String[] ENGLISH_STOP_WORDS = {  "a" "an" "and" ,
  14.              "are" "as" "at" "be" "but" "by" "for" "if" "in" "into" ,
  15.              "is" "it" "no" "not" "of" "on" "or" "s" "such" "t" ,
  16.              "that" "the" "their" "then" "there" "these" "they" "this" ,
  17.              "to" "was" "will" "with" "我" "我们"  };
  18.      /** Builds an analyzer which removes words in ENGLISH_STOP_WORDS. */
  19.      public  TjuChineseAnalyzer() {
  20.         stopWords = StopFilter.makeStopSet(ENGLISH_STOP_WORDS);
  21.     }
  22.      /** Builds an analyzer which removes words in the provided array. */
  23.      public  TjuChineseAnalyzer(String[] stopWords) {
  24.          this .stopWords = StopFilter.makeStopSet(stopWords);
  25.     }
  26.      /** Filters LowerCaseTokenizer with StopFilter. */
  27.      public  TokenStream tokenStream(String fieldName, Reader reader) {
  28.          try  {
  29.             ICTCLAS splitWord =  new  ICTCLAS();
  30.             String inputString = FileIO.readerToString(reader);
  31.             String resultString = splitWord.paragraphProcess(inputString);
  32.             TokenStream result =  new  TjuChineseTokenizer( new  StringReader(
  33.                     resultString));
  34.             result =  new  StopFilter(result, stopWords);
  35.              return  result;
  36.              /*
  37.              * return new StopFilter(new LowerCaseTokenizer(new StringReader(
  38.              * resultString)), stopWords);
  39.              */
  40.         }  catch  (IOException e) {
  41.             System.out.println( "转换出错" );
  42.              return   null ;
  43.         }
  44.     }
  45. }

TjuChineseTokenizer.java;

  1. package  org.apache.lucene.analysis.tjuchinese;
  2. import  java.io.Reader;
  3. import  org.apache.lucene.analysis.LowerCaseTokenizer;
  4. public   class  TjuChineseTokenizer  extends  LowerCaseTokenizer{
  5.       public  TjuChineseTokenizer(Reader Input)
  6.      {
  7.           super (Input);
  8.      }
  9. }

FileIO.java;

  1. package  org.apache.lucene.analysis.tjuchinese;
  2. import  java.io.BufferedReader;
  3. import  java.io.IOException;
  4. import  java.io.Reader;
  5. public   class  FileIO {
  6.     
  7.      public   static  String readerToString(Reader reader)  throws  IOException {
  8.         BufferedReader br =  new  BufferedReader(reader);
  9.         String ttt =  null ;
  10.          // 使用 StringBuffer 类,可以提高字符串操作的效率
  11.         StringBuffer tttt =  new  StringBuffer( "" );
  12.          while  ((ttt = br.readLine()) !=  null ) {
  13.             tttt.append(ttt);
  14.         }
  15.          return  tttt.toString();
  16.     }
  17. }

eclipse里面的部署为:

搞定!!

下面测试一下,测试代码如下:

 

  1. package  org.apache.lucene.analysis.tjuchinese;
  2. import  java.io.IOException;
  3. import  java.io.StringReader;
  4. import  org.apache.lucene.analysis.Analyzer;
  5. import  org.apache.lucene.analysis.Token;
  6. import  org.apache.lucene.analysis.TokenStream;
  7. public   class  testTjuChjnese {
  8.      public   static   void  main(String[] args) {
  9.         String string =  "hello!我爱中国人民" ;
  10.         Analyzer analyzer =  new  TjuChineseAnalyzer();
  11.         TokenStream ts = analyzer
  12.                 .tokenStream( "dummy" new  StringReader(string));
  13.         Token token;
  14.         System.out.println( "Tokens:" );
  15.          try  {
  16.              int  n =  0 ;
  17.              while  ((token = ts.next()) !=  null ) {
  18.                 System.out.println((n++) +  "->"  + token.toString());
  19.             }
  20.         }  catch  (IOException ioe) {
  21.             ioe.printStackTrace();
  22.         }
  23.     }
  24. }

运行结果:

Tokens:
0->(hello,0,5)
1->(nx,6,8)
2->(w,12,13)
3->(r,17,18)
4->(爱,20,21)
5->(v,22,23)
6->(中国,25,27)
7->(ns,28,30)
8->(人民,32,34)
9->(n,35,36)

 

【难点】

 

  1.    public  CharArraySet( int  startSize,  boolean  ignoreCase) {
  2.      this .ignoreCase = ignoreCase;
  3.      int  size = INIT_SIZE;
  4.      while (startSize + (startSize>> 2 ) > size)
  5.       size <<=  1 ;
  6.     entries =  new   char [size][];
  7.   }

startSize + (startSize>>2,不解?

附录:

因为本分词器要用到ICTCLAS java接口。所以要先下载下载地址http://download.csdn.net/source/778456

将文件全部复制到工程文件中(也可以通过导入)后,得到的eclipse视图如下:

导入视图如下(仅供参考):

 

如果出现这样的错误:

java.lang.UnsatisfiedLinkError: no ICTCLAS in java.library.path
 at java.lang.ClassLoader.loadLibrary(Unknown Source)
 at java.lang.Runtime.loadLibrary0(Unknown Source)
 at java.lang.System.loadLibrary(Unknown Source)
 at com.xjt.nlp.word.ICTCLAS.<clinit>(ICTCLAS.java:37)
Exception in thread "main"

那么应该就是你缺少了某些文件,尤其是ICTCLAS.dll,另外像“classes”、“data”、“lib”源文件夹也是必需的。

转载:http://blog.csdn.net/caoxu1987728/archive/2008/11/15/3305848.aspx

分享到:
评论

相关推荐

    Lucene-Demo.rar Lucene分词的demo

    `Lucene-Demo`文件可能是项目源代码或配置文件的压缩包,里面可能包含了一个完整的Java项目结构,包括`src/main/java`(源代码)、`src/main/resources`(资源文件)和`pom.xml`(Maven项目对象模型文件)。...

    Lucene4.7+IK Analyzer中文分词入门教程

    解压缩下载的源码包,然后将源代码复制到你的项目源码目录。如果遇到源码报错,检查项目编码设置,确保其为UTF-8。在Eclipse中,可以通过右键点击项目,选择Properties来更改编码设置。 环境搭建完成后,你可以编写...

    Lucene 3.6.2 源代码

    1. **分词器(Tokenizers)**: Lucene的核心功能之一是分词,它将输入的文本拆分成一系列可搜索的词语。3.6.2版本中包含各种预定义的分词器,如StandardTokenizer,用于处理常见的语言特性,如词干提取和停用词过滤...

    检索工具lucene 源代码

    总之,Lucene是一个功能强大、灵活性高的全文检索引擎,它的源代码可以帮助开发者深入理解其工作原理,并在此基础上实现个性化的全文检索解决方案。通过学习和使用Lucene,我们可以构建出更高效、更智能的搜索系统,...

    CLucene源代码-Lucene的C++版本

    CLucene是Lucene的C++实现,为那些偏好或需要使用C++进行开发的...通过深入研究clucene-core-2.3.3.4这个版本的源代码,开发者不仅可以学习到搜索引擎的基本原理,还能了解到如何在实际应用中优化和定制这些功能。

    lucene3.6 的源代码

    《深入理解Lucene 3.6:源代码解析》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。在版本3.6中,Lucene提供了一整套强大的文本搜索功能,包括索引、查询、排序、分词等。这个版本的源代码为我们...

    lucene-4.8.0源代码,比较全

    本文将深入探讨Lucene 4.8.0版本的源代码,揭示其内部工作原理以及关键组件,帮助读者理解这个强大的搜索引擎是如何工作的。 一、Lucene概述 Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)...

    基于LUCENE的搜索引擎的设计与实现源代码

    通过这份“基于LUCENE的搜索引擎的设计与实现源代码”,开发者可以深入了解LUCENE的工作机制,结合源代码学习如何在实际项目中应用这些概念和技术。通过实践,你可以构建出更高效、更智能的搜索引擎,满足不同场景下...

    lucene所有的jar包

    Lucene是Apache软件基金会的一个开放源代码项目,它提供了一个高性能、全文本搜索的API。Lucene支持索引和搜索文本,可以集成到各种Java应用程序中,帮助开发者轻松实现全文检索功能。其核心特性包括文档分析、索引...

    Compass+ lucene 通用代码(脱离数据库)

    同时,Lucene的API也提供了丰富的功能,如分词器、过滤器等,用于优化索引质量和搜索性能。 至于“工具”标签,Compass提供了丰富的工具类和API,包括查询构造器、排序和高亮显示等,帮助开发者轻松实现搜索功能。...

    Lucene In Action 第二版 高清中文版+附书源代码

    7. **源代码分析**:附带的书源代码可以帮助读者深入理解Lucene的工作原理,同时提供了动手实践的机会,进一步巩固所学知识。 通过阅读这本书,开发者不仅可以掌握Lucene的基本用法,还能深入理解其内部机制,从而...

    lucene+nutch开发自己的搜索引擎一书源代码

    - LuceneChapter1:介绍Lucene的基本概念,包括文档、字段、分词器和索引的基本构造。读者会学习如何创建、添加、删除和查询文档,以及如何配置不同的分词器来处理文本数据。 2. **索引过程** - Lucenechapter2和...

    Lucene的的学习资料及案例

    2. **分词**: 在建立索引前,Lucene会使用分析器(Analyzer)对文本进行分词,分词结果作为索引的基础。 3. **文档与字段**: 文档是Lucene处理的基本单位,由多个字段(Field)组成。每个字段有其特定的属性,如...

    lucene 网页抓取,模拟搜索引擎

    **Lucene:网页抓取与模拟搜索引擎** Lucene是一个开源的全文检索库,由Apache软件基金会维护。它为开发者提供了构建高效、可扩展的搜索功能的工具。在本项目中,我们将探讨如何利用Lucene来实现一个简单的网页抓取...

    lucene搜索引擎配置详解

    Lucene是Apache软件基金会的一个开放源代码项目,它是一个全文搜索引擎库,提供了高效、可扩展的信息检索服务。本文将深入探讨Lucene搜索引擎的配置过程,包括文件加载、索引创建和搜索操作,帮助你理解其核心技术。...

    lucene-5.0.0 完整资源(包含Jar包)

    2. **源代码**:如果包含源代码,这将有助于你深入理解Lucene的工作原理,甚至可以对其进行修改和扩展。 3. **文档**:可能包含API文档(如Javadoc)和用户指南,帮助你学习如何使用Lucene。 4. **示例代码**:...

    Lucene实战(第二版)

    在压缩包lia2e中,我们可以期待找到与《Lucene实战(第二版)》配套的源代码。这些源代码通常会包含书中所讲述的各种示例和案例研究,以便读者能够亲手实践,加深对Lucene工作原理的理解。通过分析和运行这些代码,...

    搜索模块源代码

    高级搜索的源代码通常会包含更复杂的查询构造逻辑,比如SQL的JOIN操作、范围查询、多条件组合等。此外,可能还会涉及到用户界面的交互设计,以使用户能够方便地指定和组合搜索条件。 然后是Lucene搜索引擎,这是一...

    简单的lucene demo

    2. **开源工具**:Lucene是一个开放源代码的项目,这意味着任何人都可以查看其源代码、学习它的实现原理,并根据自己的需求进行修改或扩展。这种开放性使得Lucene在全球范围内拥有广泛的用户和开发者社区,提供了...

    第一个lucene的简单实例....

    3. **分词**:Lucene使用分析器(Analyzer)来将文本字段分解成可搜索的术语。这涉及到词汇化、去除停用词和词形还原等步骤。 4. **查询解析**:用户输入的搜索字符串会被转换成Lucene的查询对象,这可能涉及使用`...

Global site tag (gtag.js) - Google Analytics