请教问题的英文邮件lucene的同义词问题

lucene中怎么实现 “同义词”功能呢 - 搜索引擎当前位置:& &&&lucene中怎么实现 “同义词”功能呢lucene中怎么实现 “同义词”功能呢&&网友分享于:&&浏览:291次lucene中如何实现 “同义词”功能呢?lucene中如何实现 “同义词”功能呢?请提供一下思路,请专家赐教------解决方案--------------------分析日志吧比如用户搜索
周杰伦 然后搜索JAY& 这样出现的概率比较高,就算是同义词
------解决方案--------------------哈工大有同义词林,是可以利用的数据实现上,你可以在索引时将同义词索引进去也可以再检索时用同义词添加一个布尔查询
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有lucene-同义词分析器-java-电脑编程网lucene-同义词分析器作者:deepfuture 和相关&&
这个分析器用SynonymFilter过滤器对StandardAnalyzer类进行封装,当向这个过滤器输入各个项时,会对这些项进行缓冲,并使用栈存储这些项的同义词
public class SynonymFilter extends TokenFilter{
&&& publicstatic final String TOKEN_TYPE_SYNONYM="SYNONYM";
&&& privateStack synonymS
&&& privateSynonynE
&&& publicSynonymFilter(TokenStream in,SynonymEngine engine){
&&&&&&&&&super(in);
&&&&&&&&&synonymStack=new Stack();//缓存同义词
&&&&&&&&&this.engine=
&&& }
&&& publicTOken next() throws IOException{
&&&&&&&&if (synonymStack.size()&0){//如何还有当前词的同义词没有输出,则输出
  &&&&&&&&&&&&&&return (Token) synonymStack.pop();
  &&&&&&&&}
&&&&&&&&Token token=input.next();//读取新词
&&&&&&&&if (token==null) {
&&&&&&&&&&&&
&&&&&&&&}
&&&&&&&&addAliasesToStack(token);//存储新词的同义词
&&&&&&&&&
&&& }
&& private voidaddAliasesToStack(Token token) throws IOException{
&&&&&&&&&&String[] synonyms=engine.getSynonyms(token.termText());
&&&&&&&&&&if (synonyms==mull)
&&&&&&&&&&for (int i=0;i&synonyms.i++){
&&&&&&&&&&&&&&&Token synToken=newToken(synonyms[i],token.startOffset(),token.endOffset(),TOKEN_TYPE_SYNONYM);
&&&&&&&&&&synToken.setPositionIncrement(0);
&&&&&&&&&synonymStack.push(synToken);&&&
&&&&&&&&&&&}
&& }
以下这个接口是关键,可以自由实现,目的是返回s的同义词数组
public interface SynonymEngine{
&&&&String[] getSynonyms(String s) throws IOE
}
对于这个接口要小心使用,在查询时不必列出所有的同义词,如下例
Query query=QueryParser.parse("\"foxjumps\"","content",synonymAnalyzer);
Hits hits=searcher.search(query);
是会出错的,找不到任何结果,因为QueryParser不会区别位置增量,所以位置增量为0这一个表明同义的特征无法体现,会将"foxjumps"直接加上同义词解释为"fox jumps hops leaps"
相关资料:|||||||lucene-同义词分析器来源网络,如有侵权请告知,即处理!编程Tags:                &                    Lucene5学习之自定义同义词分词器简单示例 - 推酷
Lucene5学习之自定义同义词分词器简单示例
同义词功能在全文搜索时的意义,大家应该都懂的。今天中文我就试着写了一个同义词分词的示例demo,其实主要代码还是参考Lucene in Action 这本英文版书籍的随书代码, 只不过Lucenen in Action书里的示例代码目前最新版只支持到Lucene4.x ,对于Lucene5.x,代码需要稍作修改,下面是基于Lucene5.x的自定义同义词分词器demo:
package com.yida.framework.lucene5.analyzer.
import java.io.IOE
* 同义词提取引擎
* @author Lanxiaowei
public interface SynonymEngine {
String[] getSynonyms(String s) throws IOE
package com.yida.framework.lucene5.analyzer.
import java.io.IOE
import java.util.HashM
public class BaseSynonymEngine implements SynonymEngine {
private static HashMap&String, String[]& map = new HashMap&String, String[]&();
map.put(&quick&, new String[] {&fast&,&speedy&});
map.put(&jumps&, new String[] {&leaps&,&hops&});
map.put(&over&, new String[] {&above&});
map.put(&lazy&, new String[] {&apathetic&,&slugish&});
map.put(&dog&, new String[] {&canine&,&pooch&});
public String[] getSynonyms(String s) throws IOException {
return map.get(s);
package com.yida.framework.lucene5.analyzer.
import java.io.IOE
import java.util.S
import org.apache.lucene.analysis.TokenF
import org.apache.lucene.analysis.TokenS
import org.apache.lucene.analysis.tokenattributes.CharTermA
import org.apache.lucene.analysis.tokenattributes.PositionIncrementA
import org.apache.lucene.util.AttributeS
* 自定义同义词过滤器
* @author Lanxiaowei
public class SynonymFilter extends TokenFilter {
public static final String TOKEN_TYPE_SYNONYM = &SYNONYM&;
private Stack&String& synonymS
private SynonymE
private AttributeSource.S
private final CharTermAttribute termA
private final PositionIncrementAttribute posIncrA
public SynonymFilter(TokenStream in, SynonymEngine engine) {
super(in);
synonymStack = new Stack&String&(); // #1
this.engine =
this.termAtt = addAttribute(CharTermAttribute.class);
this.posIncrAtt = addAttribute(PositionIncrementAttribute.class);
public boolean incrementToken() throws IOException {
if (synonymStack.size() & 0) { // #2
String syn = synonymStack.pop(); // #2
restoreState(current); // #2
// 这里Lucene4.x的写法
// termAtt.setTermBuffer(syn);
// 这是Lucene5.x的写法
termAtt.copyBuffer(syn.toCharArray(), 0, syn.length());
posIncrAtt.setPositionIncrement(0); // #3
if (!input.incrementToken()) // #4
if (addAliasesToStack()) { // #5
current = captureState(); // #6
private boolean addAliasesToStack() throws IOException {
// 这里Lucene4.x的写法
// String[] synonyms = engine.getSynonyms(termAtt.term()); //#8
// 这里Lucene5.x的写法
String[] synonyms = engine.getSynonyms(termAtt.toString()); // #8
if (synonyms == null) {
for (String synonym : synonyms) { // #9
synonymStack.push(synonym);
#1 Define synonym buffer
#2 Pop buffered synonyms
#3 Set position increment to 0
#4 Read next token
#5 Push synonyms onto stack
#6 Save current token
#7 Return current token
#8 Retrieve synonyms
#9 Push synonyms onto stack
package com.yida.framework.lucene5.analyzer.
import java.io.BufferedR
import java.io.R
import java.io.StringR
import org.apache.lucene.analysis.A
import org.apache.lucene.analysis.TokenS
import org.apache.lucene.analysis.T
import org.apache.lucene.analysis.Analyzer.TokenStreamC
import org.apache.lucene.analysis.core.LetterT
import org.apache.lucene.analysis.core.LowerCaseF
import org.apache.lucene.analysis.core.StopA
import org.apache.lucene.analysis.core.StopF
import org.apache.lucene.analysis.standard.StandardF
import org.apache.lucene.analysis.standard.StandardT
import com.yida.framework.lucene5.util.analyzer.codec.MetaphoneReplacementF
* 自定义同义词分词器
* @author Lanxiaowei
* @createTime
public class SynonymAnalyzer extends Analyzer {
private SynonymE
public SynonymAnalyzer(SynonymEngine engine) {
this.engine =
protected TokenStreamComponents createComponents(String text) {
Tokenizer tokenizer = new StandardTokenizer();
TokenStream tokenStream = new SynonymFilter(tokenizer, engine);
tokenStream = new LowerCaseFilter(tokenStream);
tokenStream = new StopFilter(tokenStream,StopAnalyzer.ENGLISH_STOP_WORDS_SET);
return new TokenStreamComponents(tokenizer, tokenStream);
package com.yida.framework.lucene5.analyzer.
import java.io.IOE
import org.apache.lucene.analysis.A
import com.yida.framework.lucene5.util.AnalyzerU
public class SynonymAnalyzerTest {
public static void main(String[] args) throws IOException {
String text = &The quick brown fox jumps over the lazy dog&;
Analyzer analyzer = new SynonymAnalyzer(new BaseSynonymEngine());
AnalyzerUtils.displayTokens(analyzer, text);
package com.yida.framework.lucene5.
import java.io.IOE
import junit.framework.A
import org.apache.lucene.analysis.A
import org.apache.lucene.analysis.TokenS
import org.apache.lucene.analysis.tokenattributes.CharTermA
import org.apache.lucene.analysis.tokenattributes.OffsetA
import org.apache.lucene.analysis.tokenattributes.PositionIncrementA
import org.apache.lucene.analysis.tokenattributes.TypeA
* 用于分词器测试的一个简单工具类(用于打印分词情况,包括Term的起始位置和结束位置(即所谓的偏 * 移量),位置增量,Term字符串,Term字符串类型(字符串/阿拉伯数字之类的))
* @author Lanxiaowei
public class AnalyzerUtils {
public static void displayTokens(Analyzer analyzer,String text) throws IOException {
TokenStream tokenStream = analyzer.tokenStream(&text&, text);
displayTokens(tokenStream);
public static void displayTokens(TokenStream tokenStream) throws IOException {
OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
PositionIncrementAttribute positionIncrementAttribute = tokenStream.addAttribute(PositionIncrementAttribute.class);
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
TypeAttribute typeAttribute = tokenStream.addAttribute(TypeAttribute.class);
tokenStream.reset();
int position = 0;
while (tokenStream.incrementToken()) {
int increment = positionIncrementAttribute.getPositionIncrement();
if(increment & 0) {
position = position +
System.out.print(position + &:&);
int startOffset = offsetAttribute.startOffset();
int endOffset = offsetAttribute.endOffset();
String term = charTermAttribute.toString();
System.out.println(&[& + term + &]& + &:(& + startOffset + &--&& + endOffset + &):& + typeAttribute.type());
* 断言分词结果
* @param analyzer
* @param text
* @param expecteds
期望分词后结果
* @throws IOException
public static void assertAnalyzerTo(Analyzer analyzer,String text,String[] expecteds) throws IOException {
TokenStream tokenStream = analyzer.tokenStream(&text&, text);
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
for(String expected : expecteds) {
Assert.assertTrue(tokenStream.incrementToken());
Assert.assertEquals(expected, charTermAttribute.toString());
Assert.assertFalse(tokenStream.incrementToken());
tokenStream.close();
以上代码都是Lucene in Action这本书里面的示例代码, 我 只不过是基于Lucene5.x把它重写并调试成功了,特此分享,希望对正在学习Lucene5的童鞋们有所帮助。demo代码我会在底下附件里上传,有需要demo源码的请自己在底下的附件里下载,Lucene in Action这本书的随书源码我已上传到我的百度网盘,也一并分享给大家,
Lucene in Action随书源码百度网盘下载地址
千言万语都在代码中 ,就不多说了,打完收工!
如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,
一起交流学习!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致lucene和IKAnalyzer的怎么做同义词功能不知道怎么做同义词功能,能给我教程吗?--------------------------------------------------------------好像IK 可以同义词 词典吧~
至于教程 没有!

我要回帖

更多关于 请教别人问题的邮件 的文章

 

随机推荐