`
冷静
  • 浏览: 145954 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

Lucene自定义Analyzer

阅读更多

WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文,会保留原文中的破折号,以空格为边界,将空格间的内容切分为最小的语汇单元。

SimpleAnalyzer:功能强于WhitespaceAnalyzer,将所有的字符lowcase化,不支持中文,保留停用词,并以非字母字符作为单个语汇单元的边界。

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

StandardAnalyzer:英文的处理能力同于StopAnalyzer,保留XY&Z形式的单词,且会把email地址保留下来。支持中文采用的方法为单字切分。

以上四个Analyzer可以用下例来说明:

 

输入字符串:XY&Z mail is - xyz@sohu.com
=====Whitespace analyzer====
分析方法:空格分割
XY&Z

mail
is
-
xyz@sohu.com
=====Simple analyzer====
分析方法:空格及各种符号分割
xy
z
mail
is
xyz
sohu
com
=====stop analyzer====
分析方法:空格及各种符号分割,去掉停止词,停止词包括 is,are,in,on,the等无实际意义
的词
xy
z
mail
xyz
sohu
com
=====standard analyzer====
分析方法:混合分割,包括了去掉停止词,支持汉语
xy&z
mail
xyz@sohu.com

 

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

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

 

TjuChineseAnalyzer:自定义的,功能最为强大。TjuChineseAnlyzer的功能相当强大,在中文分词方面由于其调用的为ICTCLAS的java接口.所以其在中文方面性能上同与ICTCLAS.其在英文分词上采用了Lucene的StopAnalyzer,可以去除 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)

 

到此为止这个简单的但是功能强大的分词器就写完了,下面咱们可以尝试写一个功能更强大的分词器.

如何DIY一个功能更加强大Analyzer

譬如你有词典,然后你根据正向最大匹配法或者逆向最大匹配法写了一个分词方法,却想在Lucene中应用,很简单,你只要把他们包装成Lucene的TokenStream就好了.下边我以调用中科院写的ICTCLAS接口为例,进行演示.你去中科院网站可以拿到此接口的free版本,谁叫你没钱呢,有钱,你就可以购买了.哈哈
好,由于ICTCLAS进行分词之后,在Java中,中间会以两个空格隔开!too easy,我们直接使用继承Lucene的WhiteSpaceTokenizer就好了.

所以TjuChineseTokenizer 看起来像是这样.

public class TjuChineseTokenizer extends WhitespaceTokenizer
{
public TjuChineseTokenizer(Reader readerInput)
{
    super(readerInput);
}
}

而TjuChineseAnalyzer看起来象是这样

public final class TjuChineseAnalyzer
    extends Analyzer
{
private Set stopWords;

 

/** An array containing some common English words that are not usually useful
    for searching. */
/*
     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",
      "我", "我们"
     };
   */
/** Builds an analyzer which removes words in ENGLISH_STOP_WORDS. */
public TjuChineseAnalyzer()
{
    stopWords = StopFilter.makeStopSet(StopWords.SMART_CHINESE_ENGLISH_STOP_WORDS);
}

 

/** Builds an analyzer which removes words in the provided array. */
//提供独自的stopwords
public TjuChineseAnalyzer(String[] stopWords)
{
    this.stopWords = StopFilter.makeStopSet(stopWords);
}

 

/** Filters LowerCaseTokenizer with StopFilter. */
public TokenStream tokenStream(String fieldName, Reader reader)
{
    try
    {
      ICTCLAS splitWord = new ICTCLAS();
      String inputString = FileIO.readerToString(reader);

      //分词中间加入了空格
      String resultString = splitWord.paragraphProcess(inputString);
      System.out.println(resultString);
      TokenStream result = new TjuChineseTokenizer(new StringReader(resultString));

      result = new LowerCaseFilter(result);
      //使用stopWords进行过滤
     result = new StopFilter(result, stopWords);

      //使用p-stemming算法进行过滤
     result = new PorterStemFilter(result);

      return result;

 

    }
    catch (IOException e)
    {
      System.out.println("转换出错");
      return null;
    }
}

 

public static void main(String[] args)
{
    String string = "我爱中国人民";
    Analyzer analyzer = new TjuChineseAnalyzer();
    TokenStream ts = analyzer.tokenStream("dummy", new StringReader(string));
    Token token;
    System.out.println("Tokens:");
    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:(爱,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:(人民,10,12,word,1)

OK,经过这样一番讲解,你已经对Lucene的Analysis包认识的比较好了,当然如果你想更加了解,还是认真读读源码才好,
呵呵,源码说明一切!

 

分享到:
评论

相关推荐

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...

    PanGu.Lucene.Analyzer.rar

    本文将深入探讨“PanGu.Lucene.Analyzer.dll”这一特定的分析器,它是专门为Lucene库设计的,旨在优化中文文本的处理。 首先,我们来了解一下Lucene。Lucene是一个高性能、全文检索库,由Apache软件基金会开发,...

    lucene Analyzer 庖丁解牛 中文分词

    《Lucene Analyzer剖析:中文分词的奥秘》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种系统中。其核心功能之一就是对输入文本进行高效精准的分词处理,以便进行后续的索引和查询操作。...

    模糊查询-lucene-IKAnalyzer

    IKAnalyzer支持自定义词典,可以根据实际需求扩展分词效果。 模糊查询是Lucene中的一个重要特性,它允许用户输入部分关键词或者使用通配符来进行搜索。例如,用户可以输入"计算*"来查找所有以"计算"开头的词汇。在...

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

    【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...

    elasticsearch-analysis-ik,ik分析插件将lucene ik analyzer集成到elasticsearch中,支持自定义字典。.zip

    Elasticsearch 是一款功能强大的全文搜索引擎,而 IK Analyzer 是一个在 Lucene 上构建的智能中文分词库。本文将深入探讨如何将 Elasticsearch Analysis IK 插件应用于 Elasticsearch 中,以实现对中文文本的高效、...

    lucene增删改查+IKAnalyzer

    IKAnalyzer采用了基于词典的分词方法,内置了丰富的中文词汇库,并支持自定义扩展。此外,IKAnalyzer还支持动态加载词典,能够较好地处理新出现的网络词汇。 使用IKAnalyzer与Lucene结合,构建全文搜索引擎的步骤...

    lucene的IKAnalyzer以及兼容4.3

    1. **灵活的词典管理**:IKAnalyzer支持动态加载词典,用户可以根据需求自定义词典,方便地扩展或修改分词效果。 2. **智能的分词算法**:采用基于正向最大匹配和逆向最大匹配的混合策略,同时考虑了词语的常用度,...

    lucene5和IKAnalyzer5的jar包 相匹配

    IKAnalyzer5对词典进行了优化,提高了分词速度和准确性,支持动态加载词典,可自定义扩展词典,同时具备智能词组分词和精确模式,兼顾了搜索的准确性和效率。对于中文搜索引擎而言,分词的准确性至关重要,IK...

    中文分词库 IKAnalyzer For Lucene 5.2.1(适用Lucene 5.2.1)

    IKAnalyzer 是一个专门为 Lucene 设计的开源中文分词库,它在中文处理领域有着广泛的应用。这个版本的 IKAnalyzer 特别适用于 Lucene 5.2.1,这意味着它与该版本的 Lucene 兼容性极佳,能够提供高效、准确的中文分词...

    Lucene的IK Analyzer 3.0 中文分词器 全解

    IK Analyzer 3.0 是一个专为 Lucene 设计的开源中文分词器,它基于 Java 开发,提供轻量级且高效的分词功能。自2006年12月发布1.0版以来,IK Analyzer 经历了多次升级,3.0版已演变为独立于 Lucene 的通用分词组件,...

    lucene 所有jar包 包含IKAnalyzer分词器

    IKAnalyzer支持用户自定义词典,能够较好地处理现代汉语中的新词和网络用语,提高了中文信息检索的准确性。 此外,压缩包中还包含了其他几个Lucene的扩展模块。`lucene-kuromoji-3.6.1.jar`是针对日语文本的分析器...

    使用lucene4.10,IKAnalyzer5.0提取敏感词

    在这个场景中,我们讨论的是如何在`Lucene 4.10`版本中,结合`IKAnalyzer 5.0`这个中文分词器来提取敏感词。 `Lucene`的核心功能之一是能够对输入的文档进行索引,以便快速地进行全文搜索。然而,在某些应用中,...

    Lucene5学习之自定义同义词分词器简单示例

    5. **使用自定义分词器**:在索引文档和执行查询时,使用你的自定义Analyzer实例。 在实际应用中,我们还需要关注性能和效率问题,例如,同义词库的加载和查询优化。同时,对于大型同义词库,可以考虑使用更高效的...

    ikanalyzer中文分词支持lucene7.1.0

    ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...

    拼音分词 Pinyin4j+pinyinAnalyzer+lucene-analyzers

    3. 可定制性:用户可以根据需求选择不同的分析器或者自定义分析器。 在Solr中应用这三个组件,可以实现高效的中文拼音搜索,特别是在处理多音字和首字母搜索时,能提供更灵活和准确的搜索体验。例如,用户可以通过...

    lucene-4.10.3源码

    1. 分词器(Analyzer)增强:此版本对分词器进行了优化,例如支持更多的语言和自定义规则,以提高分析效率和准确度。 2. 查询性能提升:引入了新的查询结构和优化,如`CachingWrapperQuery`,提高了查询缓存的性能。...

    lucene5.4 + IKAnalyzer

    扩展词是IK Analyzer的一种特性,允许对基础词典进行扩展,包括添加自定义词汇或特定领域的专业术语。这使得IK Analyzer更加适应各种场景,特别是在处理行业特定或者个性化搜索需求时,能提供更精准的分词结果。 在...

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    在实际项目中,通常会创建一个自定义的Analyzer类,继承自IKAnalyzer,并在索引文档时使用这个类。对于高亮,可以使用`org.apache.lucene.search.highlight.Highlighter`类,配合`QueryScorer`和`...

    IKAnalyzer6.5.0.jar

    5. **库文件夹**:`libs` 目录下可能包含了IK Analyzer运行所需的其他依赖库,如Lucene等,这些库文件对于IK Analyzer的正常工作至关重要。 6. **元数据**:`META-INF` 文件夹通常包含关于JAR文件本身的信息,如...

Global site tag (gtag.js) - Google Analytics