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,发现分词效果很好



展开阅读全文

没有更多推荐了,返回首页