- 浏览: 5819814 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
算法和数据结构分析:
由于Analysis包比较简单,不详述了!
算法:基于机械分词 1-gram,2-gram,HMM(如果使用ICTCLAS接口的话)
数据结构:部分源码用到了Set ,HashTable,HashMap
认真理解Token
Lucene中的Analysis包专门用于完成对于索引文件的分词.Lucene中的Token是一个非常重要的概念.
看一下其源码实现:
下面编一段代码来看一下
TestToken.java
注意看其结果如下所示
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我,0,1,<CJK>,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,1,2,<CJK>,1)
2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(天,2,3,<CJK>,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(大,3,4,<CJK>,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(但,5,6,<CJK>,1)
5->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我,6,7,<CJK>,1)
6->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(更,7,8,<CJK>,1)
7->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,8,9,<CJK>,1)
8->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中,9,10,<CJK>,1)
9->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(国,10,11,<CJK>,1)
注意:其中”,”被StandardAnalyzer给过滤掉了,所以大家注意第4个Token直接startOffset从5开始.
如果改用StopAnalyzer()
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我爱天大,0,4,word,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(但我更爱中国,5,11,word,1)
改用TjuChineseAnalyzer(我写的,下文会讲到如何去写)
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:(更,19,20,word,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,22,23,word,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中国,25,27,word,1)
讲明白了Token,咱们来看以下其他的东西
一个TokenStream是用来走访Token的iterator(迭代器)
看一下其源代码:
一个Tokenizer,is-a TokenStream(派生自TokenStream),其输入为Reader
看一下其源码如下:
一个TokenFilter is–a TokenStream(派生自TokenStream),其义如名就是用来完成对TokenStream的过滤操作,譬如
去StopWords,将Token变为小写等。
源码如下:
一个Analyzer就是一个TokenStream工厂
看一下其源码就:
好,现在咱们来看一下Lucene的Analysis包下面的各个类文件都是用来干什么的。按照字典排序。
Analysis包中的源码详解
Analyzer.java 上文已经讲过。
CharTokenizer.java 此类为简单一个抽象类,用来对基于字符的进行简单分词(tokenizer)
LetterTokenizer.java两个非字符之间的字符串定义为token(举例来说英文单词由空白隔开,那个两个空白之间的字符串即被定义为一个token。备注:对于绝大多数欧洲语言来说,这个类工作效能很好。当时对于不用空白符分割的亚洲语言,效能极差(譬如中日韩)。)
LowerCaseFilter.java is-a TokenFilter用于将字母小写化
LowerCaseTokenizer is-a Tokenizer功能上等价于LetterTokenizer+LowerCaseFilter
PerFieldAnalyzerWrapper是一个Analyzer,因为继承自Analyzer当不同的域(Field)需要不同的语言分析器(Analyzer)时,这个Analyzer就派上了用场。使用成员函数addAnalyzer可以增加一个非缺省的基于某个Field的analyzer。很少使用。
PorterStemFilter.java使用词干抽取算法对每一个token流进行词干抽取。
PorterStemmer.java 有名的P-stemming算法
SimpleAnalyzer.java
StopAnalyzer.java 具有过滤停用词的功能
StopFilter.java StopFilter为一个Filter,主要用于从token流中去除StopWords
Token.java 上面已讲.
TokenFilter.java 上面已经讲了
Tokenizer.java 上面已经讲了
TokenStream.java 上面已经讲了
WhitespaceAnalyzer.java
WhitespaceTokenizer.java 只是按照space区分Token.
由于Lucene的analyisis包下的Standard包下的StandardAnalyzer()功能很强大,而且支持CJK分词,我们简要说一下.
此包下的文件是有StandardTokenizer.jj经过javac命令生成的.由于是机器自动生成的代码,可能可读性很差,想了解的话好好看看那个StandardTokenizer.jj文件就会比较明了了.
Lucene常用的Analyzer功能概述.
WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文
SimpleAnalyzer:功能强于WhitespaceAnalyzer,将除去letter之外的符号全部过滤掉,并且将所有的字符lowcase化,不支持中文
StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上
增加了去除StopWords的功能,不支持中文
StandardAnalyzer:英文的处理能力同于StopAnalyzer.支持中文采用的方法为单字切分.
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算法对于英文部分进行词缀处理.
代码如下:
可以看见其后的结果如下:
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 看起来像是这样.
而TjuChineseAnalyzer看起来象是这样
对于此程序的输出接口可以看一下
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包认识的比较好了,当然如果你想更加了解,还是认真读读源码才好,
呵呵,源码说明一切!
由于Analysis包比较简单,不详述了!
算法:基于机械分词 1-gram,2-gram,HMM(如果使用ICTCLAS接口的话)
数据结构:部分源码用到了Set ,HashTable,HashMap
认真理解Token
Lucene中的Analysis包专门用于完成对于索引文件的分词.Lucene中的Token是一个非常重要的概念.
看一下其源码实现:
public final class Token { 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) public Token(String text, int start, int end, String typ) public void setPositionIncrement(int positionIncrement) public int getPositionIncrement() { return positionIncrement; } public final String termText() { return termText; } public final int startOffset() { return startOffset; } public void setStartOffset(int givenStartOffset) public final int endOffset() { return endOffset; } public void setEndOffset(int givenEndOffset) public final String type() { return type; } public String toString() }
下面编一段代码来看一下
TestToken.java
package org.apache.lucene.analysis.test; import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.standard.StandardAnalyzer; import java.io.*; public class TestToken { public static void main(String[] args) { String string = new String("我爱天大,但我更爱中国"); //Analyzer analyzer = new StandardAnalyzer(); Analyzer analyzer = new TjuChineseAnalyzer(); //Analyzer analyzer= new StopAnalyzer(); TokenStream ts = analyzer.tokenStream("dummy",new StringReader(string)); Token token; 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:(我,0,1,<CJK>,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,1,2,<CJK>,1)
2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(天,2,3,<CJK>,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(大,3,4,<CJK>,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(但,5,6,<CJK>,1)
5->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我,6,7,<CJK>,1)
6->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(更,7,8,<CJK>,1)
7->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,8,9,<CJK>,1)
8->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中,9,10,<CJK>,1)
9->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(国,10,11,<CJK>,1)
注意:其中”,”被StandardAnalyzer给过滤掉了,所以大家注意第4个Token直接startOffset从5开始.
如果改用StopAnalyzer()
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(我爱天大,0,4,word,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(但我更爱中国,5,11,word,1)
改用TjuChineseAnalyzer(我写的,下文会讲到如何去写)
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:(更,19,20,word,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(爱,22,23,word,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:(中国,25,27,word,1)
讲明白了Token,咱们来看以下其他的东西
一个TokenStream是用来走访Token的iterator(迭代器)
看一下其源代码:
public abstract class TokenStream { public abstract Token next() throws IOException; public void close() throws IOException {} }
一个Tokenizer,is-a TokenStream(派生自TokenStream),其输入为Reader
看一下其源码如下:
public abstract class Tokenizer extends TokenStream { protected Reader input; protected Tokenizer() {} protected Tokenizer(Reader input) { this.input = input; } public void close() throws IOException { input.close(); } }
一个TokenFilter is–a TokenStream(派生自TokenStream),其义如名就是用来完成对TokenStream的过滤操作,譬如
去StopWords,将Token变为小写等。
源码如下:
public abstract class TokenFilter extends TokenStream { protected TokenStream input; protected TokenFilter() {} protected TokenFilter(TokenStream input) { this.input = input; } public void close() throws IOException { input.close(); } }
一个Analyzer就是一个TokenStream工厂
看一下其源码就:
public abstract class Analyzer { public TokenStream tokenStream(String fieldName, Reader reader) { return tokenStream(reader); } public TokenStream tokenStream(Reader reader) { return tokenStream(null, reader); } }
好,现在咱们来看一下Lucene的Analysis包下面的各个类文件都是用来干什么的。按照字典排序。
Analysis包中的源码详解
Analyzer.java 上文已经讲过。
CharTokenizer.java 此类为简单一个抽象类,用来对基于字符的进行简单分词(tokenizer)
LetterTokenizer.java两个非字符之间的字符串定义为token(举例来说英文单词由空白隔开,那个两个空白之间的字符串即被定义为一个token。备注:对于绝大多数欧洲语言来说,这个类工作效能很好。当时对于不用空白符分割的亚洲语言,效能极差(譬如中日韩)。)
LowerCaseFilter.java is-a TokenFilter用于将字母小写化
LowerCaseTokenizer is-a Tokenizer功能上等价于LetterTokenizer+LowerCaseFilter
PerFieldAnalyzerWrapper是一个Analyzer,因为继承自Analyzer当不同的域(Field)需要不同的语言分析器(Analyzer)时,这个Analyzer就派上了用场。使用成员函数addAnalyzer可以增加一个非缺省的基于某个Field的analyzer。很少使用。
PorterStemFilter.java使用词干抽取算法对每一个token流进行词干抽取。
PorterStemmer.java 有名的P-stemming算法
SimpleAnalyzer.java
StopAnalyzer.java 具有过滤停用词的功能
StopFilter.java StopFilter为一个Filter,主要用于从token流中去除StopWords
Token.java 上面已讲.
TokenFilter.java 上面已经讲了
Tokenizer.java 上面已经讲了
TokenStream.java 上面已经讲了
WhitespaceAnalyzer.java
WhitespaceTokenizer.java 只是按照space区分Token.
由于Lucene的analyisis包下的Standard包下的StandardAnalyzer()功能很强大,而且支持CJK分词,我们简要说一下.
此包下的文件是有StandardTokenizer.jj经过javac命令生成的.由于是机器自动生成的代码,可能可读性很差,想了解的话好好看看那个StandardTokenizer.jj文件就会比较明了了.
Lucene常用的Analyzer功能概述.
WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文
SimpleAnalyzer:功能强于WhitespaceAnalyzer,将除去letter之外的符号全部过滤掉,并且将所有的字符lowcase化,不支持中文
StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上
增加了去除StopWords的功能,不支持中文
StandardAnalyzer:英文的处理能力同于StopAnalyzer.支持中文采用的方法为单字切分.
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包认识的比较好了,当然如果你想更加了解,还是认真读读源码才好,
呵呵,源码说明一切!
发表评论
-
JDK中有关23个经典设计模式
2011-09-27 22:42 2038看原文吧,清楚些: http://www.iteye.com/ ... -
java生成jar压缩包并运行
2011-07-23 19:01 3109原帖: http://ankye1234.blog.163.c ... -
Android开发之Java集合类性能分析
2011-04-02 19:46 6970对于Android开发者来说深入了解Java的集合类很有必要主 ... -
一些Java经典算法
2010-09-10 16:38 2921package com.worthtech.app.uti ... -
java给图片加上水印
2010-07-02 14:08 1953package com.langhua.ImageUtil ... -
htmlparser API
2010-07-02 14:03 13119htmlparser所有的filter htmlpar ... -
使用dom4j的xPath解析XML
2010-06-30 15:04 21072books.xml: <?xml version=&qu ... -
UUID生成随机编号(适用于数字字母混编)
2010-03-10 16:35 7166UUID(Universally Unique Identif ... -
Java忽略大小写替换和提取字符信息
2009-12-01 09:27 46531. replaceAll 不区分大小写替换字符: Str ... -
java图片裁剪原理
2009-12-01 09:19 3403原文地址:http://blog.csdn.net/lql87 ... -
Java生成高品质缩略图
2009-12-01 09:14 3149import java.awt.image.Buffere ... -
FileReader读取中文txt文件编码丢失问题(乱码)
2009-11-19 16:06 25797有一个UTF-8编码的文本文件,用FileReader读取到一 ... -
实战java反射机制-让你迅速认识java强大的反射机制
2009-11-12 10:53 2074http://stephen830.iteye.com/blo ... -
利用jxl.jar读取EXCEL文件
2009-11-05 15:49 43861 从Excel文件读取数据表 ... -
Lucene整合"庖丁解牛"中文分词包
2009-10-26 15:03 2284版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声 ... -
lucene学习笔记
2009-10-26 11:24 1706Lucene 其实很简单的,它最主要就是做两件事:建立索引和进 ... -
java实现截图和保存
2009-10-23 13:50 6022BufferedImage是个好类,和ImageIO和Grap ... -
java-Socket接受中文乱码的解决
2009-10-15 12:31 16253服务器发送一条数据如: BufferedReader in ... -
socket发送和接受数据
2009-10-14 14:13 2685import java.net.*; import ja ... -
java 实现判断某天是星期几
2009-09-25 13:41 6360首先对SimpleDateFormat有所了解,以下摘自jav ...
相关推荐
《深入理解Lucene分析器库:lucene-analysis.jar解析》 在信息检索和搜索引擎领域,Apache Lucene是一个广泛使用的开源全文检索库。它的核心功能包括文档的索引、搜索以及相关的高级特性。其中,"lucene-analysis....
总的来说,"lucene je-analysis jar包"是构建高效文本处理和分类系统的基石。正确选择和使用这两个库,可以极大地提高文本分析的准确性和效率。在实践中,开发者需要了解它们的工作原理,掌握其API的使用,并注意...
Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和需要文本检索功能的应用程序。Apache Lucene 4.7是该库的一个版本,它提供了丰富的功能和改进,使得开发者能够轻松地在他们的应用中...
这个组件是Lucene.Net针对中文分词和分析的一个专门模块,它包含了对中文文本处理的特定支持。在中文信息处理中,分词是至关重要的一步,因为中文句子没有明显的词边界。Lucene.Net.Analysis.Cn.dll集成了诸如...
本文将深入探讨"je-analysis-1.5.3"和"lucene-core-2.4.1"这两个分词组件,以及它们在相关场景中的应用。 首先,让我们了解什么是分词。分词,即词语切分,是自然语言处理(NLP)中的基本任务之一,它的目标是将...
这些在`analysis`包下的源码中可以找到,它们负责将原始文本转换为可搜索的术语。 3. **查询解析**:`QueryParser`类负责将用户的查询字符串转化为 Lucene 可识别的查询对象。源码中包含了对布尔查询、短语查询等...
标题提到的"MMAnalyzer 分词jar包"是基于Lucene的一个中文分词组件,名为Jeasy Analysis,具体版本为1.5.3。Jeasy Analysis是为了简化中文分词而设计的,它主要由"je-analysis-1.5.3.jar"这个文件组成。这个分词器在...
本篇文章将深入探讨MMAnalyzer的使用以及与之相关的两个核心JAR包:`jeasy.analysis.MMAnalyzer`和`lucene-core-2.4.1.jar`。 首先,MMAnalyzer是JeasyAnalysis的一部分,JeasyAnalysis是一个轻量级的中文分析库,...
同时,为了满足中文分词的需求,Paoding-Analysis应运而生,它是一款专门针对中文的分析器,能够高效准确地进行中文分词,为Lucene的中文搜索提供了强大支持。 Paoding-Analysis是Java开发的开源项目,其核心功能是...
《深入理解Lucene与JE-Analysis-1.5.3:构建高效全文检索系统》 在信息化社会,数据量的快速增长使得高效的全文检索技术变得至关重要。Lucene和JE-Analysis-1.5.3就是这样的两个关键组件,它们在Java环境中为开发者...
在Lucene 4.8.1中集成Paoding Analysis,首先需要将对应的jar包添加到项目依赖中。这通常可以通过Maven或Gradle来管理,确保Lucene库和Paoding Analysis库的正确引用。在完成库的引入后,我们需要配置Analyzer,指定...
Lucene.jar 架包是构建全文检索应用的基础,结合其他扩展库(如 Compass 和 Paoding Analysis),开发者可以构建出强大且高效的搜索系统。无论是在小型项目还是大型企业级应用中,Lucene 都是一个不可或缺的工具。...
2. **文本分析(Text Analysis)**: Lucene 内置了各种分词器(Analyzer),如英文的 StandardAnalyzer,用于将输入文本分解成有意义的单词。4.6.0 版本对分词器进行了优化,提高了语言处理的准确性和效率。 3. **...
1. 分析器(Analyzer):分析器是Lucene.NET中处理文本的核心组件,负责将原始输入文本转换为一系列的Token(分词结果)。对于中文,`Lucene.Net.Analysis.Cn.Standard.CJKStandardAnalyzer`是常用的选择,它包含...
总结来说,"je-analysis-1.5.3"和"lucene-core-2.9.2"这两个jar包分别提供了文本分析和全文检索的功能,它们的结合使用可以构建强大的文本处理和搜索解决方案。理解并熟练运用这些工具,对于提升Java应用程序的数据...
"je-analysis"可能是一个早期的中文分析器,用于对中文文本进行预处理,包括词典匹配、分词、去除停用词等步骤,以便于Lucene理解并处理中文内容。这在处理大量中文文档时尤其关键,因为中文没有明显的词边界,传统...
"中文分词器"在这里指的可能是 "je-analysis-1.5.1.jar",这是一个专门针对中文的分析工具,用于将中文文本分解成有意义的词汇(词)。Je-Analysis 可能是基于 Java 实现的,适用于 Lucene 和 Solr 等搜索引擎,它...
pinyinAnalyzer是Lucene的一个分析器,它利用了Pinyin4j的功能,能够将输入的中文文本分词并转化为拼音形式,以便于Lucene这样的全文搜索引擎进行索引和查询。而lucene-analyzers则是Lucene的一系列分析器集合,包含...
- **Analyzer API**: 如`org.apache.lucene.analysis.Analyzer`,提供了创建自定义分析器的方法,如`createComponents(String fieldName, Reader reader)`,用于创建TokenStream。 - **IndexWriter API**: 如`org....
本文将深入探讨如何将 Elasticsearch Analysis IK 插件应用于 Elasticsearch 中,以实现对中文文本的高效、精准分析。 **一、IK Analyzer 简介** IK Analyzer 是由国人开发的一款针对中文的 Lucene 分词器,其设计...