Использование синонимов wordnet для расширения запроса в версии Lucene 4.2

Я использую Lucene 4.2 и хотел бы знать, как можно использовать wordnet для расширения входного запроса для этой версии Lucene. В принципе, если мой запрос похож на

term_1 AND term_2 OR term_3

Я бы хотел, чтобы он был расширен как

(term_1 OR term_1syn_1 OR term_1syn_2) AND (term_2 OR term_2syn_1) OR (term_3 OR term_3syn_1)

и так далее.

Я просмотрел другие ответы на StackoverFlow на этот вопрос, но ни у одного из них нет образца реализации.

Учитывая входной запрос в виде строки, как я могу расширить его с помощью классов WordNetQueryParser и SynonymMap?

Я уже скачал файл пролога wordnet и знаю, что в файле _s.pl есть все синонимы.

Мы будем очень признательны за любой образец кода.


person London guy    schedule 28.03.2013    source источник
comment
ограничены ли проиндексированные термины?   -  person phanin    schedule 28.03.2013
comment
Да, термины в указателе созданы с помощью SnowBallFilter версии lucene 4.2.   -  person London guy    schedule 29.03.2013


Ответы (1)


SynonymFilter позволяет определить < href = "http://lucene.apache.org/core/4_0_0/analyzers-common/org/apache/lucene/analysis/synonym/SynonymMap.html"> SynonymnMap в простой пользовательский анализатор.

Вы можете создать собственный анализатор, просто переопределив Analyzer.createComponents и передайте настраиваемую версию как IndexWriter, так и QueryParser при записи и поиске соответственно.

Следует учитывать, что в вашем случае все возможные синонимы будут исключены, что будет означать передачу includeOrig значения true в Builder.add. В любом случае здесь есть преимущества, вы можете изучить, какой из них лучше всего удовлетворит ваши потребности.


Analyzer Lucene разработан, чтобы его можно было легко расширить, чтобы легко определить форматирование для вашего конкретного случая. Документация Analyzer API, ссылка на которую приведена выше, предоставляет пример переопределения метода createComponents для вашего пользовательского анализатора.

Что-то типа:

protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new ClassicTokenizer(Version.LUCENE_40, reader);
    TokenStream filter = new StandardFilter(Version.LUCENE_40, source);
    filter = new LowerCaseFilter(Version.LUCENE_40,filter);
    filter = new SynonymFilter(filter, mySynonymMap, false);
    //Whatever other filter you want to add to the chain, being mindful of order.
    return new TokenStreamComponents(source, filter);
}

И вам нужно будет определить mySynonymMap из примера, который является SynonymnMap. SynonymMap обычно должен создаваться SynonymMap.Builder с помощью метода add(CharsRef, CharsRef, boolean), указанного выше.

SynonymMap.Builder builder = new SynonymMap.Builder(true); 
builder.add(new CharsRef("crimson"), new CharsRef("red"), true); 
//Be sure the boolean last arg you pass there is the one you want.  There are significant tradeoffs here.
//Add as many terms as you like here...
SynonymMap mySynonymMap = builder.build();

Также существует WordNetSynonymParser, если вы предпочитаете это, который выглядит как просто SynonymMap.Builder, предназначенный для быстрого чтения специфических спецификаций.

person femtoRgon    schedule 28.03.2013
comment
Большое спасибо. Я читал ваше описание много раз, и хотя я действительно понимаю поток, я не могу сшить все вместе. Не могли бы вы предоставить некоторые детали реализации, какой метод вызывать после какого класса и так далее? Я все еще не понимаю, как это реализовать. - person London guy; 31.03.2013
comment
Я добавил некоторые подробности по этому поводу, но это все, что в значительной степени указано в документации, на которую я ссылался, поэтому я не знаю, что вам нужно. Есть ли что-то особенное, в чем вы запутались? - person femtoRgon; 31.03.2013
comment
Спасибо, что добавили так много деталей. Я все еще пытаюсь понять, как использовать WordNetSynonymParser. Можете ли вы просто вставить образец кода с помощью этого класса? - person London guy; 18.04.2013
comment
@AbhishekShivkumar Это подкласс SynonymnMap.builder, разработанный для синтаксического анализа пролога wordnet, поэтому его использование аналогично. Похоже, вы просто составили его, передали читателю пролога вашей wordnet parser.add и позвонили parser.build(), чтобы получить SynonymMap. Получив SynonymMap, вы можете использовать его для создания своего SynonymFilter, как указано в моем ответе выше. - person femtoRgon; 18.04.2013