? 【分詞器】介紹六個Lucene 4.4.0常用的分詞器-【元標seo】

【分詞器】介紹六個Lucene 4.4.0常用的分詞器

作者: 杭州網站優化公司 分類: seo分詞技術 發布時間: 2018-05-11 17:21 0

一、WhitespaceAnalyzer

以空格作為切詞標準,不對語匯單元進行其他規范化處理。很明顯這個實用英文,單詞之間用空格。

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import org.apache.lucene.analysis.TokenStream;  
  4. import org.apache.lucene.analysis.core.WhitespaceAnalyzer;  
  5. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  6. import org.apache.lucene.util.Version;  
  7.   
  8. public class WhitespaceAnalyzerTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             // 要處理的文本  
  13.             // "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  14.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  15.   
  16.             // 空格分詞器(以空格作為切詞標準,不對語匯單元進行其他規范化處理)  
  17.             WhitespaceAnalyzer wsa = new WhitespaceAnalyzer(Version.LUCENE_44);  
  18.   
  19.             TokenStream ts = wsa.tokenStream("field", text);  
  20.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  21.   
  22.             ts.reset();  
  23.             while (ts.incrementToken()) {  
  24.                 System.out.println(ch.toString());  
  25.             }  
  26.             ts.end();  
  27.             ts.close();  
  28.         } catch (Exception ex) {  
  29.             ex.printStackTrace();  
  30.         }  
  31.   
  32.     }  
  33. }  
二、SimpleAnalyzer

以非字母符來分割文本信息,并將語匯單元統一為小寫形式,并去掉數字類型的字符。很明顯不適用于中文環境。

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import org.apache.lucene.analysis.TokenStream;  
  4. import org.apache.lucene.analysis.core.SimpleAnalyzer;  
  5. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  6. import org.apache.lucene.util.Version;  
  7.   
  8. public class SimpleAnalyzerTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             // 要處理的文本  
  13.             // "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  14.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  15.   
  16.             // 簡單分詞器(以非字母符來分割文本信息,并將語匯單元統一為小寫形式,并去掉數字類型的字符)  
  17.             SimpleAnalyzer sa = new SimpleAnalyzer(Version.LUCENE_44);  
  18.   
  19.             TokenStream ts = sa.tokenStream("field", text);  
  20.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  21.   
  22.             ts.reset();  
  23.             while (ts.incrementToken()) {  
  24.                 System.out.println(ch.toString());  
  25.             }  
  26.             ts.end();  
  27.             ts.close();  
  28.         } catch (Exception ex) {  
  29.             ex.printStackTrace();  
  30.         }  
  31.     }  
  32.   
  33. }  

三、StopAnalyzer

停頓詞分析器會去除一些常有a,the,an等等,也可以自定義禁用詞,不適用于中文環境

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.core.StopAnalyzer;  
  7. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  8. import org.apache.lucene.analysis.util.CharArraySet;  
  9. import org.apache.lucene.util.Version;  
  10.   
  11. public class StopAnalyzerTest {  
  12.   
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 要處理的文本  
  16.             // "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  17.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  18.   
  19.             // 自定義停用詞  
  20.             String[] self_stop_words = { "分析""release""Apache" };  
  21.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
  22.             for (int i = 0; i < self_stop_words.length; i++) {  
  23.                 cas.add(self_stop_words[i]);  
  24.             }  
  25.   
  26.             // 加入系統默認停用詞  
  27.             Iterator<Object> itor = StopAnalyzer.ENGLISH_STOP_WORDS_SET.iterator();  
  28.             while (itor.hasNext()) {  
  29.                 cas.add(itor.next());  
  30.             }  
  31.   
  32.             // 停用詞分詞器(去除一些常有a,the,an等等,也可以自定義禁用詞)  
  33.             StopAnalyzer sa = new StopAnalyzer(Version.LUCENE_44, cas);  
  34.   
  35.             TokenStream ts = sa.tokenStream("field", text);  
  36.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  37.   
  38.             ts.reset();  
  39.             while (ts.incrementToken()) {  
  40.                 System.out.println(ch.toString());  
  41.             }  
  42.             ts.end();  
  43.             ts.close();  
  44.         } catch (Exception ex) {  
  45.             ex.printStackTrace();  
  46.         }  
  47.     }  
  48. }  

四、StandardAnalyzer

標準分析器是Lucene內置的分析器,會將語匯單元轉成小寫形式,并去除停用詞及標點符號,很明顯也是不適合于中文環境

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  8. import org.apache.lucene.analysis.util.CharArraySet;  
  9. import org.apache.lucene.util.Version;  
  10.   
  11. public class StandardAnalyzerTest {  
  12.   
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 要處理的文本  
  16.             // "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  17.             String text = "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  18.   
  19.             // 自定義停用詞  
  20.             String[] self_stop_words = { "Lucene""release""Apache" };  
  21.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
  22.             for (int i = 0; i < self_stop_words.length; i++) {  
  23.                 cas.add(self_stop_words[i]);  
  24.             }  
  25.   
  26.             // 加入系統默認停用詞  
  27.             Iterator<Object> itor = StandardAnalyzer.STOP_WORDS_SET.iterator();  
  28.             while (itor.hasNext()) {  
  29.                 cas.add(itor.next());  
  30.             }  
  31.   
  32.             // 標準分詞器(Lucene內置的標準分析器,會將語匯單元轉成小寫形式,并去除停用詞及標點符號)  
  33.             StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_44, cas);  
  34.   
  35.             TokenStream ts = sa.tokenStream("field", text);  
  36.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  37.   
  38.             ts.reset();  
  39.             while (ts.incrementToken()) {  
  40.                 System.out.println(ch.toString());  
  41.             }  
  42.             ts.end();  
  43.             ts.close();  
  44.         } catch (Exception ex) {  
  45.             ex.printStackTrace();  
  46.         }  
  47.     }  
  48.   
  49. }  

