#c# #asp.net #lucene.net
#c# #asp.net #lucene.net
Вопрос:
я использовал Lucene.Net.SynonymEngine.dll в качестве ссылки в моем приложении
у меня проблема с использованием таких функций, как synonymAnalyzer, ISynonymEngine
я пробовал использовать
SynonymAnalyzer syn = new SynonymAnalyzer(ISynonymEngine engine);
и
Analyzer a =new SynonymAnalyzer(ISynonymEngine engine);
но ни то, ни другое, похоже, не работает, кто-нибудь может помочь? заранее благодарю вас…
Ответ №1:
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 resu<
}
}
Комментарии:
1. это определения, можете ли вы привести мне пример, как это используется в программе c #…
Ответ №2:
вы можете создать свой анализатор, как показано ниже
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());
Комментарии:
1. я на самом деле хотел получить синонимы слова через мою программу, есть ли способ сделать это, не заставляя меня вручную устанавливать синонимы????
2. вы можете реализовать
ISynonymEngine
интерфейс, который возвращает синонимы, и передать свой собственный класс вSynonymAnalyzer
3. значит, по сути, я должен установить все синонимы самостоятельно???? сэр, у вас есть идея об использовании WordNet??? это было бы большим подспорьем…
4. @user111 Ты спросил
i have problem using the functions like synonymAnalyzer, ISynonymEngine
и получил свой ответ. По какой причине вы не принимаете этот ответ?
Ответ №3:
Синонимический фильтр класса C #
public class SynonymFilter : TokenFilter
{
public ISynonymEngine SynonymEngine { get; private set; }
private Queue<string> splittedQueue = new Queue<string>();
private readonly ITermAttribute _termAttr;
private readonly IPositionIncrementAttribute _posAttr;
private readonly ITypeAttribute _typeAttr;
private State currentState;
public SynonymFilter(TokenStream input, ISynonymEngine synonymEngine)
: base(input)
{
if (synonymEngine == null)
throw new ArgumentNullException("synonymEngine");
SynonymEngine = synonymEngine;
_termAttr = AddAttribute<ITermAttribute>();
_posAttr = AddAttribute<IPositionIncrementAttribute>();
_typeAttr = AddAttribute<ITypeAttribute>();
}
public override bool IncrementToken()
{
if (splittedQueue.Count > 0)
{
string splitted = splittedQueue.Dequeue();
RestoreState(currentState);
_termAttr.SetTermBuffer(splitted);
_posAttr.PositionIncrement = 0;
return true;
}
if (!input.IncrementToken())
return false;
var currentTerm = new string(_termAttr.TermBuffer(), 0, _termAttr.TermLength());
IEnumerable<string> synonyms = SynonymEngine.GetSynonyms(currentTerm);
if (synonyms == null)
{
return false;
}
foreach (string syn in synonyms)
{
if (!currentTerm.Equals(syn))
{
splittedQueue.Enqueue(syn);
}
}
return true;
}
}