как использовать функцию SynonymAnalyzer в lucene.net

#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;
    }
}