Lucene同义词分词器简单实现

package com.yuan;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKTokenizer;

public class SynonymAnalyzer extends Analyzer {
	private Version version = Version.LUCENE_47;
	public SynonymAnalyzer(Version version){
		this.version = version;
	}
	public boolean useSmart() {
		return useSmart;
	}
	
	public void setUseSmart(boolean useSmart) {
		this.useSmart = useSmart;
	}

	public SynonymAnalyzer() {
		this(false);
	}

	public SynonymAnalyzer(boolean useSmart) {
		this.useSmart = useSmart;
	}
	@Override
	protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
		// TODO Auto-generated method stub
		Tokenizer tokenizer = new IKTokenizer(reader,
				useSmart());
        Map<String, String> filterArgs = new HashMap<String, String>();
        filterArgs.put("luceneMatchVersion", version.toString());
        filterArgs.put("synonyms", "c:/同义词/synonymword.dic");
        filterArgs.put("expand", "true");
        SynonymFilterFactory factory = new SynonymFilterFactory(filterArgs);
        try {
			factory.inform(new FilesystemResourceLoader());
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        IKAnalyzer ikAnalyzer = new IKAnalyzer();
        TokenStream token = null;
		try {
			token = factory.create(ikAnalyzer.tokenStream("someField", reader));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new org.apache.lucene.analysis.Analyzer.TokenStreamComponents(
				tokenizer,token);
	}
	private boolean useSmart;
}

本类主要根据IK分词器和SmartchinseAnalyzer缩写的。

最后在网上查看资料有进行了一下改变:

package com.yuan;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.wltea.analyzer.lucene.IKTokenizer;

    public class IKSynonymsAnalyzer extends Analyzer {
    @Override
    protected TokenStreamComponents createComponents(String arg0, Reader arg1) {
    Tokenizer token=new IKTokenizer(arg1, false);//开启智能切词
    Map paramsMap=new HashMap();
    paramsMap.put("luceneMatchVersion", "LUCENE_43");
    paramsMap.put("synonyms", "C:\\同义词\\synonyms.txt");
    SynonymFilterFactory factory=new SynonymFilterFactory(paramsMap);
    FilesystemResourceLoader loader = new FilesystemResourceLoader();
    try {
    factory.inform(loader);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return new TokenStreamComponents(token, factory.create(token));
    }

    }
今天一个不小心被“中英文的标点符号”征服了一个上午,由于在同义词文件中只能用英语“,”对一组同义词分开,然而在自己的不细心的情况下,让有一组词用了中文的''

,"各种测试都过不了,最后经过一步步的查找终于找到了问题。

这里对同义词查找问题应该注意的一些问题:

①、文件编码问题

②、分割符号问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值