`
m635674608
  • 浏览: 5043546 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

mmseg 同义词分析器 SolrSynonymParser

 
阅读更多
package synonym;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.core.LowerCaseFilter;
import org.apache.lucene.analysis.core.StopFilter;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.en.PorterStemFilter;
import org.apache.lucene.analysis.synonym.SolrSynonymParser;
import org.apache.lucene.analysis.synonym.SynonymFilter;
import org.apache.lucene.analysis.synonym.SynonymMap;
import org.apache.lucene.analysis.synonym.WordnetSynonymParser;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.CharsRef;
import org.apache.lucene.util.Version;

import com.chenlb.mmseg4j.Dictionary;
import com.chenlb.mmseg4j.MaxWordSeg;
import com.chenlb.mmseg4j.Seg;
import com.chenlb.mmseg4j.analysis.MMSegTokenizer;
import com.chenlb.mmseg4j.analysis.SimpleAnalyzer;

public class MMSegAnalyzer extends Analyzer {

	protected Dictionary dic;

	/**
	 * @see Dictionary#getInstance()
	 */
	public MMSegAnalyzer() {
		dic = Dictionary.getInstance();
	}

	/**
	 * @param path
	 *            词库路径
	 * @see Dictionary#getInstance(String)
	 */
	public MMSegAnalyzer(String path) {
		dic = Dictionary.getInstance(path);
	}

	/**
	 * @param path
	 *            词库目录
	 * @see Dictionary#getInstance(File)
	 */
	public MMSegAnalyzer(File path) {
		dic = Dictionary.getInstance(path);
	}

	public MMSegAnalyzer(Dictionary dic) {
		super();
		this.dic = dic;
	}

	protected Seg newSeg() {
		return new MaxWordSeg(dic);
	}

	public Dictionary getDict() {
		return dic;
	}

	// 自定义停用词
	private static final String[] stopWords = { "and", "of", "the", "to", "is",
			"their", "can", "all" };
	
	static SynonymMap synonymMap=null;
	
	static
	{
		synonymMap = getSynonymMap("e:\\synonym.txt");
	}
	
	
	

	@Override
	protected TokenStreamComponents createComponents(String fieldName,
			Reader reader) {
		// 创建一个分词器
		// Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_47,
		// reader);

		Tokenizer tokenizer = new MMSegTokenizer(newSeg(), reader);

		// 创建一系列的分词过滤器
		TokenFilter lowerCaseFilter = new LowerCaseFilter(Version.LUCENE_47,
				tokenizer);
		TokenFilter synonymFilter = new SynonymFilter(lowerCaseFilter,synonymMap, true);
		
		//TokenFilter synonymFilter = new SynonymFilter(lowerCaseFilter,getSynonymMap(), true);
		
		
		TokenFilter stopFilter = new StopFilter(Version.LUCENE_47,synonymFilter, buildCharArraySetFromArry(stopWords));
		TokenFilter stemFilter = new PorterStemFilter(stopFilter);

		// TokenStream的包装类 在2.2之中 是TokenStream
		return new TokenStreamComponents(tokenizer, stemFilter);
	}

	// 将数组转成lucene可识别的CharArraySet对象 CharArraySet类似java.util.set
	private CharArraySet buildCharArraySetFromArry(String[] array) {
		CharArraySet set = new CharArraySet(Version.LUCENE_47, array.length,
				true);
		for (String value : array) {
			set.add(value);
		}
		return set;
	}

	// 创建一个同义词表
	private static SynonymMap getSynonymMap(String path) {
		File file = new File(path);
		try {
			// FileReader fileReader = new FileReader(file);

			// System.out.println(IOUtils.toString(fileReader));
			/*
			 * SynonymMap.Builder parser = null; parser = new
			 * WordnetSynonymParser(true, true, new SimpleAnalyzer());
			 * ((WordnetSynonymParser) parser).parse(new InputStreamReader(new
			 * FileInputStream(file))); SynonymMap map = parser.build();
			 */

			/*WordnetSynonymParser parser = new WordnetSynonymParser(true, true,
					new SimpleAnalyzer());
			parser.parse(new InputStreamReader(new FileInputStream(file)));
			*/
			SynonymMap.Builder parser = null;
			parser = new SolrSynonymParser(true, true, new WhitespaceAnalyzer(
					Version.LUCENE_47));
			((SolrSynonymParser) parser).parse(new InputStreamReader(new FileInputStream(file)));
			
			SynonymMap map = parser.build();
			System.out.println(map);
			return map;
		} catch (Exception e) {
			e.printStackTrace();
			throw new IllegalArgumentException("failed to build synonyms", e);
		}
	}
	
	

	// 创建一个同义词表
	private SynonymMap getSynonymMap() {
		String base1 = "fast";
		String syn1 = "rapid";

		String base2 = "slow";
		String syn2 = "sluggish";

		String base3 = "中国";
		String syn3 = "天朝";

		SynonymMap.Builder sb = new SynonymMap.Builder(true);
		sb.add(new CharsRef(base1), new CharsRef(syn1), true);
		sb.add(new CharsRef(base2), new CharsRef(syn2), true);
		sb.add(new CharsRef(base3), new CharsRef(syn3), true);

		sb.add(new CharsRef(syn3), new CharsRef(base3), true);

		SynonymMap smap = null;
		try {
			smap = sb.build();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return smap;
	}

	// 测试方法
	public static void testPorterStemmingAnalyzer() throws IOException {
		Analyzer analyzer = new MMSegAnalyzer();
		String text = "Collective slow intelligence and Web2.0, fast and rapid2  天朝  柿子";
		Reader reader = new StringReader(text);
		TokenStream ts = null;
		try {
			ts = analyzer.tokenStream(null, reader);
			 //ts.reset();
			while (ts.incrementToken()) {
				CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);
				System.out.println(ta.toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) throws IOException {
		testPorterStemmingAnalyzer();
	}

}

 

分享到:
评论

相关推荐

    es 同义词 热更新 1.1版本

    4. `MMsegAnalysisBinderProcessor.java` - 这个类可能是与MMSEG分析器绑定的处理器,它可能在Elasticsearch的分析流程中起作用,确保同义词过滤器与MMSEG分词器协同工作,以提供完整的同义词支持。 综合以上信息,...

    mmseg4j分词器,内含词库

    **mmseg4j分词器详解** mmseg4j是一个基于Java实现的中文分词工具,它在中文信息处理领域有着广泛的应用。该工具的主要功能是将连续的汉字序列分割成具有语义的词语,这一过程称为分词。在中文自然语言处理(NLP)...

    ik+mmseg分词器

    3. 修改 Solr 的配置文件,如 `solrconfig.xml`,在 `<searcher>` 标签内添加 IK 分词器的查询分析器和更新分析器配置。 4. 同样,在对应的 `schema.xml` 或 `managed-schema` 文件中,设置字段类型为使用 IK 分词器...

    mmseg4j-core, 用于java中文分析器的mmseg4j核心 MMSEG.zip

    mmseg4j-core, 用于java中文分析器的mmseg4j核心 MMSEG <dependency> <groupId>com.chenlb.mmseg4j</groupId> <artifactId>mmseg4j-core</artif

    mmseg4j分词器jar包

    **mmseg4j分词器** 是一个专为Java平台设计的中文分词库,它在中文信息处理领域中扮演着重要的角色。该库的主要功能是将连续的汉字序列分割成具有语义意义的词语,这是自然语言处理(NLP)中的基础任务,对搜索引擎...

    兼容solr4.10.3的mmseg4j-1.9.1分词器

    通过配置Solr的分析器,可以将mmseg4j设置为默认的分词器。 3. **分析模块**:mmseg4j-analysis可能包含更复杂的文本处理功能,如词性标注、停用词过滤等,这些对于信息检索和自然语言理解至关重要。 4. **版本...

    mmseg-0.7.3_mmseg0.7.3_

    标题“mmseg-0.7.3_mmseg0.7.3_”指的是一个特定版本的中文分词库,mmseg的0.7.3版本。这个库是用于处理中文文本,将连续的汉字序列切分成有意义的词汇,即进行中文分词。中文分词是自然语言处理(NLP)中的基础步骤...

    跟益达学Solr5之使用MMSeg4J分词器

    2. **配置Solr**:接下来,你需要在Solr的配置文件(通常是solrconfig.xml)中定义一个新的分析器链,指定使用MMSeg4J分词器。例如: ```xml ``` 这里`dictionary`属性指定了字典文件的位置,字典文件...

    mmseg4j-solr-2.4.0.jar

    通常,这涉及到创建一个新的字段类型,并配置对应的分析器,如`<fieldType name="text_mmseg" class="solr.TextField">`,然后在`<analyzer>`标签内指定`<tokenizer class="com.chenlb.mmseg4j.solr....

    MMSeg 算法分词

    mmseg4j core 使用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器。 MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说...

    Solr3.2 + mmseg4j-1.8.4中文搜索引擎_Demo

    在"Solr3.2+mmseg4j-1.8.4中文搜索引擎 demo"项目中,`paoding-analysis.jar`是包含mmseg4j分析器的Java库文件,它提供了与Solr交互的接口,使得Solr能够使用mmseg4j进行中文分词。`readme.txt`通常包含了关于如何...

    mmseg-0.7.3.tar.gz

    在Sphinx中配置和使用LibMMSeg,需要在配置文件中指定分词器为mmseg,并配置相关的词典文件。一旦设置完成,Sphinx在构建索引时会调用MMSeg进行分词,将每个文档内容分解成独立的词语,然后建立索引。在查询阶段,...

    mmseg4j-solr-master

    《mmseg4j-solr-master:中文分词利器与应用探索》 在现代信息处理领域,中文分词是至关...通过对mmseg4j的深入理解和实践,开发者可以更好地解决中文文本处理中的挑战,为各种信息检索和文本分析任务提供有力支持。

    mmseg4j.jar

    mmseg4j是Java实现的中文分词库,广泛应用于搜索引擎、文本分析等领域。在Java社区中,它因其高效、灵活的特点而备受青睐。本篇文章将围绕mmseg4j的核心组件、功能特性以及在实际项目中的应用展开详细讨论。 首先,...

    mmseg4j-1.9.1

    在实际应用中,mmseg4j广泛应用于搜索引擎的索引构建、文本情感分析、智能问答系统等场景。例如,在搜索引擎中,准确的分词能够提升搜索结果的相关性;在文本情感分析中,分词是计算词频、识别情感倾向的基础。 总...

    solr6配置mmseg4j

    这里定义了一个名为"text_mmseg"的字段类型,并在分析器中使用了MMsegTokenizerFactory。 5. **重启Solr服务**:完成以上配置后,重启Solr服务使配置生效。 6. **验证配置**:可以通过Solr的管理界面或者API进行...

    mmseg4j\mmseg4j-1.8.5.zip

    《mmseg4j:中文分词利器》 mmseg4j是一个专为Java设计的高效中文分词库,它的核心是基于"最小编辑距离"算法的分词方法,旨在提高中文文本处理的效率和准确性。在Java开发环境中,面对海量中文文本的处理,mmseg4j...

    mmseg4j完美适配solr5.2.1

    最后,`mmseg4j-analysis-1.9.1.jar`是mmseg4j的分析器组件,它提供了对输入文本的预处理和后处理功能,包括标准化、去重、过滤等,进一步优化了分词效果。 在实际应用中,我们需要在Solr的配置文件中指定使用mmseg...

    mmseg4j jar包

    **mmseg4j jar包** 是一个专门为Java开发的中文分词库,广泛应用于搜索引擎、文本分析、自然语言处理等领域。这个资源包适用于Solr5.3.1版本,表明它与Apache Solr的集成非常良好,使得用户可以方便地在Solr中实现...

    mmseg4j-1.9.1 分词器 包含修复bug的mmseg4j-analysis-1.9.1.jar

    **mmseg4j分词器详解** mmseg4j是一个基于Java实现的中文分词库,它主要用于将中文文本拆分成一系列的词语,是信息检索、自然语言处理、搜索引擎等领域的基础工具。在1.9.1版本中,开发者对原有的功能进行了优化,...

Global site tag (gtag.js) - Google Analytics