Lucene.Net 2.3.1开发介绍 —— 二、分词(二)

1.2、分词的过程

 

1.2.1、分词器工作的过程

内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词器是怎么实现的了。从1.1分析分词效果,可以看出KeywordAnalyzer这个分词器最懒惰,基本什么事情也没做。并不是它不会做,而是我们没找到使用它的方法,就像手上拿着个盒子,不知道里面是什么,就不知道这个是干嘛的,有什么用。打开盒子,那就是要查看源代码了!

 

 

代码 1.2.1.1

 

Code

 

代码1.2.1.1 就是传说中的源码了。先看看注释,意思大体是“‘Tokenizes’整体的流变成一个个词。这个特别适用于邮编,ID,和商品名称。”Tokenizes应该是拆分的意思,字典上查不到这个词。

这段代码比较简单,只有两个方法,而第二个方法就是我们先前分析结果的时候用的(见段落1.1)。关键点就在于调用了KeywordTokenizer类。切到KeywordTokenizer类查看一下。

 

 

代码1.2.1.2

 

Code

 

代码 1.2.1.2 就是KeywordTokenizer的源码。代码量很小,却没有完成全部工作,而是将部分工作交给了父类。关注Lucene的人都可以知道,新版本中,分词这里换掉了,现在多了一个重载的Next方法。这里不讨论为什么要加这个重载,这篇文章主要是讲应用的。因为取词是用Next方法走的,那么只需要关注Next方法就可以了。KeywordTokenizer的父类是Tokenizer,但是在Tokenizer里找不到我们想要的关系,但是Tokenizer又继承自TokenStream。查看TokenStream类。

 

 

代码 1.2.1.3

 

Code

 

代码 1.2.1.3 就是TokenStream类的源码。Next(Token)方法和Next()是相互调用的关系。但是因为Next(Token)方法在KeywordTokenizer里被重写掉了,因此,这里就可以忽略TokenStream的Next(Token)方法了。

 

从上面代码可以看出,调用Next()方法,实际上是传递给Next(Token)方法一个新Token实例。即使直接调用Next(Token),传递一个带有数据的Token,也会先被清除。在循环中,会把构造函数传入的流缓冲进Token类的缓冲区。ResizeTermBuffer方法是自动扩容用的,就像.Net Framework里的一些类能够自然扩容一样。比如List<T>,Hashtable或StringBuilder等。这个过程看不到分词的过程。不过这样就大致明白了分词器工作的流程。

 

1.2.2 如何让分词器分词

 

知道分词器如何工作了,但是现在还不明白分词如何分词。再回到1.1.2节,看到WhitespaceAnalyzer分词器似乎是学习的好选择。因为这个分词器只有遇到空格才会进行分词操作。

 

根据1.2.1的经验,直接查看WhitespaceTokenizer类。

 

 

代码1.2.2.1

 

Code

 

很好,这段代码很短,可是没有看到我们想要的东西。继续看父类。

 

 

代码1.2.2.2

 

Code

 

 

天公不作美,刚看到简单的,就来了个长的。无奈中。不过为什么要多一重继承呢?那就是有其他分词器也用到CharTokenizer了。而WhitespaceTokenizer中没有重写Next方法,而只是重写了IsTokenChar方法,几乎可以肯定。这个IsTokenChar才是重点。IsTokenChar故名思意,一看注释,果然!这个方法是判断是否遇到了分词的点的。这个其实和string类的Split方法相似。注意到Next方法关于IsTokenChar逻辑那一段,恩,果然是这样分词的。实际上就是拆分字符串嘛。

posted @ 2008-08-28 23:41 Birdshover 阅读(8153) 评论(19) 编辑 收藏

 回复 引用 查看   
#1楼2008-08-29 08:34 | jannock      
顶。。
楼主像明星啊.本质不错嘛.
 回复 引用 查看   
#3楼[楼主]2008-08-29 11:04 | Birdshover      
@中国股市必崩盘
==#

 回复 引用 查看   
#4楼2008-08-29 12:00 | jillzhang      
不错,学习了
 回复 引用 查看   
#5楼2008-08-29 15:51 | 小灰      
hehe
 回复 引用   
#6楼2008-08-29 16:10 | 过路人[未注册用户]
山西俱乐部的?

好象那里也就这么一个人能写点东西了

 回复 引用 查看   
#7楼[楼主]2008-08-29 22:52 | Birdshover      
@过路人
现在在山西上学,在俱乐部成立的时候就有我了,后来来上海了

 回复 引用 查看   
#8楼2008-08-31 23:18 | Jeffrey Zhao      
谢谢,谢谢
 回复 引用 查看   
#9楼[楼主]2008-09-01 02:17 | Birdshover      
@Jeffrey Zhao
这个回复,太大话西游了 ==!

 回复 引用 查看   
#10楼2008-10-03 17:09 | Doho      
Tokenize 有“切分”的意思,这里当然是“分词”了。
请问一下楼主,2.3.1版本的Lucene 稳定吗?你在项目应用当中会不会碰到一些新版本的问题。

 回复 引用   
#11楼2008-10-07 16:30 | cspioneer[未注册用户]
学习完毕。谢谢
 回复 引用 查看   
#12楼2008-10-21 10:21 | 红民      
学完了,谢谢!开始下一章
 回复 引用 查看   
#13楼2008-11-24 00:35 | 光年      
WOW
 回复 引用 查看   
#14楼2008-11-28 17:45 | 刚刚      
重在交流,呵呵,我是【学习ing】
 回复 引用   
#15楼2009-01-24 20:05 | 四当五落[未注册用户]
配合着JAVA版的书看的,呵呵。辛苦啊。不过LZ写这东西应当更辛苦,呵呵。谢谢啦
 回复 引用 查看   
#16楼2010-04-27 13:51 | 小伟地方      
.net高手
 回复 引用 查看   
#17楼2010-09-19 22:11 | iIMax      
继续下一章,多谢老板
 回复 引用 查看   
#18楼2011-03-10 00:33 | cj21828      
继续学习,继续顶
 回复 引用 查看   
#19楼2011-11-12 15:33 | 好色尘人、      
楼主以思路的方式来写blog。
很不错啊,受益匪浅。