`

十五、简单实现同义词索引

 
阅读更多

import java.util.HashMap;
import java.util.Map;

public class SimpleSamewordContext implements SamewordContext {

   
    Map<String,String[]> maps = new HashMap<String,String[]>();
    public SimpleSamewordContext() {
        maps.put("中国",new String[]{"天朝","大陆"});
        maps.put("我",new String[]{"咱","俺"});
    }

    @Override
    public String[] getSamewords(String name) {
        return maps.get(name);
    }

}


import java.io.IOException;
import java.util.Stack;

import org.apache.lucene.analysis.TokenFilter;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.util.AttributeSource;

public class MySameTokenFilter extends TokenFilter {

    private CharTermAttribute            cta        = null;
    private PositionIncrementAttribute    pia        = null;
    private AttributeSource.State        current;
    private Stack<String>                sames    = null;
    private final SamewordContext        samewordContext;
   
    protected MySameTokenFilter(TokenStream input, SamewordContext samewordContext) {
        super(input);
        cta = this.addAttribute(CharTermAttribute.class);
        pia = this.addAttribute(PositionIncrementAttribute.class);
        sames = new Stack<String>();
        this.samewordContext = samewordContext;
    }
   
    @Override
    public boolean incrementToken() throws IOException {
        if (sames.size() > 0) {
            //将元素出栈,并且获取这个同义词
            String str = sames.pop();
            //还原状态
            restoreState(current);
            cta.setEmpty();
            cta.append(str);
            //设置位置0
            pia.setPositionIncrement(0);
            return true;
        }
       
        if (!this.input.incrementToken())
            return false;
       
        if (addSames(cta.toString())) {
            //如果有同义词将当前状态先保存
            current = captureState();
        }
        return true;

    }
   
    private boolean addSames(String name) {
        String[] sws = samewordContext.getSamewords(name);
        if (sws != null) {
            for (String str : sws) {
                sames.push(str);
            }
            return true;
        }
        return false;
    }
   
}


import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.TokenStream;

import com.chenlb.mmseg4j.Dictionary;

import com.chenlb.mmseg4j.MaxWordSeg;
import com.chenlb.mmseg4j.analysis.MMSegTokenizer;

public class MySameAnalyzer extends Analyzer {

    private final SamewordContext    samewordContext;
   
    public MySameAnalyzer(SamewordContext swc) {
        samewordContext = swc;
    }
   
    @Override
    public TokenStream tokenStream(String fieldName, Reader reader) {
        //Dictionary dic = Dictionary.getInstance("D:\\tools\\javaTools\\lucene\\mmseg4j-1.8.5\\data");
        Dictionary dic = Dictionary.getInstance();
        return new MySameTokenFilter(new MMSegTokenizer(new MaxWordSeg(dic), reader),
            samewordContext);

    }
   
}


public static void displayAllTokenInfo(String str,Analyzer a) {
        try {
            TokenStream stream = a.tokenStream("content",new StringReader(str));
            //位置增量的属性,存储语汇单元之间的距离
            PositionIncrementAttribute pia =
                        stream.addAttribute(PositionIncrementAttribute.class);
            //每个语汇单元的位置偏移量
            OffsetAttribute oa =
                        stream.addAttribute(OffsetAttribute.class);
            //存储每一个语汇单元的信息(分词单元信息)
            CharTermAttribute cta =
                        stream.addAttribute(CharTermAttribute.class);
            //使用的分词器的类型信息
            TypeAttribute ta =
                        stream.addAttribute(TypeAttribute.class);
            for(;stream.incrementToken();) {
                System.out.print(pia.getPositionIncrement()+":");
                System.out.print(cta+"["+oa.startOffset()+"-"+oa.endOffset()+"]-->"+ta.type()+"\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


@Test
    public void test05() {
        try {
            Analyzer a2 = new MySameAnalyzer(new SimpleSamewordContext());
            String txt = "我来自中国重庆江北";
            Directory dir = new RAMDirectory();
            IndexWriter writer = new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_35, a2));
            Document doc = new Document();
            doc.add(new Field("content", txt, Field.Store.YES, Field.Index.ANALYZED));
            writer.addDocument(doc);
            writer.close();
            IndexSearcher searcher = new IndexSearcher(IndexReader.open(dir));
            TopDocs tds = searcher.search(new TermQuery(new Term("content", "我")), 10);
            Document d = searcher.doc(tds.scoreDocs[0].doc);
            System.out.println(d.get("content"));
            AnalyzerUtils.displayAllTokenInfo(txt, a2);
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (LockObtainFailedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

分享到:
评论

相关推荐

    Elasticsearch7.17.5版本同义词热更新插件源码

    2. **同步策略**:为了确保数据一致性,插件可能实现了在更新同义词后,同步索引的状态,确保新的同义词设置对所有节点生效。 3. **性能优化**:由于热更新涉及到索引的动态变更,所以插件可能采用了缓存策略,减少...

    易语言同义词替换

    在“易语言同义词替换”这个主题中,我们将深入探讨如何使用易语言来实现文本处理中的一个重要功能——同义词替换。 同义词替换是自然语言处理中的常见操作,它的目的是通过将文本中的某些词语替换为它们的同义词,...

    lucene5.5做同义词分析器

    在Lucene 5.5中,我们可以通过自定义Analyzer来实现同义词分析。Analyzer是Lucene的核心组件之一,负责将输入的文本拆分成可索引的Token。我们可以通过继承Analyzer类,并重写其createComponents()方法来定制自己的...

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

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

    汉语最全同义词列表,汉语同义词词典,Python源码.zip

    这些代码可能涵盖了读取和解析同义词列表,进行词汇关系的查询、建立索引,甚至进行简单的语义分析等功能。Python是数据处理和NLP领域广泛使用的编程语言,它拥有丰富的库支持,如pandas用于数据操作,nltk和spaCy...

    同义词 词库 用于关键词替换 伪原创

    标签“源码 工具”暗示可能存在开源代码或实用工具,可以帮助开发者快速实现同义词替换的功能。这类工具可能包括API接口、Python库(如NLTK或Jieba)、Java类库或其他编程语言的实现,它们通常提供简单的API调用,...

    文本全文搜索引擎 利用倒排索引实现

    实际应用中,为了提高性能和存储效率,可能还需要引入更复杂的数据结构(如B树或Trie树)和优化算法,以及考虑如何处理同义词、近义词等问题。此外,还可以利用Python的全文搜索库,如Whoosh、Elasticsearch等,它们...

    一种有效的基于反向查找表的策略,用于解决虚拟索引、虚拟标记缓存中的同义词和缓存一致性问题_An efficient revers

    本文提出的是一种针对虚拟索引、虚拟标记(VIVT)缓存的有效反向查找表策略,旨在解决同义词问题以及缓存一致性问题,尤其适用于直接映射的VIVT缓存(VIVT-DM缓存)。这种策略旨在在不增加过多硬件开销的情况下,...

    倒排索引实现简单的搜索引擎功能

    这通常涉及到词干提取和词形还原,以便处理不同形式的同义词。 3. **构建倒排索引**:对于每个分出的词,将其添加到相应的倒排索引条目中,如果不存在,则创建新的条目。每个条目记录着所有包含该词的文档ID。 4. ...

    elasticsearch-analysis-dynamic-synonym-7.0.0.zip

    "elasticsearch-analysis-dynamic-synonym-7.0.0.zip"是一个专为Elasticsearch设计的同义词插件,它的主要目的是在搜索过程中实现同义词的智能匹配,提高搜索的准确性和用户体验。 这个插件的独特之处在于它支持...

    基于Qt电子词典的设计与实现

    在词汇查询方面,项目可能采用了数据库技术存储大量词汇信息,如单词释义、词性、同义词、反义词等。查询算法可能涉及字符串匹配或全文索引技术,以提高查找效率。在例句展示部分,可能利用XML或JSON等数据格式存储...

    elasticsearch-analysis-dynamic-synonym-7.6.2

    `elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义词库可以随着业务需求的变化而实时更新。 **一、动态同义词插件的作用** 1...

    简易的搜索引擎(libcurl实现)

    - 查询处理可能涉及查询分析,比如关键词的词干化、同义词扩展等,以提高召回率。 - 检索结果通常按照相关性排序,相关性计算可能基于TF-IDF或BM25等算法。 5. **结果返回**: - 返回给用户的搜索结果通常包括...

    lucene的分词的测试工程

    从选择合适的分词器,到定制停用词列表,再到实现同义词处理,每一步都是提升搜索引擎质量和用户体验的关键。通过对这些知识点的深入理解和实践,我们能更好地驾驭Lucene,打造更强大的信息检索系统。

    SQL专家门诊源代码---全文索引和全文检索.rar

    `CONTAINS`支持精确匹配和模糊匹配,而`FREETEXT`则更智能,能够理解自然语言并识别同义词。例如,搜索包含“数据库”和“优化”这两个词的记录: ```sql SELECT * FROM articles WHERE CONTAINS(content, '数据库 ...

    linux下实现简单功能的电子词典

    这个过程可能涉及到词义解析、同义词、反义词、例句等扩展功能。 4. **sqlite3数据库**:sqlite3是一款开源、无服务器、自包含、类型的事务型数据库引擎。在电子词典中,它存储用户的注册信息、登录状态、查询历史...

    动态字符串存储与索引机制.pptx

    2. **技术发展:** 随着技术的发展,全文索引技术不断进步,包括倒排索引、词干化和同义词处理等,提高了搜索精度和速度。 **位图索引** 1. **二进制位图的应用:** 位图索引将每个属性值映射到一个二进制位图,每...

    IKAnalyzer分词及solr4103配置说明

    6. **测试与应用**:使用Solr提供的Admin界面或API进行索引和查询,观察IKAnalyzer与同义词功能的效果。 **Markdown格式的配置说明** 配置文件通常使用Markdown格式编写,因为其语法简洁明了,易于阅读和编辑。...

    Go-Blast是一个用Go编写的全文搜索和索引服务器

    Bleve还提供了诸如模糊搜索、同义词扩展、分词器插件等高级特性,以满足不同场景下的搜索需求。 Go-Blast作为Bleve的上层应用,可能进一步封装了Bleve的接口,简化了使用过程,同时也可能提供了更高级别的功能,...

Global site tag (gtag.js) - Google Analytics