深入浅出Lucene Analyzer
来源:互联网 发布:在家兼职淘宝客服58 编辑:程序博客网 时间:2024/05/24 01:42
想要了解更多,加QQ群72132378
Analyzer,或者说文本分析的过程,实质上是将输入文本转化为文本特征向量的过程。这里所说的文本特征,可以是词或者是短语。它主要包括以下四个步骤:
- 分词,将文本解析为单词或短语
- 归一化,将文本转化为小写
- 停用词处理,去除一些常用的、无意义的词
- 提取词干,解决单复数、时态语态等问题
Lucene Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以使TokenStream、Tokenizer,甚至是另一个TokenFilter。整个Lucene Analyzer的过程如下图所示:
上图中的一些名词的解释如下表所示:
类说明Token表示文中出现的一个词,它包含了词在文本中的位置信息Analyzer将文本转化为TokenStream的工具TokenStream文本符号的流Tokenizer在字符级别处理输入符号流TokenFilter在字符级别处理输入符号流,其输入可以是TokenStream、Tokenizer或者TokenFilter
Lucene Analyzer中,Tokenizer和TokenFilter的组织架构如下图所示:
Lucene提供了数十种内置的Tokenizer、TokenFilter以及Analyzer供开发人员使用,事实上大部分时候我们只会需要使用其中的某几种,比如标准分词器StandardTokenizer、空格分词器WhitespaceTokenizer、转化为小写格式的LowCaseFilter、提取词干的PoterStemFilter以及组合使用StandardTokenizer和多种TokenFilter的StandardAnalyzer,有关这些的资料网上很多了,这里就不再详细介绍了。
有些时候,Lucene内置提供的Analyzer或许不能满足我们的需求。下面一个例子叙述了如何使用定制的Analyzer。它的功能是提取词干、将输入规范化为小写并且使用指定的停用词表:
- public class PorterStemStopWordAnalyzer extends Analyzer {
- public static final String[] stopWords = { "and", "of", "the", "to", "is",
- "their", "can", "all", "i", "in" };
- public TokenStream tokenStream(String fieldName, Reader reader) {
- Tokenizer tokenizer = new StandardTokenizer(reader);
- TokenFilter lowerCaseFilter = new LowerCaseFilter(tokenizer);
- TokenFilter stopFilter = new StopFilter(lowerCaseFilter, stopWords);
- TokenFilter stemFilter = new PorterStemFilter(stopFilter);
- return stemFilter;
- }
- public static void main(String[] args) throws IOException {
- Analyzer analyzer = new PorterStemStopWordAnalyzer();
- String text = "Holmes, who first appeared in publication in 1887, was featured in four novels and 56 short stories. The first story, A Study in Scarlet, appeared in Beeton's Christmas Annual in 1887 and the second, The Sign of the Four, in Lippincott's Monthly Magazine in 1890. The character grew tremendously in popularity with the beginning of the first series of short stories in Strand Magazine in 1891; further series of short stories and two novels published in serial form appeared between then and 1927. The stories cover a period from around 1880 up to 1914.";
- Reader reader = new StringReader(text);
- TokenStream ts = analyzer.tokenStream(null, reader);
- Token token = ts.next();
- while (token != null) {
- System.out.println(token.termText());
- token = ts.next();
- }
- }
- }
从结果我们可以看出:
- StandardTokenizer将文本按照空格或标点分成词语
- LowerCaseFilter所有的输入都被转化为小写
- StopFilter消除了文中的停用词,比如"appeared between then and 1927"中的"and"
- PorterStemFilter提取了文中的词根,比如story和stories都被转化为stori
0 0
- 深入浅出Lucene Analyzer
- lucene Analyzer
- Lucene--Analyzer
- Lucene源码分析-- Analyzer
- Lucene中的Analyzer
- lucene 之 Analyzer
- lucene 分词器Analyzer
- Lucene Analyzer(分词器)
- Lucene初识之Analyzer
- lucene Analyzer 分词 一
- Lucene的分词器Analyzer
- Lucene的分词器Analyzer
- lucene之Analyzer之PaoDingAnalyzer
- Lucene的分词器Analyzer
- Lucene分词实现:Analyzer、TokenStream
- Lucene的分词器Analyzer
- Lucene基础篇3 Analyzer
- Lucene中文分词IK Analyzer
- 数据库事务的四大特性以及事务的隔离级别
- POJ2135 Farm Tour 最小费用流
- Stanford机器学习-Linear Regressioon with One Variable(1)
- 洛谷 P1605 迷宫
- 手机号码验证工具类
- 深入浅出Lucene Analyzer
- LightOJ 1149 Factors and Multiples【最小点覆盖】(这些图论专题的题目都好裸啊)
- Java编程思想重点笔记
- 运行python 时出现TypeError: obj() takes no parametrs
- spring中bean的scope属性
- SD卡工具类
- Java为什么计算时间从1970年1月1日开始
- select下拉框插件jquery.editable-select
- 铽罗机器人