Lucene 同义词
来源:互联网 发布:2017淘宝卖家参加双12 编辑:程序博客网 时间:2024/06/08 06:44
在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
0 0
- Lucene 同义词
- lucene-同义词分析器
- Lucene 同义词搜索
- Lucene同义词(一)
- Lucene自定义同义词分词器
- lucene构建同义词分词器
- lucene--同义词简单的实现方式
- Lucene同义词分词器简单实现
- lucene+ikanalyzer实现中文同义词搜索
- Lucene实现自定义中文同义词分词器
- Lucene 5.3 自定义同义词分词器
- 自定义lucene的同义词分词器
- lucene-使用sandbox的wordnet完成同义词索引
- Lucene实现自定义分词器(同义词查询与高亮)
- Lucene学习笔记(2)自定义TokenFilter实现同义词
- 同义词
- 同义词
- 同义词
- es Synonyms filter
- 转型操作工具类
- [leetcode] 272. Closest Binary Search Tree Value II 解题报告
- HBase笔记
- CSS之文本
- Lucene 同义词
- JAVA多线程和并发基础面试问答
- 我作为一个面试官的感想
- leetcode-14 Longest Common Prefix
- MMSegAnalyzer 自定义 同义词分词器
- Linux内存管理之综合篇
- iOS程序猿之富文本(NSMuttableAttstring)
- mmseg 分词器 同义词总结
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片