向国外教授请教问题lucene的同义词问题

请教lucene的同义词问题,很急 - 开源中国社区
当前访客身份:游客 [
当前位置:
你好,想跟你请教个问题:
我想问你关于同义词的集成到lucene中的问题,我现在想给每个同义词加权重,但是没有具体给每个词负权重的方法,
共有2个答案
<span class="a_vote_num" id="a_vote_num_
能说得具体一点吗? 是指同一个文本分词的时候, 生成对应的同义词, 然后在把同义词加上权重吗?
--- 共有 3 条评论 ---
: 你好,能不能具体一点,贴一点代码上去啊,感激不尽
(3年前)&nbsp&
: 其实建立索引的时候可以不针对值加boost的, 在建立query的时候设置权重就好了, 比如查询"中国"解析成"中国 1.0 天朝 0.9"这样样子.
不过具体还得看你的应用场景
(3年前)&nbsp&
是的,我的意思,可以这么理解,简单的说,我现在对于每个词的都有权重,譬如:中国 和大陆的 相似度为。09,中国和天朝的相似度是0.95,我已经按照网上的一般方法重写了一个analyzer,但是我不能对每一个单独词加入相似度的值
(3年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
后排学习。。
更多开发者职位上
有什么技术问题吗?
类似的话题lucene4.5.0之同义词实现
lucene4.5.0之同义词实现
发布时间: 16:00:45
编辑:www.fx114.net
本篇文章主要介绍了"lucene4.5.0之同义词实现",主要涉及到lucene4.5.0之同义词实现方面的内容,对于lucene4.5.0之同义词实现感兴趣的同学可以参考一下。
public class MyAnalyzer extends Analyzer {
private CharArraySet stopsArraySet=
public MyAnalyzer() {
// TODO Auto-generated constructor stub
public MyAnalyzer(CharArraySet stopsArraySet) {
this.stopsArraySet = stopsArrayS
protected TokenStreamComponents createComponents(String fieldName,
Reader reader) {
StandardTokenizer srcStandardTokenizer=new StandardTokenizer(Version.LUCENE_45, reader);
TokenStream tokenStream=new StandardFilter(Version.LUCENE_45, srcStandardTokenizer);
tokenStream=new LowerCaseFilter(Version.LUCENE_45, tokenStream);
tokenStream=new StopFilter(Version.LUCENE_45, tokenStream,stopsArraySet);
tokenStream=new MyTokenFilter(tokenStream);
return new TokenStreamComponents(srcStandardTokenizer, tokenStream);
public void analysis( String str,Analyzer analyzer)
ts=analyzer.tokenStream(&content&, new StringReader(str));
CharTermAttribute cta=ts.addAttribute(CharTermAttribute.class);
PositionIncrementAttribute pia=ts.addAttribute(PositionIncrementAttribute.class);
OffsetAttribute oa=ts.addAttribute(OffsetAttribute.class);
TypeAttribute ta=ts.addAttribute(TypeAttribute.class);
PositionLengthAttribute positionLengthAttribute=ts.addAttribute(PositionLengthAttribute.class);
ts.reset();
while(ts.incrementToken())
System.out.println(&[&+cta+&]:&+pia.getPositionIncrement()+& &
+oa.startOffset()+& &+oa.endOffset()+& &+ta.type()+& &+
positionLengthAttribute.getPositionLength());
} catch (IOException e) {
e.printStackTrace();
if(ts!=null)
ts.close();
} catch (IOException e) {
e.printStackTrace();
public final class MyTokenFilter extends TokenFilter {
private CharTermAttribute charTermA
private PositionIncrementAttribute positionIncrementA
private Stack&String& sames=new Stack&String&();
protected MyTokenFilter(TokenStream input) {
super(input);
charTermAttribute=input.addAttribute(CharTermAttribute.class);
positionIncrementAttribute=input.addAttribute(PositionIncrementAttribute.class);
// TODO Auto-generated constructor stub
public boolean incrementToken() throws IOException {
// TODO Auto-generated method stub
if(sames.size()&0)
restoreState(currentstate);
charTermAttribute.setEmpty();
String top=sames.pop();
charTermAttribute.append(top);
positionIncrementAttribute.setPositionIncrement(0);
if(!input.incrementToken())
getsamewords(charTermAttribute.toString());
public void getsamewords(String name)
Map&String,String[]& maps=new HashMap&String, String[]&();
maps.put(&zhongguo&,new String[]{&dalu&,&tianchao&});
maps.put(&wo&, new String[]{&zan&,&me&});
String[] searchStrings=maps.get(name);
if(searchStrings==null)
for(int i=0;i&maps.get(name).i++)
sames.push(maps.get(name)[i]);
currentstate=captureState();
public void TestStandAnalyzer()
AnalyzerUtil auAnalyzerUtil=new AnalyzerUtil();
LinkedList&java.lang.String& stopList=new LinkedList&java.lang.String&();
stopList.add(&this&);
stopList.add(&is&);
stopList.add(&a&);
stopList.add(&that&);
stopList.add(&like&);
CharArraySet stopwordSet=new CharArraySet(Version.LUCENE_45,stopList, true);
auAnalyzerUtil.analysis(&This is a dog. That is a cat. wo like football but wo don't like & +
&basketball. & +&zhongguo is greate
country.&,
new MyAnalyzer(new CharArraySet(Version.LUCENE_45,stopwordSet, true)));
[dog]:4 10 13 &ALPHANUM& 1
[cat]:4 25 28 &ALPHANUM& 1
[wo]:1 30 32 &ALPHANUM& 1
[me]:0 30 32 &ALPHANUM& 1
[zan]:0 30 32 &ALPHANUM& 1
[football]:2 38 46 &ALPHANUM& 1
[but]:1 47 50 &ALPHANUM& 1
[wo]:1 51 53 &ALPHANUM& 1
[me]:0 51 53 &ALPHANUM& 1
[zan]:0 51 53 &ALPHANUM& 1
[don't]:1 54 59 &ALPHANUM& 1
[basketball]:2 65 75 &ALPHANUM& 1
[zhongguo]:1 77 85 &ALPHANUM& 1
[tianchao]:0 77 85 &ALPHANUM& 1
[dalu]:0 77 85 &ALPHANUM& 1
[greate]:2 89 95 &ALPHANUM& 1
[country]:1 97 104 &ALPHANUM& 1
本文标题:
本页链接:09:35 提问
lucene做同义词练习,关于restoreState的疑问。
比如一句话有我,
他的同义词是咱、俺。
网上的代码一般是
循环遍历执行incrementToken,然后每次添加一个同义词
// 如果有同义词
if (sames.size() & 0) {
// 将元素出栈,并且获取这个同义词
String str = sames.pop();
// 还原状态
restoreState(current);
cta.setEmpty();
cta.append(str);
// 设置位置0
pia.setPositionIncrement(0);
为什么不能是,如果有同义词,一次全部取出来:这样的执行结果是,只有最后一个同义词。
if (sames.size() & 0) {
while (sames.size() & 0) {
// 将元素出栈,并且获取这个同义词
String str = sames.pop();
// 还原状态
restoreState(current);
cta.setEmpty();
cta.append(str);
// 设置位置0
pia.setPositionIncrement(0);
这是为什么啊?
按赞数排序
如果是做同义词练习,在增加同义词时,应该用的是 cta.copyBuffer(). 当然了这跟这次提问无关。
while循环里做的工作,明显后覆盖上一次循环的结果。所以最终只是添加了最后一次添加的同义词。所以要想不被覆盖,就得添加后return。
其他相似问题lucene学习之分析过程自定义近义词分析器
影响分析器选择的一个原因是语种另一个原因是被分析的文本所属的域
import java.io.*;
public interface SynonymEngine {
String[] getSynonyms(String s) throws IOE
import java.util.*;
public class TestSynonymEngine implements SynonymEngine{
private static HashMap&String,String[]& map =
new HashMap&String,String[]&();
map.put(&quick&, new String[] {&fast&,&speeedy&});
map.put(&jumps&, new String[]{&leaps&,&hops&});
map.put(&over&, new String[] {&above&});
map.put(&lazy&, new String[] {&apathetic&,&sluggish&});
map.put(&dog&, new String[] {&canine&,&pooch&});
public String[] getSynonyms(String s){
return map.get(s);
import java.io.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.core.*;
import org.apache.lucene.analysis.standard.*;
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);
实现createComponents方法,创建分析器链
Tokenizer通过Reader读取字符并创建语汇单元,而TokenFilter则负责处理输入的语汇单元
import org.apache.lucene.analysis.*;
public class SynonymAnalyzerTest {
public static void main(String[] args) throws Exception
String text = &The quick brown fox jumps over the lazy dog&;
Analyzer analyzer = new SynonymAnalyzer(new TestSynonymEngine());
AnalyzerDome.displayTokens(analyzer, text);
&#65279;&#65279;
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
1.确定要解决的问题及意义 在基于代码片段的分类过程中,由于程序员对数据变量名的选取可能具有一定的规范性,在某一特定业务处理逻辑代码中,可能多个变量名之间具有关联性或相似性(如“trade”(商品交易)类中,可能存在“business”,“transaction”,“deal”等同义词),在某些情况下,它们以不同的词语表达了相同的含义.因此,为了能 ...
安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elasticsearch 其实es的安装非常简单了 https://www.elastic.co/downloads/elasticsearch cd /tmp wge ...
当学习英语时我们发现词汇量相当大,而且最令人讨厌的莫过于里面还有很多同义词,近义词.相当让人无语,纠结. 如果说近义词还有比较大的用处,可以用来精准的描述一些细微的差别.那同义词基本上用处不大,大部分同义词应该完全去掉,这样可以降低学习难度. 不过现实情况肯定是不完美的,由于各种历史渊源,同义词会一直存在着并增加我们的学习难度.
近义词 近义词,顾名思义 ...
资料来源:基于WordNet的英文同义词.近义词相似度评估及代码实现 初识WordNet WordNet是什么 首先,来看WordNet.搜了一下相关介绍: WordNet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护的英语字典.开发工作从1985年开始,从此以后该项目接受了超过300万美元的资助(主要来源于对机器翻译有兴趣的 ...
最近要弄商品搜索近义词功能, 比如输入商汞 要搜到混泥土,我用的是solr4.2版本,网上转了一圈都没有我要的方案,也没有现成的类, 于是找到 lucene TokenFilterFactory类 但我用的是IKAnalyzer2012FF_u1版本 其中分词只有 IKAnalyzer.class这个类,而近义词已工厂方式去处理,故在org.wltea.an ...
备注:所有基础的练习题都不能借助相应功能的工具函数 一.句子逆序描述:
将一个英文语句以单词为单位逆序排放.例如“I am a boy”,逆序排放后为“boy a am I” 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符 接口说明 /**
* 反转句子
* @param sentence 原句子
* @return 反转 ...
昨天主要做近义词 加权处理,将抓来的数据根据第三方 数据统计每个词出现的次数,这样来判定每个词的权值,并对于每组的词找出权值最大的. 主要熟悉了:文件读取的方法: 主要问题:空行的处理,遇见空行,不能单纯的用NULL来判定结束,不然就会卡死. 对于每个存储单词的数组,每次要初始化 fp = fopen(&文件&, &w+r&qu ...
题目要求:一.近义词维护 给定接口,设置两个单词相互近义.近义词具有相互传递性,如果A和B为近义词,B和C是近义词,那么A.B.C都为近义词.要求提供接口,查询给定的两个但是是否是近义词关系.并且能提供接口清除所有的近义词关系. 接口说明 /**
* 设置2个单词为近义词
* @param word1 单词一
* @param word2 单词二

我要回帖

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

 

随机推荐