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

Lucene 同义词

 
阅读更多

在Lucene4.6中通过SynonymFilterFactory实现中文同义词非常方便,只需几行代码和一个同义词词典。这个词典还能在Lucene中实现一定程度的拼写纠错,提升搜索体验。在下面这个例子中我们从磁盘载入一个同义词词典,并且对“其实hankcs似好人”这句话进行stream化以供索引,同时还对其中的拼写错误“似->是”做出纠正。

首先是位于./data/synonyms.txt路径下的同义词词典:

我,俺,hankcs
似,is,are => 是
好人,好心人,热心人

   可以看出上面有两种词典格式:

通过,分割的可拓展同义词

比如“我,俺,hankcs”代表着这三个词是同义词,并且任何一个词可以被expand(拓展)为其他三个。如果expand设为false的话,则这三个词都会被统一替换为第一个词,也就是“我”。

通过=>收缩的不可拓展同义词

比如“似,is,are => 是”代表这三个词同义,并且无视expand参数,统一会被替换为“是”

然后是加载代码

package com.hankcs.test;
 
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;
import org.apache.uima.annotator.WhitespaceTokenizer;
 
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @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 似 好人";
        Version ver = Version.LUCENE_46;
        Map<String, String> filterArgs = new HashMap<String, String>();
        filterArgs.put("luceneMatchVersion", ver.toString());
        filterArgs.put("synonyms", "./data/synonyms.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);
    }
}

   输出:

0-2[其实] 3-9[我] 3-9[俺] 3-9[hankcs] 10-11[是] 12-14[好人] 12-14[好心人] 12-14[热心人]

由于 我 俺 hankcs 三个词是同一个意思,所以它们被视为同一个term,并且它们的偏移相同,都是3->9,这个长度取决于原来的词 hankcs 的长度。

http://www.hankcs.com/program/java/lucene-synonymfilterfactory.html

分享到:
评论

