C# 如何在lucene.net中使用函数同义词分析器
我在应用程序中使用了Lucene.Net.SynonymEngine.dll作为引用 我在使用同义词分析器、ISynonymEngine等函数时遇到问题C# 如何在lucene.net中使用函数同义词分析器,c#,asp.net,lucene.net,C#,Asp.net,Lucene.net,我在应用程序中使用了Lucene.Net.SynonymEngine.dll作为引用 我在使用同义词分析器、ISynonymEngine等函数时遇到问题 public class MySynonyms : Lucene.Net.SynonymEngine.ISynonymEngine { public IEnumerable<string> GetSynonyms(string word) { if (word == "quick") return
public class MySynonyms : Lucene.Net.SynonymEngine.ISynonymEngine
{
public IEnumerable<string> GetSynonyms(string word)
{
if (word == "quick") return new List<string>{"fast"};
return new List<string>();
}
}
SynonymAnalyzer sa = new SynonymAnalyzer(new MySynonyms());
我试过使用
SynonymAnalyzer syn=新的SynonymAnalyzer(ISynonymEngine引擎)代码>
及
Analyzer a=新的同义词分析器(ISynonymEngine引擎)代码>
但这两种方法似乎都不管用,有人能帮忙吗?
提前感谢您…您可以像下面这样创建您的分析器
public class SynonymAnalyzer : Analyzer
{
public ISynonymEngine SynonymEngine { get; private set; }
public SynonymAnalyzer(ISynonymEngine engine)
{
SynonymEngine = engine;
}
public override TokenStream TokenStream
(string fieldName, System.IO.TextReader reader)
{
//create the tokenizer
TokenStream result = new StandardTokenizer(reader);
//add in filters
// first normalize the StandardTokenizer
result = new StandardFilter(result);
// makes sure everything is lower case
result = new LowerCaseFilter(result);
// use the default list of Stop Words, provided by the StopAnalyzer class.
result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS);
// injects the synonyms.
result = new SynonymFilter(result, SynonymEngine);
//return the built token stream.
return result;
}
}
SynonymAnalyzer sa = new SynonymAnalyzer(new XmlSynonymEngine(yourXmlFilesPath));
但首先应该为同义词创建一个xml文件
<?xml version="1.0" encoding="utf-8" ?>
<synonyms>
<group>
<syn>fast</syn>
<syn>quick</syn>
<syn>rapid</syn>
</group>
<group>
<syn>slow</syn>
<syn>decrease</syn>
</group>
<group>
<syn>google</syn>
<syn>search</syn>
</group>
<group>
<syn>check</syn>
<syn>lookup</syn>
<syn>look</syn>
</group>
</synonyms>
快速的
快的
迅速的
缓慢的
减少
谷歌
搜索
检查
查找
看
------编辑---------
请参阅ISynonymEngine的原语实现
public class MySynonyms : Lucene.Net.SynonymEngine.ISynonymEngine
{
public IEnumerable<string> GetSynonyms(string word)
{
if (word == "quick") return new List<string>{"fast"};
return new List<string>();
}
}
SynonymAnalyzer sa = new SynonymAnalyzer(new MySynonyms());
公共类MySynonyms:Lucene.Net.SynonymEngine.ISynonymEngine
{
公共IEnumerable同义词(字符串字)
{
if(word==“quick”)返回新列表{“fast”};
返回新列表();
}
}
同义词分析器sa=新同义词分析器(new mysynoyms());
您可以像下面这样创建分析仪
SynonymAnalyzer sa = new SynonymAnalyzer(new XmlSynonymEngine(yourXmlFilesPath));
但首先应该为同义词创建一个xml文件
<?xml version="1.0" encoding="utf-8" ?>
<synonyms>
<group>
<syn>fast</syn>
<syn>quick</syn>
<syn>rapid</syn>
</group>
<group>
<syn>slow</syn>
<syn>decrease</syn>
</group>
<group>
<syn>google</syn>
<syn>search</syn>
</group>
<group>
<syn>check</syn>
<syn>lookup</syn>
<syn>look</syn>
</group>
</synonyms>
快速的
快的
迅速的
缓慢的
减少
谷歌
搜索
检查
查找
看
------编辑---------
请参阅ISynonymEngine的原语实现
public class MySynonyms : Lucene.Net.SynonymEngine.ISynonymEngine
{
public IEnumerable<string> GetSynonyms(string word)
{
if (word == "quick") return new List<string>{"fast"};
return new List<string>();
}
}
SynonymAnalyzer sa = new SynonymAnalyzer(new MySynonyms());
公共类MySynonyms:Lucene.Net.SynonymEngine.ISynonymEngine
{
公共IEnumerable同义词(字符串字)
{
if(word==“quick”)返回新列表{“fast”};
返回新列表();
}
}
同义词分析器sa=新同义词分析器(new mysynoyms());
同义词过滤器C#类
公共类同义词过滤器:令牌过滤器
{
public ISynonymEngine同义词引擎{get;private set;}
private Queue splittedQueue=新队列();
私有只读ITermAttribute_termAttr;
私有只读IPositionIncrementAttribute\u posAttr;
私有只读ITypeAttribute_typeAttr;
私人国家;
公共同义词过滤器(令牌流输入,ISynonymEngine同义词引擎)
:基本(输入)
{
if(同义词引擎==null)
抛出新的ArgumentNullException(“同义词引擎”);
同义词引擎=同义词引擎;
_termAttr=AddAttribute();
_posAttr=AddAttribute();
_typeAttr=AddAttribute();
}
公共覆盖bool IncrementToken()
{
如果(splittedQueue.Count>0)
{
string splitted=splittedQueue.Dequeue();
恢复不动产(当前状态);
_termAttr.SETTERBUFFER(拆分);
_posAttr.PositionIncrement=0;
返回true;
}
如果(!input.IncrementToken())
返回false;
var currentTerm=新字符串(_termAttr.TermBuffer(),0,_termAttr.TermLength());
IEnumerable同义词=同义词引擎.GetSynonyms(currentTerm);
if(同义词==null)
{
返回false;
}
foreach(同义词中的字符串syn)
{
如果(!currentTerm.Equals(syn))
{
splittedQueue.Enqueue(syn);
}
}
返回true;
}
}
同义词过滤器C#类
公共类同义词过滤器:令牌过滤器
{
public ISynonymEngine同义词引擎{get;private set;}
private Queue splittedQueue=新队列();
私有只读ITermAttribute_termAttr;
私有只读IPositionIncrementAttribute\u posAttr;
私有只读ITypeAttribute_typeAttr;
私人国家;
公共同义词过滤器(令牌流输入,ISynonymEngine同义词引擎)
:基本(输入)
{
if(同义词引擎==null)
抛出新的ArgumentNullException(“同义词引擎”);
同义词引擎=同义词引擎;
_termAttr=AddAttribute();
_posAttr=AddAttribute();
_typeAttr=AddAttribute();
}
公共覆盖bool IncrementToken()
{
如果(splittedQueue.Count>0)
{
string splitted=splittedQueue.Dequeue();
恢复不动产(当前状态);
_termAttr.SETTERBUFFER(拆分);
_posAttr.PositionIncrement=0;
返回true;
}
如果(!input.IncrementToken())
返回false;
var currentTerm=新字符串(_termAttr.TermBuffer(),0,_termAttr.TermLength());
IEnumerable同义词=同义词引擎.GetSynonyms(currentTerm);
if(同义词==null)
{
返回false;
}
foreach(同义词中的字符串syn)
{
如果(!currentTerm.Equals(syn))
{
splittedQueue.Enqueue(syn);
}
}
返回true;
}
}
这些是定义,你能给我一个例子,它在c程序中是如何使用的吗?这些是定义,你能给我一个例子,它在c程序中是如何使用的吗?我实际上想通过我的程序得到一个单词的同义词,有没有一种不用我手动设置同义词的方法?你可以实现吗ISynonymEngine
接口,它返回同义词并将您自己的类传递给SynonymAnalyzer
,因此基本上我必须自己设置所有同义词????先生,你有使用wordNet的想法吗???这将是一个很大的帮助…@user111你问的我在使用同义词分析器之类的函数时遇到问题,ISynonymEngine
得到了你的答案。你不接受答案的原因是什么?我实际上想通过我的程序得到一个单词的同义词,有没有办法不用我手动设置同义词?你可以实现ISynonymEngine
接口,返回同义词并将自己的类传递给同义词分析器
因此基本上我必须设置所有