WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文,会保留原文中的破折号,以空格为边界,将空格间的内容切分为最小的语汇单元。
SimpleAnalyzer:功能强于WhitespaceAnalyzer,将所有的字符lowcase化,不支持中文,保留停用词,并以非字母字符作为单个语汇单元的边界。
StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上增加了去除StopWords的功能,不支持中文
StandardAnalyzer:英文的处理能力同于StopAnalyzer,保留XY&Z形式的单词,且会把email地址保留下来。支持中文采用的方法为单字切分。
以上四个Analyzer可以用下例来说明:
输入字符串:XY&Z mail is - xyz@sohu.com
=====Whitespace analyzer====
分析方法:空格分割
XY&Z
mail
is
-
xyz@sohu.com
=====Simple analyzer====
分析方法:空格及各种符号分割
xy
z
mail
is
xyz
sohu
com
=====stop analyzer====
分析方法:空格及各种符号分割,去掉停止词,停止词包括 is,are,in,on,the等无实际意义
的词
xy
z
mail
xyz
sohu
com
=====standard analyzer====
分析方法:混合分割,包括了去掉停止词,支持汉语
xy&z
mail
xyz@sohu.com
ChineseAnalyzer:来自于Lucene的sand box.性能类似于StandardAnalyzer,缺点是不支持中英文混和分词。
CJKAnalyzer:chedong写的CJKAnalyzer的功能在英文处理上的功能和StandardAnalyzer相同,但是在汉语的分词上,不能过滤掉标点符号,即使用二元切分。
TjuChineseAnalyzer:自定义的,功能最为强大。TjuChineseAnlyzer的功能相当强大,在中文分词方面由于其调用的为ICTCLAS的java接口.所以其在中文方面性能上同与ICTCLAS.其在英文分词上采用了Lucene的StopAnalyzer,可以去除 stopWords,而且可以不区分大小写,过滤掉各类标点符号。
各个Analyzer的功能已经比较介绍完毕了,现在咱们应该学写Analyzer,如何diy自己的analyzer呢??
如何DIY一个Analyzer
咱们写一个Analyzer,要求有一下功能
(1) 可以处理中文和英文,对于中文实现的是单字切分,对于英文实现的是以空格切分.
(2) 对于英文部分要进行小写化.
(3) 具有过滤功能,可以人工设定StopWords列表.如果不是人工设定,系统会给出默认的StopWords列表.
(4) 使用P-stemming算法对于英文部分进行词缀处理.
代码如下:
public final class DiyAnalyzer
extends Analyzer
{
private Set stopWords;
public static final String[] CHINESE_ENGLISH_STOP_WORDS =
{
"a", "an", "and", "are", "as", "at", "be", "but", "by",
"for", "if", "in", "into", "is", "it",
"no", "not", "of", "on", "or", "s", "such",
"t", "that", "the", "their", "then", "there", "these",
"they", "this", "to", "was", "will", "with",
"我", "我们"
};
public DiyAnalyzer()
{
this.stopWords=StopFilter.makeStopSet(CHINESE_ENGLISH_STOP_WORDS);
}
public DiyAnalyzer(String[] stopWordList)
{
this.stopWords=StopFilter.makeStopSet(stopWordList);
}
public TokenStream tokenStream(String fieldName, Reader reader)
{
TokenStream result = new StandardTokenizer(reader);
result = new LowerCaseFilter(result);
result = new StopFilter(result, stopWords);
result = new PorterStemFilter(result);
return result;
}
public static void main(String[] args)
{
//好像英文的结束符号标点.,StandardAnalyzer不能识别
String string = new String("我爱中国,我爱天津大学!I love China!Tianjin is a City");
Analyzer analyzer = new DiyAnalyzer();
TokenStream ts = analyzer.tokenStream("dummy", new StringReader(string));
Token token;
try
{
while ( (token = ts.next()) != null)
{
System.out.println(token.toString());
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
可以看见其后的结果如下:
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,1,2,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中,2,3,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(国,3,4,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,6,7,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(天,7,8,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(津,8,9,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(大,9,10,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(学,10,11,<CJK>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(i,12,13,<ALPHANUM>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(love,14,18,<ALPHANUM>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(china,19,24,<ALPHANUM>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(tianjin,25,32,<ALPHANUM>,1)
Token's (termText,startOffset,endOffset,type,positionIncrement) is:(citi,39,43,<ALPHANUM>,1)
到此为止这个简单的但是功能强大的分词器就写完了,下面咱们可以尝试写一个功能更强大的分词器.
如何DIY一个功能更加强大Analyzer
譬如你有词典,然后你根据正向最大匹配法或者逆向最大匹配法写了一个分词方法,却想在Lucene中应用,很简单,你只要把他们包装成Lucene的TokenStream就好了.下边我以调用中科院写的ICTCLAS接口为例,进行演示.你去中科院网站可以拿到此接口的free版本,谁叫你没钱呢,有钱,你就可以购买了.哈哈
好,由于ICTCLAS进行分词之后,在Java中,中间会以两个空格隔开!too easy,我们直接使用继承Lucene的WhiteSpaceTokenizer就好了.
所以TjuChineseTokenizer 看起来像是这样.
public class TjuChineseTokenizer extends WhitespaceTokenizer
{
public TjuChineseTokenizer(Reader readerInput)
{
super(readerInput);
}
}
而TjuChineseAnalyzer看起来象是这样
public final class TjuChineseAnalyzer
extends Analyzer
{
private Set stopWords;
/** An array containing some common English words that are not usually useful
for searching. */
/*
public static final String[] CHINESE_ENGLISH_STOP_WORDS =
{
"a", "an", "and", "are", "as", "at", "be", "but", "by",
"for", "if", "in", "into", "is", "it",
"no", "not", "of", "on", "or", "s", "such",
"t", "that", "the", "their", "then", "there", "these",
"they", "this", "to", "was", "will", "with",
"我", "我们"
};
*/
/** Builds an analyzer which removes words in ENGLISH_STOP_WORDS. */
public TjuChineseAnalyzer()
{
stopWords = StopFilter.makeStopSet(StopWords.SMART_CHINESE_ENGLISH_STOP_WORDS);
}
/** Builds an analyzer which removes words in the provided array. */
//提供独自的stopwords
public TjuChineseAnalyzer(String[] stopWords)
{
this.stopWords = StopFilter.makeStopSet(stopWords);
}
/** Filters LowerCaseTokenizer with StopFilter. */
public TokenStream tokenStream(String fieldName, Reader reader)
{
try
{
ICTCLAS splitWord = new ICTCLAS();
String inputString = FileIO.readerToString(reader);
//分词中间加入了空格
String resultString = splitWord.paragraphProcess(inputString);
System.out.println(resultString);
TokenStream result = new TjuChineseTokenizer(new StringReader(resultString));
result = new LowerCaseFilter(result);
//使用stopWords进行过滤
result = new StopFilter(result, stopWords);
//使用p-stemming算法进行过滤
result = new PorterStemFilter(result);
return result;
}
catch (IOException e)
{
System.out.println("转换出错");
return null;
}
}
public static void main(String[] args)
{
String string = "我爱中国人民";
Analyzer analyzer = new TjuChineseAnalyzer();
TokenStream ts = analyzer.tokenStream("dummy", new StringReader(string));
Token token;
System.out.println("Tokens:");
try
{
int n=0;
while ( (token = ts.next()) != null)
{
System.out.println((n++)+"->"+token.toString());
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
对于此程序的输出接口可以看一下
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,3,4,word,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中国,6,8,word,1)
2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(人民,10,12,word,1)
OK,经过这样一番讲解,你已经对Lucene的Analysis包认识的比较好了,当然如果你想更加了解,还是认真读读源码才好,
呵呵,源码说明一切!
分享到:
相关推荐
在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...
本文将深入探讨“PanGu.Lucene.Analyzer.dll”这一特定的分析器,它是专门为Lucene库设计的,旨在优化中文文本的处理。 首先,我们来了解一下Lucene。Lucene是一个高性能、全文检索库,由Apache软件基金会开发,...
《Lucene Analyzer剖析:中文分词的奥秘》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种系统中。其核心功能之一就是对输入文本进行高效精准的分词处理,以便进行后续的索引和查询操作。...
IKAnalyzer支持自定义词典,可以根据实际需求扩展分词效果。 模糊查询是Lucene中的一个重要特性,它允许用户输入部分关键词或者使用通配符来进行搜索。例如,用户可以输入"计算*"来查找所有以"计算"开头的词汇。在...
【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...
Elasticsearch 是一款功能强大的全文搜索引擎,而 IK Analyzer 是一个在 Lucene 上构建的智能中文分词库。本文将深入探讨如何将 Elasticsearch Analysis IK 插件应用于 Elasticsearch 中,以实现对中文文本的高效、...
IKAnalyzer采用了基于词典的分词方法,内置了丰富的中文词汇库,并支持自定义扩展。此外,IKAnalyzer还支持动态加载词典,能够较好地处理新出现的网络词汇。 使用IKAnalyzer与Lucene结合,构建全文搜索引擎的步骤...
1. **灵活的词典管理**:IKAnalyzer支持动态加载词典,用户可以根据需求自定义词典,方便地扩展或修改分词效果。 2. **智能的分词算法**:采用基于正向最大匹配和逆向最大匹配的混合策略,同时考虑了词语的常用度,...
IKAnalyzer5对词典进行了优化,提高了分词速度和准确性,支持动态加载词典,可自定义扩展词典,同时具备智能词组分词和精确模式,兼顾了搜索的准确性和效率。对于中文搜索引擎而言,分词的准确性至关重要,IK...
IKAnalyzer 是一个专门为 Lucene 设计的开源中文分词库,它在中文处理领域有着广泛的应用。这个版本的 IKAnalyzer 特别适用于 Lucene 5.2.1,这意味着它与该版本的 Lucene 兼容性极佳,能够提供高效、准确的中文分词...
IK Analyzer 3.0 是一个专为 Lucene 设计的开源中文分词器,它基于 Java 开发,提供轻量级且高效的分词功能。自2006年12月发布1.0版以来,IK Analyzer 经历了多次升级,3.0版已演变为独立于 Lucene 的通用分词组件,...
IKAnalyzer支持用户自定义词典,能够较好地处理现代汉语中的新词和网络用语,提高了中文信息检索的准确性。 此外,压缩包中还包含了其他几个Lucene的扩展模块。`lucene-kuromoji-3.6.1.jar`是针对日语文本的分析器...
在这个场景中,我们讨论的是如何在`Lucene 4.10`版本中,结合`IKAnalyzer 5.0`这个中文分词器来提取敏感词。 `Lucene`的核心功能之一是能够对输入的文档进行索引,以便快速地进行全文搜索。然而,在某些应用中,...
5. **使用自定义分词器**:在索引文档和执行查询时,使用你的自定义Analyzer实例。 在实际应用中,我们还需要关注性能和效率问题,例如,同义词库的加载和查询优化。同时,对于大型同义词库,可以考虑使用更高效的...
ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...
3. 可定制性:用户可以根据需求选择不同的分析器或者自定义分析器。 在Solr中应用这三个组件,可以实现高效的中文拼音搜索,特别是在处理多音字和首字母搜索时,能提供更灵活和准确的搜索体验。例如,用户可以通过...
1. 分词器(Analyzer)增强:此版本对分词器进行了优化,例如支持更多的语言和自定义规则,以提高分析效率和准确度。 2. 查询性能提升:引入了新的查询结构和优化,如`CachingWrapperQuery`,提高了查询缓存的性能。...
扩展词是IK Analyzer的一种特性,允许对基础词典进行扩展,包括添加自定义词汇或特定领域的专业术语。这使得IK Analyzer更加适应各种场景,特别是在处理行业特定或者个性化搜索需求时,能提供更精准的分词结果。 在...
在实际项目中,通常会创建一个自定义的Analyzer类,继承自IKAnalyzer,并在索引文档时使用这个类。对于高亮,可以使用`org.apache.lucene.search.highlight.Highlighter`类,配合`QueryScorer`和`...
5. **库文件夹**:`libs` 目录下可能包含了IK Analyzer运行所需的其他依赖库,如Lucene等,这些库文件对于IK Analyzer的正常工作至关重要。 6. **元数据**:`META-INF` 文件夹通常包含关于JAR文件本身的信息,如...