`
ld_hust
  • 浏览: 170304 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

关于lucene的分词(一)

阅读更多

算法和数据结构分析:

由于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 {

protected TokenStream input;

protected TokenFilter() {}

protected TokenFilter(TokenStream input) {

    this.input = input;

}

public void close() throws IOException {

    input.close();

}

}

一个Analyzer就是一个TokenStream工厂

看一下其源码就:

public abstract class Analyzer {

public TokenStream tokenStream(String fieldName, Reader reader)

{

       return tokenStream(reader);

}

public TokenStream tokenStream(Reader reader)

{

       return tokenStream(null, reader);

}

}

好,现在咱们来看一下LuceneAnalysis包下面的各个类文件都是用来干什么的。按照字典排序。

Analysis包中的源码详解

Analyzer.java 上文已经讲过。

CharTokenizer.java 此类为简单一个抽象类,用来对基于字符的进行简单分词(tokenizer

LetterTokenizer.java两个非字符之间的字符串定义为token(举例来说英文单词由空白隔开,那个两个空白之间的字符串即被定义为一个token。备注:对于绝大多数欧洲语言来说,这个类工作效能很好。当时对于不用空白符分割的亚洲语言,效能极差(譬如中日韩)。)

LowerCaseFilter.java is-a TokenFilter用于将字母小写化

LowerCaseTokenizer is-a Tokenizer功能上等价于LetterTokenizerLowerCaseFilter

PerFieldAnalyzerWrapper是一个Analyzer,因为继承自Analyzer当不同的域(Field)需要不同的语言分析器(Analyzer)时,这个Analyzer就派上了用场。使用成员函数addAnalyzer可以增加一个非缺省的基于某个Fieldanalyzer。很少使用。

PorterStemFilter.java使用词干抽取算法对每一个token流进行词干抽取。

PorterStemmer.java 有名的P-stemming算法

SimpleAnalyzer.java

StopAnalyzer.java   具有过滤停用词的功能

StopFilter.java     StopFilter为一个Filter,主要用于从token流中去除StopWords

Token.java       上面已讲.

TokenFilter.java   上面已经讲了

Tokenizer.java     上面已经讲了

TokenStream.java   上面已经讲了

WhitespaceAnalyzer.java

WhitespaceTokenizer.java 只是按照space区分Token.

分享到:
评论

相关推荐

    Lucene-Demo.rar Lucene分词的demo

    这个名为"Lucene-Demo.rar"的压缩包提供了一个基于Lucene的分词演示项目,可以帮助开发者快速理解和应用Lucene的分词功能。在这个压缩包中,有两个主要的文件:`lucene`目录和`Lucene-Demo`文件。 `lucene`目录很...

    lucene分词测试代码

    用java写的图形分词测试的小东西,用的分词器是: 来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器,其使用“正向全切分算法”,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I...

    Lucene中文分词器包

    来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...

    lucene.NET 中文分词

    **Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档...

    Lucene分词器资源包

    **Lucene分词器资源包详解** Lucene是一款开源的全文搜索引擎库,广泛应用于Java开发中,用于构建高效、可扩展的信息检索应用。这个压缩包提供了Lucene分词时所必需的jar包,使得开发者能够方便地在项目中集成...

    简单的LUCENE分词

    在JAVA下,用lucene的内置分词功能对XML文件进行分词,并取消无用词

    Lucene分词与查询详解

    **Lucene分词与查询详解** Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们...

    lucene分词包

    lucene自带的中文分词器,将jar放入编译路径即可使用

    lucene6.6+拼音分词+ik中文分词包

    提供的ik-analyzer-solr6.x.jar文件就是IK Analyzer的一个版本,适用于Solr 6.x,能够很好地与Lucene集成,进行中文分词。 除了IK Analyzer,还有pinyin4j-2.5.0.jar,这是一个Java库,用于处理汉字的拼音转换。在...

    Lucene中文分词器组件

    4. **jieba分词**:jieba是一款流行的Python中文分词库,也可以通过Java接口与Lucene集成。它支持多种分词模式,并且具有用户友好的API,方便开发者使用。 这些分词器组件的使用通常涉及以下步骤: 1. **安装与...

    Lucene与中文分词技术的研究及应用

    - **IK分词**:针对Lucene和Solr设计的一款中文分词插件,支持词性标注和自定义词典。 - **THULAC**:清华大学开发的一个中文分词和词性标注工具包。 在实际应用中,可以通过以下步骤实现中文分词器与Lucene的集成...

    Lucene中文分词源码详解

    Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-21.Lucene分词器2 共9页.pptx

    共6页19.Lucene过滤 共4页20.Lucene分词器1 共3页21.Lucene分词器2 共9页22.Lucene分词器3 共4页23.Lucene项目实战1 共6页24.Lucene项目实战2 共6页25.Lucene项目实战3 共6页26.Lucene项目实战4 共6页27.Lucene项目...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-20.Lucene分词器1 共3页.pptx

    共6页19.Lucene过滤 共4页20.Lucene分词器1 共3页21.Lucene分词器2 共9页22.Lucene分词器3 共4页23.Lucene项目实战1 共6页24.Lucene项目实战2 共6页25.Lucene项目实战3 共6页26.Lucene项目实战4 共6页27.Lucene项目...

    lucene中文分词工具包

    Lucene是一个高性能、全文检索库,而“lucene中文分词工具包”则为Lucene提供了一个专门针对中文分词的解决方案。这个工具包的核心是IKAnalyzer,它是一个开源且基于Java语言开发的轻量级中文分词工具,旨在提升中文...

    google,lucene分词包

    google ,lucene分词应该是最好的分词工具

    java lucene 实现分词和词干抽取

    用java实现的,利用了lucene里面的standardAnalyzer分析器实现的分词,可以去停用词,再利用波特算法实现 词干提取 最后排序 和词频统计输出

    Lucene3.0分词系统.doc

    Lucene3.0分词系统的核心在于理解和应用其分词原理,无论是对于英文还是中文文本,这一过程都是构建高效搜索引擎的基础。以下是对Lucene3.0分词系统中涉及的关键知识点的深入解析。 ### 英文分词原理 英文分词相较...

    如何使用Lucene的中文分词搜索

    **标题:“如何使用Lucene的中文分词搜索”** 在信息检索和文本处理领域,Apache Lucene是一个强大的全文搜索引擎库,它提供了高级的索引和搜索功能。在处理中文文本时,由于中文句子是由词语组成的,而非单个字符...

Global site tag (gtag.js) - Google Analytics