相关推荐

    向LUCENE搜索引擎中加人中文同义词查询

    【描述】: 本文探讨了如何在Lucene搜索引擎中实现中文同义词查询,适合那些希望了解和使用Lucene同义词功能的读者。 【标签】: lucene同义词 【正文】: 随着互联网的快速发展,中文信息量剧增,搜索引擎需要处理...

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

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

    lucene5.5做同义词分析器

    本篇文章将深入探讨如何基于Lucene 5.5版本构建一个同义词分析器,以及它对理解Lucene内部分析构造的重要性。 首先,我们要明白同义词分析器在文本处理中的作用。在信息检索系统中,同义词分析器能够识别并处理具有...

    ES同义词插件 elasticsearch-analysis-dynamic-synonym-6.5.1.rar

    本篇文章将重点讲解“ES同义词插件”——elasticsearch-analysis-dynamic-synonym-6.5.1,这是针对Elasticsearch 6.x版本的一个定制化插件,用于实现同义词处理功能。 标题中的"ES同义词插件 elasticsearch-...

    关于Lucene的词典FST深入剖析-申艳超1

    FST在Lucene中的应用不仅限于词典,它还可以用于实现词性标注、同义词扩展等功能。通过FST,Lucene可以在不增加太多内存开销的情况下,提供复杂的查询逻辑和高效的索引服务。 在实际应用中,FST的构建和查询性能是...

    lucene4.6例子

    2. 同义词:为了提高召回率,Lucene支持同义词扩展。可以使用`SynonymFilter`在查询时将同义词合并,扩大查询覆盖范围。 四、近实时搜索 Lucene 4.6引入了近实时搜索(Near Real-Time Search)特性,允许在添加或...

    lucene5.4 + IKAnalyzer

    在描述中提到,这个版本的IK Analyzer已经支持同义词、停用词和扩展词,这意味着它可以识别并处理这些词汇的不同形式,从而提供更丰富的搜索结果。 **同义词支持** 同义词功能在信息检索中至关重要,因为用户可能会...

    lucene的分词的测试工程

    本文将深入探讨一个以"lucene的分词的测试工程"为主题的项目,涵盖分词器的比较、扩展停用词以及同义词分词等多个关键知识点。 一、Lucene简介 Lucene是一款高性能、全文检索的开源库,它提供了索引和搜索功能,...

    lucene实现企业产品检索

    - **模糊搜索**:支持部分匹配或同义词搜索,可以通过设置查询分析器的同义词扩展或使用模糊查询。 - **排序与评分**:根据相关性(如TF-IDF)对结果进行排序,可以自定义评分函数。 - **过滤与聚合**:通过Filter和...

    lucene.net和盘古分词做站内搜索,热词搜索

    利用 `Lucene.Net` 和盘古分词,我们可以构建一个强大的站内搜索系统,提供精准的关键词匹配、拼音模糊搜索、同义词搜索等功能。通过定制化的索引策略和搜索算法,可以提升用户的搜索体验,提高用户在网站的停留时间...

    Lucene学习源码.rar

    索引过程涉及分词(Tokenization)、词干提取(Stemming)、同义词扩展(Synonym Expansion)等步骤,将文本转换为可搜索的结构。 4. 分词器(Analyzer):负责将输入文本分解成一系列独立的词语,这是构建索引的...

    支持Spring-data-solr1.5的ik分词器,同义词

    支持Spring-data-solr1.5的ik分词器,并且修改了代码,添加一个新的类,用于支持同义词,目前可以同时支持分词和同义词的功能。 修改 managed-schema,添加 &lt;analyzer type="index"&gt; ...

    lucene站内搜索

    5. **拼音和同义词支持**: 引入拼音库和同义词库,提高对中文模糊搜索的支持。 总之,Lucene站内搜索提供了一套强大且灵活的搜索框架,通过合理的配置和优化,可以实现高效、准确的站内信息检索。在实际项目中,...

    lucene in action 电子版

    - **近似匹配**:讲解了如何实现模糊匹配、同义词扩展等功能,以提高搜索的灵活性和准确性。 - **排序与评分**:分析了Lucene中如何根据相关性对搜索结果进行排序,并介绍了不同评分策略的影响。 - **章节6:扩展...

    Lucene全文搜索 分组,精确查找,模糊查找

    3. **SynonymFilter**:通过在索引阶段使用同义词过滤器,将同义词关联起来,使得在查询时即使输入的是同义词也能得到正确的结果。 四、IKAnalyzer应用 在实际应用中,我们可能会遇到中文分词的问题。这时,IK...

    Lucene项目的文档和源码

    此外,还可以研究Lucene如何处理分词、同义词、停用词等问题,以及它如何利用倒排索引来实现高效的模糊匹配和短语查询。 另一方面,"ppt"可能是一些关于Lucene的演示文稿或教程,可能是讲解Lucene的基本使用方法、...

    Lucene原理

    - **同义词处理(Synonyms)**:识别并处理同义词,扩大搜索范围。 6. **优化与性能** - **位集(Bitset)**:用于快速过滤和比较文档,提高查询效率。 - **缓存(Cache)**:利用内存缓存高频查询结果,提升...

    lucene3.0.3搜索的使用示例

    在索引过程中,每个文档会被拆分成词语(Tokenization),然后对每个词语进行词干提取(Stemming)和同义词处理(Synonym Processing),生成倒排索引(Inverted Index)。 2. **字段(Fields)**:在Lucene中,...

    lucene检索新闻数据演示

    这可能涉及到查询分析,比如同义词扩展、短语匹配等。 6. **搜索执行**:通过Lucene的Query类构建查询对象,然后使用IndexSearcher进行搜索。Lucene会返回匹配度最高的文档列表。 7. **结果展示**:最后,将搜索...

    SQLServer+Lucene.Net例子

    4. **高级查询**:Lucene.NET提供了丰富的查询API,可以实现更复杂的搜索逻辑,如近义词搜索、同义词搜索、拼音搜索等。 5. **扩展性**:Lucene.NET设计为可扩展,可以方便地集成到各种应用中,如Web应用程序、桌面...

Global site tag (gtag.js) - Google Analytics