/**
*作者:夺天策 百度空间名:刹那剑欣
*转载请说明出处!
*/
这几天完成了我的中文分词算法,就着手把它加入到lucene中去,google,baidu一下,倒是有一些人写的中文分词,和加入的方法,但是那些都是符合他们自己写的分词算法的添加方法,没有讲到lucene的添加接口,没有将原理,于是就自己研究了下咯,看了下lucene的源代码,总结出方法,希望对现在还不知道的朋友会有帮助!!
源代码中主要分词器都在analysis 这个包中,在contrib中还有一些第三方的分词器,有一个中文分词器ChineseAnalyzer.java,但是他只是实现了二分(没两个汉字算作一个Token或者Term)方法的分词,对实际应用显然不能满足
所有的Analyzer都有一个抽象的父类Analyzer
lucene源代码:public abstract class Analyzer
每个子类的Analyzer都继承与这个类,并且实现这个类的tokenStream方法
lucene源代码:public abstract TokenStream tokenStream(String fieldName, Reader reader);
这个方法返回的是一个TokenStream实例(其实不是TokenStream实例,因为下面会开到TokenStream其实是一个抽象类,这里应该说是返回实现这个抽象类的实例)。要了解这个类,必须去看看这个类的源代码
TokenStream类:
public abstract class TokenStream {
/** Returns the next token in the stream, or null at EOS. */
public abstract Token next() throws IOException;
/** Releases resources associated with this stream. */
public void close() throws IOException {}
}
我们可以看到,这个类中有两个方法,主要的是一个next()方法,这个方法没调用一次反回一个Token实例,要想了解Token类,必须再看lucene的源代码咯
由于源代码有点长,贴出最核心的几个变量和方法
String termText; // the text of the term
int startOffset; // start in source text
int endOffset; // end in source text
String type = "word"; // lexical type
private int positionIncrement = 1;
public Token(String text, int start, int end) {
termText = text;
startOffset = start;
endOffset = end;
}
public Token(String text, int start, int end, String typ) {
termText = text;
startOffset = start;
endOffset = end;
type = typ;
}
。。。。。。
我们看到一个Token是有一个TermText,startOffset,endOffset,type,positionIncrement.....等组成,有两个构造函数。大体的结构就是这样了。下面我们看看个lucene现成的Analyzer的例子:SimpleAnalyzer.java
public final class SimpleAnalyzer extends Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader) {
return new LowerCaseTokenizer(reader);
}
}
我们看到他继承了Analyzer并且重写了方法tokenStream,返回一个TokenStream,我们知道TokenStream是一个抽象的类,LowerCaseTokenizer也是继承了这个抽象类,所以lucene可以这样返回一个LowerCaseTokenizer当作是 TokenStream,这里我们不再继续通过LowerCaseTokenizer分析下去了,因为LowerCaseTokenizer又是继承与 TokenFilter,而TokenFilter又是继承 TokenStream,有点乱。呵呵,我们这里只需要了解,新建的Analyzer需要继承Analyzer这个类,并且实现一个返回 TokenStream的tokenStream方法,而通过上面的分析,我们知道,我们只需要写一个类继承与TokenStream,并且实现其中 next()方法,比如我们起名为:KinggouTokenStream,这个类源代码如下:
public class KinggouTokenStream extends TokenStream{
public KinggouTokenStream(Reader reader){....//把reader对象变成String,并且在next方法中每次将一个词组封装为Token类型,然后返回!}
/**这个方法很关键,你每次next都必须返回一个 Token实例(在上面我有谈到),这里你可以在next方法中,实例化一个Token,并且把其中的TermText赋值为 分词出来的词组,然后startOffset和endOffset其实是这个次在整个token流中的首位置和尾位置,你可以通过分词得到的词组的 length去加基数去实现。
**/
public Token next() throws IOException{...............}
}
kinggouTokenStream 完成了,接下类写真正的Analyzer类,我们起名为KinggouAnalyzer,源代码如下:
public class kinggouAnalyzer extends Analyzer {
public TokenStream tokenStream(String filename, Reader reader) {
//你需要在kinggouTokenStream中把这个reader对象读取为String,并且分词,然后为next方法定 义每次返回一个Token对象
return new kinggouTokenStream(reader)
}
}
以上类都是便于理解写的,不一定保证能编译通过,只是写了主要的方法!
附上kinggou的写法:
--------------下面的是KinggouTokenStream,具体项目中我用SegmentOutInterface代替了-----------------
/**
* the interface of Segment to outside
* extend org.apache.lucene.analysis.TokenStream
* method: next() return Token
* 分词对外的接口,继承 lucene的TokenStream
*/
package com.kinggou.engine.segment;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
//SegmentOutInterface相当与上面的kinggouTokenStream
public class SegmentOutInterface extends TokenStream {
int start=0;
int end=0;
String list;
StringTokenizer st;
public SegmentOutInterface(String str){
//这里是分词的实现,分词实现有我写的一个具体的包,这里不写出
list=WordSegment.getInstance().Segment(str, " ");;
st=new StringTokenizer(list);
}
String temp;
Token tk;
/**
* 实现的核心方法
* */
@Override
public Token next() throws IOException {
if(st.hasMoreTokens()){
temp=st.nextToken();
end=start+temp.length();
tk=new Token(temp,start,end);
start=end+1;
//end=end+temp.length();
}else{
tk=null;
}
return tk;
}
}
---------------------------------下面的是kinggouAnalyzer----------------------
package com.kinggou.engine.index;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import com.kinggou.engine.segment.SegmentOutInterface;
public class kinggouAnalyzer extends Analyzer {
/**
* 改写的lucene自己的分析器
* */
@Override
public TokenStream tokenStream(String filename, Reader reader) {
StringBuffer str=new StringBuffer();
BufferedReader br=new BufferedReader(reader);
String temp="";
try {
temp = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
while(temp!=null){
str.append(temp);
try {
temp=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
return new SegmentOutInterface(str.toString());
}
}
ok,完毕。。。。
分享到:
相关推荐
《Lucene Analyzer剖析:中文分词的奥秘》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种系统中。其核心功能之一就是对输入...理解Analyzer的工作原理和特性,是掌握Lucene中文处理的关键。
lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词
标题中的"C# 中文分词 LUCENE IKAnalyzer"是指使用C#语言实现的一个中文分词工具,它基于开源全文检索引擎Lucene,并且采用了IKAnalyzer(智能汉字分词系统)的Java版本进行移植。Lucene是一个强大的、高性能的信息...
在Lucene.NET中,为了支持中文分词,通常需要结合第三方分词器,如IK Analyzer、HanLP、jieba.NET等。这些分词器具备丰富的词汇库和优秀的分词算法,能有效地对中文文本进行拆分。 - **IK Analyzer**:是一个开源的...
【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...
提供的ik-analyzer-solr6.x.jar文件就是IK Analyzer的一个版本,适用于Solr 6.x,能够很好地与Lucene集成,进行中文分词。 除了IK Analyzer,还有pinyin4j-2.5.0.jar,这是一个Java库,用于处理汉字的拼音转换。在...
总之,IK Analyzer 3.0 是一个强大而灵活的中文分词工具,它在处理中文文本方面表现出色,特别适合用于Lucene的全文检索系统。通过其独特的算法和特性,IK Analyzer 3.0 提升了分词速度,增强了查询性能,降低了系统...
IKAnalyzer是一款基于Java语言开发的中文分词工具包,它在Lucene的基础上进行了优化和扩展,特别适用于全文检索和自然语言处理任务。IKAnalyzer提供了强大的中文分词能力,能够有效地识别和处理中文词汇,提高了搜索...
本文将深入探讨一种基于Lucene的词典机械中文分词方法,该方法采用了反向机械分词算法,尤其关注对数字、英文以及中英文数字混合词的特殊处理,旨在提高分词速度和准确性。 首先,反向机械分词算法是一种常用的中文...
ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...
在IT领域,中文分词是搜索引擎和文本处理系统中的关键环节,它涉及到将连续的汉字序列分割成具有独立语义的词语。IKAnalyzer是一个开源的Java实现的中文分词器,设计目标是提供一个轻量级、高效且易扩展的中文处理...
提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析...
IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...
IKAnalyzer2012+lucene中文分词是一个用于搜索引擎或信息检索系统的中文处理工具,它结合了IKAnalyzer2012和lucene-core-3.6.0这两个关键组件,为处理中文文本提供了高效的分词服务。在这个组合中,IKAnalyzer是主要...
总之,理解并选择适合的Lucene中文分词器对于构建高效的全文检索系统至关重要。每个分词器都有其特点和局限性,开发者应根据实际应用场景,结合分词器的性能、可扩展性和词典支持等因素,做出最佳决策。
导入: import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.analysis.Analyzer; 实例化: Analyzer analyzer = new ThesaurusAnalyzer();
1. **中文分词器**:在Lucene中,针对中文的分词通常使用第三方插件,如IK Analyzer、jieba分词库或SmartChinese Analyzer。这些分词器能识别中文词汇并将其拆分为单个词元(Token)。 2. **配置分析器**:在...