首页 »编程综合 » lucene分词:Lucene.Net 2.3.1开发介绍 2、分词( 2) »正文
lucene分词:Lucene.Net 2.3.1开发介绍 2、分词( 2)
来源: 发布时间:星期四, 2009年1月15日 浏览:2次 评论:0
1.2、分词 过程 1.2.1、分词器工作 过程 内置 分词器效果都不好 那如何办?只能自己写了!在写的前当然是要先看看内置 分词器是如何实现 了 从1.1分析分词效果 可以看出KeywordAnalyzer这个分词器最懒惰 基本什么事情也没做 并不是它不会做 而是我们没找到使用它 思路方法 就像手上拿着个盒子 不知道里面是什么 就不知道这个是干嘛 有什么用 打开盒子 那就是要查看源代码了! 代码 1.2.1.1 Code 1using ; 2 3 Lucene.Net.Analysis 4{ 5 6 /**//// <summary> "Tokenizes" the entire stream as a single token. This is useful 7 /// for data like zip codes, ids, and some product names. 8 /// </summary> 9 public KeywordAnalyzer : Analyzer 10 { 11 public override TokenStream TokenStream(.String fieldName, .IO.TextReader reader) 12 { 13 KeywordTokenizer(reader); 14 } 15 16 public override TokenStream ReusableTokenStream(.String fieldName, .IO.TextReader reader) 17 { 18 Tokenizer tokenizer = (Tokenizer)GetPreviousTokenStream; 19 (tokenizer null) 20 { 21 tokenizer = KeywordTokenizer(reader); 22 SetPreviousTokenStream(tokenizer); 23 } 24 25 tokenizer.Re(reader); 26 tokenizer; 27 } 28 } 29}
代码1.2.1.1 就是传说中 源码了 先看看注释 意思大体是“‘Tokenizes’整体 流变成 个个词 这个特别适用于邮编 ID 和商品名称 ”Tokenizes应该是拆分 意思 字典上查不到这个词 这段代码比较简单 只有两个思路方法 而第 2个思路方法就是我们先前分析结果 时候用 (见段落1.1) 关键点就在于 了KeywordTokenizer类 切到KeywordTokenizer类查看 下 代码1.2.1.2 Code 1using ; 2 3 Lucene.Net.Analysis 4{ 5 6 /**//// <summary> Emits the entire input as a single token.</summary> 7 public KeywordTokenizer : Tokenizer 8 { 9 10 private const DEFAULT_BUFFER_SIZE = 256; 11 12 private bool done; 13 14 public KeywordTokenizer(.IO.TextReader input) : this(input, DEFAULT_BUFFER_SIZE) 15 { 16 } 17 18 public KeywordTokenizer(.IO.TextReader input, bufferSize) : base(input) 19 { 20 this.done = false; 21 } 22 23 public override Token Next(Token result) 24 { 25 (!done) 26 { 27 done = true; 28 upto = 0; 29 result.Clear; 30 char buffer = result.TermBuffer; 31 while (true) 32 { 33 length = input.Read(buffer, upto, buffer.Length - upto); 34 (length <= 0) 35 ; 36 upto length; 37 (upto buffer.Length) 38 buffer = result.ResizeTermBuffer(1 + buffer.Length); 39 } 40 result.termLength = upto; 41 result; 42 } 43 null; 44 } 45 46 public override void Re(.IO.TextReader input) 47 { 48 base.Re(input); 49 this.done = false; 50 } 51 } 52}
代码 1.2.1.2 就是KeywordTokenizer 源码 代码量很小 却没有完成全部工作 而是将部分工作交给了父类 关注Lucene 人都可以知道 新版本中 分词这里换掉了 现在多了 个重载 Next思路方法 这里不讨论为什么要加这个重载 这篇文章主要是讲应用 取词是用Next思路方法走 那么只需要关注Next思路方法就可以了 KeywordTokenizer 父类是Tokenizer 但是在Tokenizer里找不到我们想要 关系 但是Tokenizer又继承自TokenStream 查看TokenStream类 代码 1.2.1.3 Code 1 2using ; 3 4using Payload = Lucene.Net.Index.Payload; 5 6 Lucene.Net.Analysis 7{ 8 9 /**//// <summary>A TokenStream enumerates the sequence of tokens, either from 10 /// fields of a document or from query text. 11 /// <p> 12 /// This is an abstract . Concrete subes are: 13 /// <ul> 14 /// <li>{@link Tokenizer}, a TokenStream 15 /// whose input is a Reader; and 16 /// <li>{@link TokenFilter}, a TokenStream 17 /// whose input is another TokenStream. 18 /// </ul> 19 /// NOTE: subes must override at least _disibledevent= 0; 92 } 93 } 94} 天公不作美 刚看到简单 就来了个长 无奈中 不过为什么要多 重继承呢?那就是有其他分词器也用到CharTokenizer了 而WhitespaceTokenizer中没有重写Next思路方法 而只是重写了IsTokenChar思路方法 几乎可以肯定 这个IsTokenChar才是重点 IsTokenChar故名思意 看注释 果然!这个思路方法是判断是否遇到了分词 点 这个其实和 类 Split思路方法相似 注意到Next思路方法有关IsTokenChar逻辑那 段 恩 果然是这样分词 实际上就是拆分 串嘛
相关文章
读者评论
发表评论
|
|