Analyzer,文本分析的过程,实质上是将输入文本转化为文本特征向量的过程。
Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以是TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucene Analyzer的过程如下图所示:Analyzer类是一个抽象类,是所有分析器的基类。为了定义分析器的具体工作
其子类必须通过自己的createComponents(String, Reader)方法来定义TokenStreamComponents。
在调用方法tokenStream(String, Reader)的时候,TokenStreamComponents会被重复使用。
2.TokenStreamComponents
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE该类封装了一个分词流的外部组件,简单封装输入Tokenizer和输出TokenStream
3.ReuseStrategy
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE定义Analyzer每次调用tokenStream(String, java.io.Reader)时,TokenStreamComponents的重用策略。
getReusableComponents(String fieldName)根据字段名获取可重用的TokenStreamComponents组建。
private CloseableThreadLocal storedValue = new CloseableThreadLocal();用于存储已有的TokenStreamComponents。
4.GlobalReuseStrategy
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE公共重用策略,所有的字段共用同一个TokenStreamComponents。
5.PerFieldReuseStrategy
为每一个field维持一个TokenStreamComponent Map。
key=field value=TokenStreamComponent
6.AnalyzerWrapper
使用PerFieldReuseStrategy作为重用策略的Analyzer封装类SimpleAnalyzer测试实例:
public class SimpleAnalyzerTest {
public static void analyze(Analyzer analyzer,String text)
{
try {
System.out.println("分词器:"+analyzer.getClass());
TokenStream tokenStream =analyzer.tokenStream("content", new StringReader(text));
tokenStream.reset();
while(tokenStream.incrementToken())
{
CharTermAttribute attribute=tokenStream.getAttribute(CharTermAttribute.class);
OffsetAttribute ffsetAttribute=tokenStream.getAttribute(OffsetAttribute.class);
System.out.println("["+offsetAttribute.startOffset()+","+offsetAttribute.endOffset()+","+attribute.toString()+"]");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
String enText = "No news is good news!";
String chText = "没消息,是,好消息!";
SimpleAnalyzer analyzer1 = new SimpleAnalyzer(Version.LUCENE_43);
analyze(analyzer1,enText);
analyze(analyzer1,chText);
}
}
输出结果:
分词器:class org.apache.lucene.analysis.core.SimpleAnalyzer
[0,2,no]
[3,7,news]
[8,10,is]
[11,15,good]
[16,20,news]
分词器:class org.apache.lucene.analysis.core.SimpleAnalyzer
[0,3,没消息]
[4,5,是]
[6,9,好消息] Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE
ae9bc497-4872-31d4-afe2-be571058e94a.jpg
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-765793/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28624388/viewspace-765793/