Как получить часто происходящие фразы с Lucene

Я хотел бы получить некоторые часто происходящие фразы с Lucene. Я получаю некоторую информацию из файлов TXT, и я теряю много контекста для того, чтобы не иметь информацию для фраз, например, "информационный поиск" индексируется как два отдельных слова.

Что путь состоит в том, чтобы получить фразы как это? Я ничто не могу найти полезным в Интернете, всех советах, ссылках, подсказки особенно, примеры ценятся!

Править: Я храню свои документы только заголовком и содержанием:

 Document doc = new Document();
 doc.add(new Field("name", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
 doc.add(new Field("text", fReader, Field.TermVector.WITH_POSITIONS_OFFSETS));

потому что для то, что я делаю самое важное, является содержанием файла. Заголовки являются слишком часто не описательными вообще (например, у меня есть много научных работ PDF, заголовки которых являются кодами или числами).

Я отчаянно должен индексировать главные происходящие фразы от текстового содержания, сейчас я вижу, насколько этот простой "мешок слов" подход не эффективен.

5
задан Michal Kordas 17 November 2015 в 08:36
поделиться

3 ответа

Джулия, Похоже, вы ищете н-граммы , в частности биграммы (также называемые сочетаниями) .

Вот глава о поиске словосочетаний (PDF) из книги Мэннинга и Шутце Основы статистической обработки естественного языка .

Чтобы сделать это с Lucene, я предлагаю использовать Solr с ShingleFilterFactory . Пожалуйста, см. это обсуждение для получения подробной информации.

7
ответ дан 14 December 2019 в 08:40
поделиться

Можно ли опубликовать какой-либо код, который вы написали?

В основном многое зависит от того, как вы создаете свои поля и храните документы в lucene.

Давайте рассмотрим случай, когда у меня есть два поля: ID и комментарии; и в моем поле идентификатора я разрешаю такие значения, как «поиск немо», то есть строки с пробелом. В то время как «Комментарии» - это текстовое поле со свободным текстом, то есть я разрешаю все и вся, что позволяет моя клавиатура и что может понять lucene.

В реальной жизни не имеет смысла делать мой идентификатор: «в поисках немо» двумя разными строками с возможностью поиска. А я хочу все проиндексировать в комментариях.

Итак, что я сделаю, я создам объект документа ( org.apache.lucene.document.Document ), чтобы позаботиться об этом ... Что-то вроде этого

Document doc = new Document();
doc.add(new Field("comments","Finding nemo was a very tough job for a clown fish ...", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("id", "finding nemo", Field.Store.YES, Field.Index.NOT_ANALYZED));

Итак, по сути Я создал два поля:

  1. комментарии: где я предпочел проанализировать его, используя Field.Index.ANALYZED
  2. id: где я указал lucene сохранить его, но не анализируйте его Field.Index.NOT_ANALYZED

Вот как вы настраиваете lucene для токенизатора и анализатора по умолчанию. В противном случае вы можете написать свой собственный токенизатор и анализаторы.

Ссылка (-ы) http://darksleep.com/lucene/

Надеюсь, это поможет вам ... :)

0
ответ дан 14 December 2019 в 08:40
поделиться

Проблема потери контекста для фраз может быть решена с помощью PhraseQuery.

Индекс по умолчанию содержит позиционную информацию о терминах, если вы не создали чисто логическое значение. полей путем индексации с параметром omitTermFreqAndPositions. PhraseQuery использует эту информацию для поиска документов, в которых термины находятся на определенном расстоянии друг от друга.

Например, предположим, что в поле есть фраза «Быстрая коричневая лиса перепрыгнула через ленивую собаку». Не зная точной фразы, вы все равно можете найти этот документ, выполнив поиск документов с полями, имеющими quick и fox рядом друг с другом. Конечно, простой TermQuery поможет найти этот документ, зная любое из этих слов, но в этом случае нам нужны только документы, в которых есть фразы, в которых слова либо расположены точно рядом (быстрый лис), либо имеют одно слово между ними ( быстрая [неактуальная] лиса). Максимально допустимое позиционное расстояние между терминами, которое считается совпадением, называется уклонением. Расстояние - это количество позиционных перемещений терминов, чтобы восстановить фразу по порядку.

Ознакомьтесь с JavaDoc Lucene для PhraseQuery

См. Этот пример кода, который демонстрирует, как работать с различными объектами запроса:

Вы также можете попытаться объединить различные типы запросов с помощью класса BooleanQuery.

Что касается частоты фраз, я полагаю, что оценка Lucene учитывает частоту употребления терминов в документах.

0
ответ дан 14 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: