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();
}
}
分享到:
相关推荐
2. **同步策略**:为了确保数据一致性,插件可能实现了在更新同义词后,同步索引的状态,确保新的同义词设置对所有节点生效。 3. **性能优化**:由于热更新涉及到索引的动态变更,所以插件可能采用了缓存策略,减少...
在“易语言同义词替换”这个主题中,我们将深入探讨如何使用易语言来实现文本处理中的一个重要功能——同义词替换。 同义词替换是自然语言处理中的常见操作,它的目的是通过将文本中的某些词语替换为它们的同义词,...
在Lucene 5.5中,我们可以通过自定义Analyzer来实现同义词分析。Analyzer是Lucene的核心组件之一,负责将输入的文本拆分成可索引的Token。我们可以通过继承Analyzer类,并重写其createComponents()方法来定制自己的...
本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...
这些代码可能涵盖了读取和解析同义词列表,进行词汇关系的查询、建立索引,甚至进行简单的语义分析等功能。Python是数据处理和NLP领域广泛使用的编程语言,它拥有丰富的库支持,如pandas用于数据操作,nltk和spaCy...
标签“源码 工具”暗示可能存在开源代码或实用工具,可以帮助开发者快速实现同义词替换的功能。这类工具可能包括API接口、Python库(如NLTK或Jieba)、Java类库或其他编程语言的实现,它们通常提供简单的API调用,...
实际应用中,为了提高性能和存储效率,可能还需要引入更复杂的数据结构(如B树或Trie树)和优化算法,以及考虑如何处理同义词、近义词等问题。此外,还可以利用Python的全文搜索库,如Whoosh、Elasticsearch等,它们...
本文提出的是一种针对虚拟索引、虚拟标记(VIVT)缓存的有效反向查找表策略,旨在解决同义词问题以及缓存一致性问题,尤其适用于直接映射的VIVT缓存(VIVT-DM缓存)。这种策略旨在在不增加过多硬件开销的情况下,...
这通常涉及到词干提取和词形还原,以便处理不同形式的同义词。 3. **构建倒排索引**:对于每个分出的词,将其添加到相应的倒排索引条目中,如果不存在,则创建新的条目。每个条目记录着所有包含该词的文档ID。 4. ...
"elasticsearch-analysis-dynamic-synonym-7.0.0.zip"是一个专为Elasticsearch设计的同义词插件,它的主要目的是在搜索过程中实现同义词的智能匹配,提高搜索的准确性和用户体验。 这个插件的独特之处在于它支持...
在词汇查询方面,项目可能采用了数据库技术存储大量词汇信息,如单词释义、词性、同义词、反义词等。查询算法可能涉及字符串匹配或全文索引技术,以提高查找效率。在例句展示部分,可能利用XML或JSON等数据格式存储...
`elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义词库可以随着业务需求的变化而实时更新。 **一、动态同义词插件的作用** 1...
- 查询处理可能涉及查询分析,比如关键词的词干化、同义词扩展等,以提高召回率。 - 检索结果通常按照相关性排序,相关性计算可能基于TF-IDF或BM25等算法。 5. **结果返回**: - 返回给用户的搜索结果通常包括...
从选择合适的分词器,到定制停用词列表,再到实现同义词处理,每一步都是提升搜索引擎质量和用户体验的关键。通过对这些知识点的深入理解和实践,我们能更好地驾驭Lucene,打造更强大的信息检索系统。
`CONTAINS`支持精确匹配和模糊匹配,而`FREETEXT`则更智能,能够理解自然语言并识别同义词。例如,搜索包含“数据库”和“优化”这两个词的记录: ```sql SELECT * FROM articles WHERE CONTAINS(content, '数据库 ...
这个过程可能涉及到词义解析、同义词、反义词、例句等扩展功能。 4. **sqlite3数据库**:sqlite3是一款开源、无服务器、自包含、类型的事务型数据库引擎。在电子词典中,它存储用户的注册信息、登录状态、查询历史...
2. **技术发展:** 随着技术的发展,全文索引技术不断进步,包括倒排索引、词干化和同义词处理等,提高了搜索精度和速度。 **位图索引** 1. **二进制位图的应用:** 位图索引将每个属性值映射到一个二进制位图,每...
6. **测试与应用**:使用Solr提供的Admin界面或API进行索引和查询,观察IKAnalyzer与同义词功能的效果。 **Markdown格式的配置说明** 配置文件通常使用Markdown格式编写,因为其语法简洁明了,易于阅读和编辑。...
Bleve还提供了诸如模糊搜索、同义词扩展、分词器插件等高级特性,以满足不同场景下的搜索需求。 Go-Blast作为Bleve的上层应用,可能进一步封装了Bleve的接口,简化了使用过程,同时也可能提供了更高级别的功能,...