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

MMSegAnalyzer 自定义 同义词分词器

 
阅读更多
package synonym;

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

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.en.PorterStemFilter;
import org.apache.lucene.analysis.synonym.SynonymFilter;
import org.apache.lucene.analysis.synonym.SynonymMap;
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;

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"};

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

}

 

package luncen;
 
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.apache.lucene.util.Version;
 
/**
 * @author hankcs
 */
public class TestSynonyms
{
    private static void displayTokens(TokenStream ts) throws IOException
    {
        CharTermAttribute termAttr = ts.addAttribute(CharTermAttribute.class);
        OffsetAttribute offsetAttribute = ts.addAttribute(OffsetAttribute.class);
        ts.reset();
        while (ts.incrementToken())
        {
            String token = termAttr.toString();
            System.out.print(offsetAttribute.startOffset() + "-" + offsetAttribute.endOffset() + "[" + token + "] ");
        }
        System.out.println();
        ts.end();
        ts.close();
    }
 
    public static void main(String[] args) throws Exception
    {
        String testInput = "其实 hankcs 似 好人 luncen";
        Version ver = Version.LUCENE_47;
        Map<String, String> filterArgs = new HashMap<String, String>();
        filterArgs.put("luceneMatchVersion", ver.toString());
        filterArgs.put("synonyms", "f:\\synonym.txt");
        filterArgs.put("expand", "true");
        SynonymFilterFactory factory = new SynonymFilterFactory(filterArgs);
        factory.inform(new FilesystemResourceLoader());
        WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(ver);
        TokenStream ts = factory.create(whitespaceAnalyzer.tokenStream("someField", testInput));
        displayTokens(ts);
    }
}

 

分享到:
评论

相关推荐

    Lucene5学习之自定义同义词分词器简单示例

    本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...

    Elasticsearch7.10.0集成IK相关性同义词改源码实现MySql5.7.2实现远程动态同义词词库实时更新.pdf

    为了实现这一目标,可以通过自定义分词器并维护同义词的方式来达到效果。IK分词器是ES中常用的中文分词插件,通过集成IK分词器并对其进行源码修改,可以实现从远程数据库MySql5.7.2动态更新同义词词库,并实现实时...

    用于分词的同义词词林词典

    "用于分词的同义词词林词典"是一个专门用于这一目的的资源,它包含了大量的同义词关系,能够帮助算法更准确地识别文本中的语义。 同义词词典,顾名思义,是收集了大量具有相同或相近意义词汇的数据库。在分词时,...

    lucene5.5做同义词分析器

    通过自定义Analyzer和使用同义词分析器,我们可以极大地提升搜索体验,让信息检索更加智能和人性化。在实际项目中,这一步通常需要根据业务需求和特定的语料库进行精细调整,以便更好地满足用户的搜索需求。

    IKAnalyzer分词器jar包,支持同义词、扩展词和停止词

    自己打包并经过测试的,IKAnalyzerSolrFactory这个类是jdk1.6编辑的,需要高版本的可自己改。同义词可在core的conf里面单独配置,扩展词和停止词在应用的WEB-INF下classes里面配置。

    es 同义词 热更新 1.1版本

    综合以上信息,可以得出结论,这篇博客可能讲解了如何通过自定义Elasticsearch的分析组件(如`HeatSynonymFilter`和`HeatSynonymTokenFilterFactory`),结合MMSEG分词器,实现同义词的热更新功能。这个功能对于实时...

    汉语最全同义词列表,汉语同义词词典,Python

    标题中的“汉语最全同义词列表”与“汉语同义词词典”指的是一个包含大量汉语词汇及其同义词的资源,这对于进行自然语言处理(NLP)任务至关重要。同义词词典是NLP中一个基础工具,它帮助程序理解和处理语言的多样性...

    elasticsearch7.8.0版本的IK分词器

    2. **自定义扩展词库**: 用户可以自定义扩展词库,将一些专业术语或者新词加入到词库中,增强分词器对特定领域文本的理解和处理能力。 3. **动态词典加载**: 在运行时,IK 分词器支持动态加载和更新词典,无需重启...

    中文同义词词库-同义词词库-access版本

    《中文同义词词库-Access版本》是一个专门用于处理中文同义词关系的数据资源,它采用Microsoft Access数据库格式,方便用户进行数据管理和查询。在自然语言处理(NLP)和文本挖掘领域,同义词词库是至关重要的工具,...

    es5.3.2使用热词、停用词、同义词词典.rar

    - **停用词过滤**:通过设置`stop_words`参数,Elasticsearch的分词器可以自动过滤掉停用词。这可以在索引阶段完成,也可以在查询阶段动态处理。 - **同义词扩展**:Elasticsearch支持使用同义词过滤器,如`synonym...

    哈工大同义词词林扩展版.zip

    《哈工大同义词词林扩展版》是一款专为自然语言处理(NLP)学习者和从业者设计的工具,由哈尔滨工业大学社会计算与信息检索研究中心精心编纂。这款资源在进行同义词替换和关键词扩展等任务时,展现出极高的实用价值...

    同义词词典 中文同义词词库

    同义词词典 中文同义词词库,access版本

    es安装ik分词器

    ### Elasticsearch 安装 IK 分词器详解 #### 一、背景及需求分析 Elasticsearch 是一款基于 Lucene 的搜索引擎,广泛应用于日志处理、全文检索等场景。它提供了多种内置分词器来处理文本数据,但在实际应用过程中...

    2023版-同义词词林(扩展版)最终版

    《2023版-同义词词林(扩展版)最终版》是一个庞大的语言资源库,专为中文处理和自然语言理解领域的专业人士设计。它包含了近8万条词语,这些词语之间的关系是它们在语义上具有相似或相同的含义,即同义词。这个资源...

    哈工大同义词词林.zip

    《哈工大同义词词林.zip》是一个包含与自然语言处理相关的资源文件的压缩包。这个压缩包主要由两部分组成:《同义词词林(扩展版)》说明.pdf 和 HIT-IRLab-同义词词林(扩展版)_full_2005.3.3.txt。这两个文件都是...

    同义词词林(扩展版)

    《同义词词林(扩展版)》每个词的类编码就应该包含了他全部的信息。 对于原版同义词词林,编码的第一个字母代表该词所属的大类,第二个字母代表中类,后两位字母代表小类。 同义词词林原版是梅家驹先生人工构造的,...

    maven 构建好的 IK 分词器,可直接使用

    - 实现模糊搜索:分词器可以帮助实现同义词搜索、近义词搜索等功能,提高用户体验。 3. **安装和使用 IK 分词器的步骤:** - 下载已构建好的 IK 分词器包。 - 将分词器解压后的文件复制到 Elasticsearch 安装...

    ik分词器tar包 7.10.2

    3. **动态扩展**:IK分词器具备动态扩展词能力,能够在遇到未登录词时尝试通过词根和词缀规则进行分词。 4. **多线程支持**:为了提升效率,IK分词器支持多线程处理,可以在高并发环境下保持高性能。 5. **配置...

    ES7.11.1各种分词器和插件

    4. **自定义分词器插件**:允许开发人员根据需求创建自己的分词逻辑,例如基于正则表达式的自定义分词器。 5. **地理插件**:如GeoIP,可以解析IP地址并将其转换为地理位置信息,支持地理空间搜索。 正确选择和...

Global site tag (gtag.js) - Google Analytics