- 今天我在学lucene 的分词原理。由于工作很忙每天只有晚上的一点时间来学习。但是要学习的东西有很多很多。为了追求速度,所以有些东西只看一遍就不看了。所以在这里记下来方便以后查看
- Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数
- lucene 分词首先通过tonkenier进行分词(有很多很多的tonkenier),然后交给tokenfilter 进行过滤 有些将停用词过滤,有些不会把停用词过滤掉。不同的分词器,tokenizer 不同。
TokenStream tokenStream = a.tokenStream("content",new StringReader(str));
- tokenStream 可以理解为一组流 里面有很多很多的token 每一个token是一个一个过滤出来的单词 我们可以通过 tokenStrem.incrementToken(); 取出来。在取来的同时我们查看他的分词信息
public void displayAllTokenInfo(String str,Analyzer a){
try {
TokenStream tokenStream = a.tokenStream("content",new StringReader(str));
tokenStream.reset();
CharTermAttribute cat = tokenStream.addAttribute(CharTermAttribute.class);//分出来的单词
OffsetAttribute offset = tokenStream.addAttribute(OffsetAttribute.class);//分词的偏移量
//位置增量
PositionIncrementAttribute posi= tokenStream.addAttribute(PositionIncrementAttribute.class);//分词的偏移量
//默认分词的类别word 可以自定义自己的分词类别
TypeAttribute type= tokenStream.addAttribute(TypeAttribute.class);//分词的偏移量
for(;tokenStream.incrementToken();){
System.out.print(posi.getPositionIncrement()+": ");
System.out.print("["+cat+"]"+"偏移量:"
+ ""+"["+offset.startOffset()+"--"+offset.endOffset()+"] 类型:"+ type.type() +"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这里我们把分词器传进入:进行测试
@Test
public void testAllAnalyzer() {
StandardAnalyzer standardAnalyzer = new StandardAnalyzer();
StopAnalyzer stopAnalyzer = new StopAnalyzer();
SimpleAnalyzer simpleAnalyzer = new SimpleAnalyzer();
WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer();
String content ="how are you thank you";
LuceneAnalyzer l = new LuceneAnalyzer();
l.displayAllTokenInfo(content, standardAnalyzer);
System.out.println("--------------");
l.displayAllTokenInfo(content, stopAnalyzer);
System.out.println("--------------");
l.displayAllTokenInfo(content, simpleAnalyzer);
System.out.println("--------------");
l.displayAllTokenInfo(content, whitespaceAnalyzer);
}
输入结果如下:
1: [how]偏移量:[0--3] 类型:<ALPHANUM>
2: [you]偏移量:[8--11] 类型:<ALPHANUM>
1: [thank]偏移量:[12--17] 类型:<ALPHANUM>
1: [you]偏移量:[18--21] 类型:<ALPHANUM>
--------------
1: [how]偏移量:[0--3] 类型:word
2: [you]偏移量:[8--11] 类型:word
1: [thank]偏移量:[12--17] 类型:word
1: [you]偏移量:[18--21] 类型:word
--------------
1: [how]偏移量:[0--3] 类型:word
1: [are]偏移量:[4--7] 类型:word
1: [you]偏移量:[8--11] 类型:word
1: [thank]偏移量:[12--17] 类型:word
1: [you]偏移量:[18--21] 类型:word
--------------
1: [how]偏移量:[0--3] 类型:word
1: [are]偏移量:[4--7] 类型:word
1: [you]偏移量:[8--11] 类型:word
1: [thank]偏移量:[12--17] 类型:word
1: [you]偏移量:[18--21] 类型:word
我们还可以自己定义要停用的词,我会在以后的博客中写到,刚刚学习lucene 理解的不对的地方还请大家多多包涵,互相交流