Lucene 4.4.0中常用的幾個分詞器
阿新 • • 發佈:2019-02-15
一、WhitespaceAnalyzer
以空格作為切詞標準,不對語彙單元進行其他規範化處理。很明顯這個實用英文,單詞之間用空格。
二、SimpleAnalyzerpackage bond.lucene.analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.util.Version; public class WhitespaceAnalyzerTest { public static void main(String[] args) { try { // 要處理的文字 // "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理"; String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4."; // 空格分詞器(以空格作為切詞標準,不對語彙單元進行其他規範化處理) WhitespaceAnalyzer wsa = new WhitespaceAnalyzer(Version.LUCENE_44); TokenStream ts = wsa.tokenStream("field", text); CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ts.reset(); while (ts.incrementToken()) { System.out.println(ch.toString()); } ts.end(); ts.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
以非字母符來分割文字資訊,並將語彙單元統一為小寫形式,並去掉數字型別的字元。很明顯不適用於中文環境。
package bond.lucene.analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.SimpleAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.util.Version; public class SimpleAnalyzerTest { public static void main(String[] args) { try { // 要處理的文字 // "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理"; String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4."; // 簡單分詞器(以非字母符來分割文字資訊,並將語彙單元統一為小寫形式,並去掉數字型別的字元) SimpleAnalyzer sa = new SimpleAnalyzer(Version.LUCENE_44); TokenStream ts = sa.tokenStream("field", text); CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ts.reset(); while (ts.incrementToken()) { System.out.println(ch.toString()); } ts.end(); ts.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
三、StopAnalyzer
停頓詞分析器會去除一些常有a,the,an等等,也可以自定義禁用詞,不適用於中文環境
package bond.lucene.analyzer; import java.util.Iterator; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.StopAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.util.CharArraySet; import org.apache.lucene.util.Version; public class StopAnalyzerTest { public static void main(String[] args) { try { // 要處理的文字 // "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理"; String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4."; // 自定義停用詞 String[] self_stop_words = { "分析", "release", "Apache" }; CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0, true); for (int i = 0; i < self_stop_words.length; i++) { cas.add(self_stop_words[i]); } // 加入系統預設停用詞 Iterator<Object> itor = StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator(); while (itor.hasNext()) { cas.add(itor.next()); } // 停用詞分詞器(去除一些常有a,the,an等等,也可以自定義禁用詞) StopAnalyzer sa = new StopAnalyzer(Version.LUCENE_44, cas); TokenStream ts = sa.tokenStream("field", text); CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class); ts.reset(); while (ts.incrementToken()) { System.out.println(ch.toString()); } ts.end(); ts.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
四、StandardAnalyzer
標準分析器是Lucene內建的分析器,會將語彙單元轉成小寫形式,並去除停用詞及標點符號,很明顯也是不適合於中文環境
package bond.lucene.analyzer;
import java.util.Iterator;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.Version;
public class StandardAnalyzerTest {
public static void main(String[] args) {
try {
// 要處理的文字
// "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理";
String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";
// 自定義停用詞
String[] self_stop_words = { "Lucene", "release", "Apache" };
CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0, true);
for (int i = 0; i < self_stop_words.length; i++) {
cas.add(self_stop_words[i]);
}
// 加入系統預設停用詞
Iterator<Object> itor = StandardAnalyzer.STOP_WORDS_SET.iterator();
while (itor.hasNext()) {
cas.add(itor.next());
}
// 標準分詞器(Lucene內建的標準分析器,會將語彙單元轉成小寫形式,並去除停用詞及標點符號)
StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_44, cas);
TokenStream ts = sa.tokenStream("field", text);
CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
ts.reset();
while (ts.incrementToken()) {
System.out.println(ch.toString());
}
ts.end();
ts.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
五、CJKAnalyzer
中日韓分析器,能對中,日,韓語言進行分析的分詞器,但是對中文支援效果一般,一般不用
package bond.lucene.analyzer;
import java.util.Iterator;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.Version;
public class CJKAnalyzerTest {
public static void main(String[] args) {
try {
// 要處理的文字
// "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";
String text = "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理";
// 自定義停用詞
String[] self_stop_words = { "使用", "一個", "管道" };
CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0, true);
for (int i = 0; i < self_stop_words.length; i++) {
cas.add(self_stop_words[i]);
}
// 加入系統預設停用詞
Iterator<Object> itor = CJKAnalyzer.getDefaultStopSet().iterator();
while (itor.hasNext()) {
cas.add(itor.next());
}
// CJK分詞器(C:China;J:Japan;K:Korea;能對中,日,韓語言進行分析的分詞器,對中文支援效果一般,基本不用於中文分詞)
CJKAnalyzer sa = new CJKAnalyzer(Version.LUCENE_44, cas);
TokenStream ts = sa.tokenStream("field", text);
CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
ts.reset();
while (ts.incrementToken()) {
System.out.println(ch.toString());
}
ts.end();
ts.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
六、SmartChineseAnalyzer
對中文支援稍好,但擴充套件性差,擴充套件詞庫,禁用詞庫和同義詞庫等不好處理
package bond.lucene.analyzer;
import java.util.Iterator;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.Version;
public class SmartChineseAnalyzerTest {
public static void main(String[] args) {
try {
// 要處理的文字
String text = "lucene分析器使用分詞器和過濾器構成一個“管道”,文字在流經這個管道後成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用於將文字按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單複數處理)等。lucene中的Tokenstram方法首先建立一個tokenizer物件處理Reader物件中的流式文字,然後利用TokenFilter對輸出流進行過濾處理";
// 自定義停用詞
String[] self_stop_words = { "的", "了", "呢", ",", "0", ":", ",", "是", "流" };
CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0, true);
for (int i = 0; i < self_stop_words.length; i++) {
cas.add(self_stop_words[i]);
}
// 加入系統預設停用詞
Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();
while (itor.hasNext()) {
cas.add(itor.next());
}
// 中英文混合分詞器(其他幾個分詞器對中文的分析都不行)
SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_44, cas);
TokenStream ts = sca.tokenStream("field", text);
CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);
ts.reset();
while (ts.incrementToken()) {
System.out.println(ch.toString());
}
ts.end();
ts.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
針對中文的分詞處理,整體來說,Lucene的處理不是很好的,我同學推薦了一個分詞效果好,擴充套件起來也很方便的開源庫
http://nlp.stanford.edu/software/segmenter.shtml
現在還沒有研究,運行了一個demo,發現分詞效果很好