1. 程式人生 > >Lucene 4.4.0中常用的幾個分詞器

Lucene 4.4.0中常用的幾個分詞器

一、WhitespaceAnalyzer

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

package 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();
		}

	}
}
二、SimpleAnalyzer

以非字母符來分割文字資訊,並將語彙單元統一為小寫形式,並去掉數字型別的字元。很明顯不適用於中文環境。

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,發現分詞效果很好