Я хотел бы получить некоторые часто происходящие фразы с 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, заголовки которых являются кодами или числами).
Я отчаянно должен индексировать главные происходящие фразы от текстового содержания, сейчас я вижу, насколько этот простой "мешок слов" подход не эффективен.
Джулия, Похоже, вы ищете н-граммы , в частности биграммы (также называемые сочетаниями) .
Вот глава о поиске словосочетаний (PDF) из книги Мэннинга и Шутце Основы статистической обработки естественного языка .
Чтобы сделать это с Lucene, я предлагаю использовать Solr с ShingleFilterFactory . Пожалуйста, см. это обсуждение для получения подробной информации.
Можно ли опубликовать какой-либо код, который вы написали?
В основном многое зависит от того, как вы создаете свои поля и храните документы в 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));
Итак, по сути Я создал два поля:
Field.Index.ANALYZED
Field.Index.NOT_ANALYZED
Вот как вы настраиваете lucene для токенизатора и анализатора по умолчанию. В противном случае вы можете написать свой собственный токенизатор и анализаторы.
Ссылка (-ы) http://darksleep.com/lucene/
Надеюсь, это поможет вам ... :)
Проблема потери контекста для фраз может быть решена с помощью PhraseQuery.
Индекс по умолчанию содержит позиционную информацию о терминах, если вы не создали чисто логическое значение. полей путем индексации с параметром omitTermFreqAndPositions. PhraseQuery использует эту информацию для поиска документов, в которых термины находятся на определенном расстоянии друг от друга.
Например, предположим, что в поле есть фраза «Быстрая коричневая лиса перепрыгнула через ленивую собаку». Не зная точной фразы, вы все равно можете найти этот документ, выполнив поиск документов с полями, имеющими quick и fox рядом друг с другом. Конечно, простой TermQuery поможет найти этот документ, зная любое из этих слов, но в этом случае нам нужны только документы, в которых есть фразы, в которых слова либо расположены точно рядом (быстрый лис), либо имеют одно слово между ними ( быстрая [неактуальная] лиса). Максимально допустимое позиционное расстояние между терминами, которое считается совпадением, называется уклонением. Расстояние - это количество позиционных перемещений терминов, чтобы восстановить фразу по порядку.
Ознакомьтесь с JavaDoc Lucene для PhraseQuery
См. Этот пример кода, который демонстрирует, как работать с различными объектами запроса:
Вы также можете попытаться объединить различные типы запросов с помощью класса BooleanQuery.
Что касается частоты фраз, я полагаю, что оценка Lucene учитывает частоту употребления терминов в документах.