经过paoding分词后,再对每个token进行2次分词,此处是二元切分法
public class MyCJKFilter extends TokenFilter {
private TermAttribute termAtt = (TermAttribute) addAttribute(TermAttribute.class);;
private OffsetAttribute offsetAtt = (OffsetAttribute) addAttribute(OffsetAttribute.class);
private PositionIncrementAttribute posAtt = (PositionIncrementAttribute) addAttribute(PositionIncrementAttribute.class);
protected MyCJKFilter(TokenStream input) {
super(input);
}
private Vector<Token> bufferToken = new Vector<Token>();
private int count = 0;
private CJKAnalyzer analyzer = new CJKAnalyzer();
Map<String, Token> map = new HashMap<String, Token>();
@Override
public final boolean incrementToken() throws IOException {
if (this.bufferToken.size() > 0) {
Token t = this.bufferToken.remove(0);
this.termAtt.setTermBuffer(t.term());
this.offsetAtt.setOffset(t.startOffset(), t.endOffset());
this.posAtt.setPositionIncrement(t.getPositionIncrement());
return true;
}
if (this.bufferToken.size() == 0 && this.count > 0) {
// System.out.println("count is > 0!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
count = 0;
return false;
}
map.clear();
while (input.incrementToken()) {
this.termAtt = (TermAttribute) input.getAttribute(TermAttribute.class);
this.offsetAtt = (OffsetAttribute) input.getAttribute(OffsetAttribute.class);
this.posAtt = (PositionIncrementAttribute) input.getAttribute(PositionIncrementAttribute.class);
String term = this.termAtt.term();
Token tokenOri = new Token(term, this.offsetAtt.startOffset(), this.offsetAtt.endOffset());
this.bufferToken.add(tokenOri);
map.put(term, tokenOri);
// System.out.println(term + "-->" + this.offsetAtt.startOffset() + "," + this.offsetAtt.endOffset());
TokenStream ts = this.analyzer.tokenStream("", new StringReader(term));
while (ts.incrementToken()) {
TermAttribute ta = (TermAttribute) ts.getAttribute(TermAttribute.class);
if (map.containsKey(ta.term())) {
continue;
}
OffsetAttribute offa = (OffsetAttribute) ts.getAttribute(OffsetAttribute.class);
// System.out.println(ta.term() + "-->" + offa.startOffset() + "," + offa.endOffset());
Token token = new Token(ta.term(), offa.startOffset(), offa.endOffset());
if (token == null) {
// System.out.println("ts.next() is null");
} else {
this.bufferToken.add(token);
// System.out.println("add to vector, term=" + token.term());
}
}
count++;
}
if (bufferToken.size() > 0) {
return this.incrementToken();
} else {
return false;
}
}
}
分享到:
相关推荐
这只是一个简单的例子,实际上`TokenFilter`可以实现更复杂的功能,如词形还原、同义词替换等。 在提供的源代码中,你可能看到了更多关于如何实际应用`TokenFilter`的例子,包括如何组合多个`TokenFilter`以及如何...
Lucene自动短语TokenFilter实现 对令牌流执行“自动短语编制”。 自动短语是指标记序列,旨在描述单个事物,因此应进行搜索。 当在令牌流中检测到这些短语时,将发出代表该短语的单个令牌,而不是组成该短语的各个...
5. **插件机制**:IKAnalyzer允许开发人员通过实现TokenFilter接口来编写插件,对分词结果进行进一步的处理,如去除停用词、词性标注等。 6. **分词效果优化**:IKAnalyzer提供了“智能切分”模式,能够自动识别并...
本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...
总之,Lucene 在处理中文文本时,需要适配合适的 Analyzer 和 Tokenizer 来实现有效的分词,以便提高全文检索的准确性和效率。理解 Analyzer 的工作原理以及如何定制和使用 Analyzer 是深入学习 Lucene 全文检索技术...
例如,IKAnalyzer类作为主要的入口点,配置了分词策略,并调用了Tokenizer进行初步分词,然后通过一系列TokenFilter进行进一步的词语切分和优化。 在实际应用中,我们可能会遇到一些特定需求,比如自定义停用词表、...
6. **自定义扩展**:如果需要处理特殊词汇,可以实现`org.apache.lucene.analysis.TokenFilter`或`org.apache.lucene.analysis.Tokenizer`,并添加到分词流程中。 IKAnalyzer支持与Lucene、Solr等全文检索框架的...
3. **扩展机制**:IKAnalyzer支持插件化开发,用户可以通过实现`TokenFilter`接口来定制自己的分词规则。源码中的`TokenStream`类和`Token`类是实现这个机制的基础。 4. **词性标注**:源码中的`PosSegment`类实现...
2. 词元过滤器(TokenFilter):对分词器生成的词元进行进一步处理,如删除停用词、词形还原等。 3. 文档分析器(Analyzer):结合分词器和过滤器,根据特定语言规则对文档进行分析。 4. 倒排索引(Inverted Index...
虽然lucene.net.analysis.cn提供了基本的中文分词功能,但在实际应用中,我们可能需要根据具体需求进行优化和扩展,比如引入自定义词典、调整分词策略、实现自定义过滤器等。 总结,lucene.net.analysis.cn是Lucene...
此外,还可以实现自定义TokenFilter和Tokenizer,对分词结果进行进一步处理,如去除停用词、词性标注等。 接下来是字段配置。在Lucene中,每个文档由多个字段组成,每个字段可以设置不同的属性,如是否存储原始值、...
3. 词项分析器(TokenFilter):分析器允许我们对分词器产生的Token进行进一步处理,例如去除停用词、词形还原等。 4. 倒排索引:Lucene的核心是倒排索引,它将每个词映射到包含该词的文档集合,并记录每个词在文档...
以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和扩展功能。通过学习这些内容,可以深入理解Lucene的工作机制,并利用其强大的搜索能力构建高效的应用。
3. 词元过滤器(TokenFilter):分词后的词元经过词元过滤器进一步处理,如词干提取(Stemming)、同义词扩展等,提升搜索效果。 4. 索引(Indexing):Lucene.NET通过建立倒排索引(Inverted Index),将每个文档...
3. 自定义`StopFilter`:创建一个新的`Filter`类,继承自`Lucene`的`TokenFilter`,并在`incrementToken()`方法中实现敏感词的检查和过滤。 4. 应用`StopFilter`:在建立`Analyzer`实例时,使用自定义的`StopFilter`...
在Lucene中,分词器(Tokenizer)负责将输入的文本分割成一个个独立的词语,然后通过词过滤器(TokenFilter)进行进一步的处理,如去除停用词、词形还原等。 在处理中文文本时,Lucene需要特殊处理,因为中文的分词...
此外,还需要编写一个TokenFilter,这个过滤器会在每次请求时检查请求头中的JWT,如果发现Token即将过期,就调用刷新接口获取新的Token。这个过程应该设计为无感知的,即用户在正常使用应用时,后台自动完成Token的...
在Lucene中,所有的索引数据都必须存储在一个实现了`Directory`接口的对象中。 - **IndexWriter**:索引写入器,用于创建或更新索引。通过`IndexWriter`可以添加新文档、删除现有文档或整个索引,以及优化索引等操作...
“org”目录下包含了一系列与Lucene相关的类,这些类主要负责实现中文分词和其他语言处理任务。例如,`org.apache.lucene.analysis.cn.*`包下的类,如ChineseAnalyzer,是专为中文文本设计的分析器,它采用了诸如IK...
2. 字符过滤器(CharFilter)和词过滤器(TokenFilter):这些过滤器允许我们对分词结果进行预处理,比如去除停用词、词形还原或者进行词性标注。 3. 索引(Indexing):Lucene通过构建倒排索引来实现快速搜索。...