• 重写lucene.net的分词器支持3.0.3.0版本


    lucene.net中每个分词器都是一个类,同时有一个辅助类,这个辅助类完成分词的大部分逻辑。分词类以Analyzer结尾,辅助类通常以Tokenizer结尾。分类词全部继承自Analyzer类,辅助类通常也会继承某个类。

    首先在Analysis文件夹下建立两个类,EasyAnalyzer和EasyTokenizer。

     1 using Lucene.Net.Analysis;
     2 using System.IO;
     3 
     4 namespace LuceneNetTest
     5 {
     6     public class EasyTokenizer : CharTokenizer
     7     {
     8         private TextReader reader;
     9         public EasyTokenizer(TextReader reader)
    10             : base(reader)
    11         {
    12             this.reader = reader;
    13         }
    14         protected override bool IsTokenChar(char c)
    15         {
    16             //return true;  //整行输出
    17             //return c != ','; //逗号分隔
    18             return c != ' '; //空格划分
    19         }
    20     }
    21 }
    EasyTokenizer
     1 using Lucene.Net.Analysis;
     2 using System.IO;
     3 
     4 namespace LuceneNetTest
     5 {
     6     public class EsayAnalyzer : Analyzer
     7     {
     8         public override TokenStream TokenStream(string fieldName, TextReader reader)
     9         {
    10             return new EasyTokenizer(reader);
    11         }
    12     }
    13 }
    EsayAnalyzer

    其中分词辅助类中的IsTokenChar这个函数是分词的关键,分词核心逻辑会根据这个函数返回的值进行分词,如果返回false,则会以这个字符进行一次划分。

    测试代码如下:

     1 using Lucene.Net.Analysis;
     2 using Lucene.Net.Analysis.Tokenattributes;
     3 using System;
     4 using System.IO;
     5 namespace LuceneNetTest
     6 {
     7     class Program
     8     {
     9         static void Main(string[] args)
    10         {
    11             const string testwords = "大家好,I can speak chinese!";
    12             EsayAnalyzer simple = new EsayAnalyzer();
    13             TokenStream ts = simple.ReusableTokenStream("", new StringReader(testwords));
    14             while (ts.IncrementToken())
    15             {
    16                 ITermAttribute attribute = ts.GetAttribute<ITermAttribute>();
    17                 Console.WriteLine(attribute.Term);
    18             }
    19         }
    20     }
    21 }
    Program

    CITermAttribute:The term text of a Token.

  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/qiyebao/p/3864085.html
Copyright © 2020-2023  润新知