五、CJKAnalyzer

中日韓分析器,能對中,日,韓語言進行分析的分詞器,但是對中文支持效果一般,一般不用

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
  7. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  8. import org.apache.lucene.analysis.util.CharArraySet;  
  9. import org.apache.lucene.util.Version;  
  10.   
  11. public class CJKAnalyzerTest {  
  12.   
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 要處理的文本  
  16.   
  17.             // "The Lucene PMC is pleased to announce the release of the Apache Solr Reference Guide for Solr 4.4.";  
  18.             String text = "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  19.   
  20.             // 自定義停用詞  
  21.             String[] self_stop_words = { "使用""一個""管道" };  
  22.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
  23.             for (int i = 0; i < self_stop_words.length; i++) {  
  24.                 cas.add(self_stop_words[i]);  
  25.             }  
  26.   
  27.             // 加入系統默認停用詞  
  28.             Iterator<Object> itor = CJKAnalyzer.getDefaultStopSet().iterator();  
  29.             while (itor.hasNext()) {  
  30.                 cas.add(itor.next());  
  31.             }  
  32.   
  33.             // CJK分詞器(C:China;J:Japan;K:Korea;能對中,日,韓語言進行分析的分詞器,對中文支持效果一般,基本不用于中文分詞)  
  34.             CJKAnalyzer sa = new CJKAnalyzer(Version.LUCENE_44, cas);  
  35.   
  36.             TokenStream ts = sa.tokenStream("field", text);  
  37.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  38.   
  39.             ts.reset();  
  40.             while (ts.incrementToken()) {  
  41.                 System.out.println(ch.toString());  
  42.             }  
  43.             ts.end();  
  44.             ts.close();  
  45.         } catch (Exception ex) {  
  46.             ex.printStackTrace();  
  47.         }  
  48.     }  
  49.   
  50. }  

六、SmartChineseAnalyzer

對中文支持稍好,但擴展性差,擴展詞庫,禁用詞庫和同義詞庫等不好處理

 

[java]  
 
 
  1. package bond.lucene.analyzer;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;  
  7. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  8. import org.apache.lucene.analysis.util.CharArraySet;  
  9. import org.apache.lucene.util.Version;  
  10.   
  11. public class SmartChineseAnalyzerTest {  
  12.   
  13.     public static void main(String[] args) {  
  14.         try {  
  15.             // 要處理的文本  
  16.             String text = "lucene分析器使用分詞器和過濾器構成一個“管道”,文本在流經這個管道后成為可以進入索引的最小單位,因此,一個標準的分析器有兩個部分組成,一個是分詞器tokenizer,它用于將文本按照規則切分為一個個可以進入索引的最小單位。另外一個是TokenFilter,它主要作用是對切出來的詞進行進一步的處理(如去掉敏感詞、英文大小寫轉換、單復數處理)等。lucene中的Tokenstram方法首先創建一個tokenizer對象處理Reader對象中的流式文本,然后利用TokenFilter對輸出流進行過濾處理";  
  17.   
  18.             // 自定義停用詞  
  19.             String[] self_stop_words = { "的""了""呢"",""0"":"",""是""流" };  
  20.             CharArraySet cas = new CharArraySet(Version.LUCENE_44, 0true);  
  21.             for (int i = 0; i < self_stop_words.length; i++) {  
  22.                 cas.add(self_stop_words[i]);  
  23.             }  
  24.   
  25.             // 加入系統默認停用詞  
  26.             Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();  
  27.             while (itor.hasNext()) {  
  28.                 cas.add(itor.next());  
  29.             }  
  30.   
  31.             // 中英文混合分詞器(其他幾個分詞器對中文的分析都不行)  
  32.             SmartChineseAnalyzer sca = new SmartChineseAnalyzer(Version.LUCENE_44, cas);  
  33.   
  34.             TokenStream ts = sca.tokenStream("field", text);  
  35.             CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  
  36.   
  37.             ts.reset();  
  38.             while (ts.incrementToken()) {  
  39.                 System.out.println(ch.toString());  
  40.             }  
  41.             ts.end();  
  42.             ts.close();  
  43.         } catch (Exception ex) {  
  44.             ex.printStackTrace();  
  45.         }  
  46.     }  
  47.   
  48. }  

針對中文的分詞處理,整體來說,Lucene的處理不是很好的,我同學推薦了一個分詞效果好,擴展起來也很方便的開源庫

http://nlp.stanford.edu/software/segmenter.shtml

現在還沒有研究,運行了一個demo,發現分詞效果很好

轉載請注明出處:http://www./seojishu/fenci/1015.html