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
之后的文章,会介绍一下如何在这个个Analyzer中引入短语检测和同义词检测。
- 大小: 9.2 KB
- 大小: 78.1 KB
分享到:
相关推荐
NULL 博文链接:https://qpshenggui.iteye.com/blog/1157999
NULL 博文链接:https://huashuizhuhui.iteye.com/blog/1197357
导入: import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.analysis.Analyzer; 实例化: Analyzer analyzer = new ThesaurusAnalyzer();
solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar
Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器 Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
Lucene5.21+IkAnalyzer2012_V5入门案例,看不懂你来打我。
此版本是基于IK-Analyzer-2012FF修改而来,专门适用于Lucene 5.2.1。 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它...
IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,true); for (int i = 0; i (); i++) { LuceneVO vo = (LuceneVO)list.get(i); Document doc = new Document(); Field FieldId = ...
提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。
Lucene4.7+IK Analyzer中文分词入门教程
支持高版本Lucene,包括最新的Lucene7.3.1,本人亲自测试过,绝对能用!
关于lucene的IKAnalyzer分词器以及与lucene4.3共同使用时发生的问题解决包
ikanalyzer-lucene-8.0.0.jar
里面含有lucene全文检索所需要的一些jar包以及中文检索器IKAnalyzer
lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词
lucene 所有jar包 包含IKAnalyzer分词器
该jar包之前只支持Lucene4.7.2,因为我自己的项目用到的是Lucene5.3.1,所以我自己重写了IKAnalyzer.java以及IKTokenizer.java,并且重新编译之后替换了之前的.class文件,现在可以适用于Lucene5.3.1