final StandardTokenizer src = new StandardTokenizer(getVersion(), reader);//創建分詞器
src.setMaxTokenLength(maxTokenLength);
TokenStream tok = new StandardFilter(getVersion(), src);//創建標準分詞過濾器
tok = new LowerCaseFilter(getVersion(), tok);//在標準分詞過濾器的基礎上加大小寫轉換過濾
tok = new StopFilter(getVersion(), tok, stopwords);//在上邊過濾器基礎上加停用詞過濾
//創建分析器
Analyzer analyzer = new StandardAnalyzer();
//得到TokenStream
TokenStream tokenStream = analyzer.tokenStream("content", new StringReader("Lucene is a Java full-text search engine"));
//設置tokenStream初始狀態,否則會拋異常
tokenStream.reset();
//設置要獲取分詞的偏移量
OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
//設置要獲取分詞的項
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
while(tokenStream.incrementToken()){
System.out.println("-----------------");
//起始偏移量
System.out.print("-->"+offsetAttribute.startOffset());
//截止偏移量
System.out.print("-->"+offsetAttribute.endOffset());
//分詞項的值
System.out.println("-->"+new String(charTermAttribute.toString()));
}
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
//查看分析器的分析效果
@Test
public void testAnalyzer() throws Exception {
//創建一分析器對象
// Analyzer analyzer = new StandardAnalyzer(); //標準
// Analyzer analyzer = new CJKAnalyzer();
// Analyzer analyzer = new SmartChineseAnalyzer();
Analyzer analyzer = new IKAnalyzer(); //使用最多的中文分析器
//獲得tokenStream對象
//第一個參數是域的名稱,可以給一個任意值
//第二個參數:要分析的文本內容
TokenStream tokenStream = analyzer.tokenStream("test", "闊小括高富帥Lucene是");
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
//調用reset方法
tokenStream.reset();
//遍歷關鍵詞列表
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute.toString());
}
//關閉tokenstream
tokenStream.close();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴展配置</comment>
<!-- 用戶可以在這裏配置自己的擴展字典 -->
<entry key="ext_dict">mydict.dic</entry>
<!-- 用戶可以在這裏配置自己的擴展停用詞字典 -->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
@Override
protected TokenStreamComponents createComponents(String s) {
Reader reader=null;
try{
reader=new StringReader(s);
MyWordTokenizer it = new MyWordTokenizer(reader);
return new Analyzer.TokenStreamComponents(it);
}finally {
IOUtils.closeWhileHandlingException(reader);
}
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import java.io.IOException;
import java.io.Reader;
public class MyWordTokenizer extends Tokenizer {
// IK分詞器實現
private IKSegmenter _IKImplement;
// 詞元文本屬性
private final CharTermAttribute termAtt;
// 詞元位移屬性
private final OffsetAttribute offsetAtt;
// 詞元分類屬性(該屬性分類參考org.wltea.analyzer.core.Lexeme中的分類常量)
private final TypeAttribute typeAtt;
// 記錄最後一個詞元的結束位置
private int endPosition;
public MyWordTokenizer(Reader in) {
this(in, true);
}
public MyWordTokenizer(Reader in, boolean useSmart) {
offsetAtt = addAttribute(OffsetAttribute.class);
termAtt = addAttribute(CharTermAttribute.class);
typeAtt = addAttribute(TypeAttribute.class);
_IKImplement = new IKSegmenter(input, useSmart);
}
@Override
public final boolean incrementToken() throws IOException {
// 清除所有的詞元屬性
clearAttributes();
Lexeme nextLexeme = _IKImplement.next();
if (nextLexeme != null) {
// 將Lexeme轉成Attributes
// 設置詞元文本
termAtt.append(nextLexeme.getLexemeText());
// 設置詞元長度
termAtt.setLength(nextLexeme.getLength());
// 設置詞元位移
offsetAtt.setOffset(nextLexeme.getBeginPosition(),
nextLexeme.getEndPosition());
// 記錄分詞的最後位置
endPosition = nextLexeme.getEndPosition();
// 記錄詞元分類
typeAtt.setType(nextLexeme.getLexemeTypeString());
// 返會true告知還有下個詞元
return true;
}
// 返會false告知詞元輸出完畢
return false;
}
public void reset() throws IOException {
super.reset();
_IKImplement.reset(input);
}
@Override
public final void end() {
// set final offset
int finalOffset = correctOffset(this.endPosition);
offsetAtt.setOffset(finalOffset, finalOffset);
}
}
@Test
public void createIKAnalyzer() throws Exception {
//中文分析器 IKAnalyzer
//Analyzer analyzer = new IKAnalyzer();
//獲得tokenStream對象
//第一個參數是域的名稱,可以給一個任意值
//第二個參數:要分析的文本內容
//TokenStream tokenStream = analyzer.tokenStream("createIKAnalyzer", "Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構");
Analyzer analyzer=new MyWordAnalyzer();
TokenStream tokenStream = analyzer.tokenStream("f", "傳智播客白富美也然並卵Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構");
//設置一個關鍵詞引用
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
//調用reset方法
tokenStream.reset();
//遍歷關鍵詞列表
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute.toString());
}
//關閉tokenstream
tokenStream.close();
}
下面是小編的微信轉帳二維碼,小編再次謝謝讀者的支持,小編會更努力的
----請看下方↓↓↓↓↓↓↓
百度搜索 Drools從入門到精通:可下載開源全套Drools教程
深度Drools教程不段更新中:
更多Drools實戰陸續發佈中………
掃描下方二維碼關注公衆號 ↓↓↓↓↓↓↓↓↓↓