Я имею набор данных с несколькими слоями аннотации по базовому тексту, такими как часть тегов, блоки от поверхностного синтаксического анализатора, называю объекты и других от различных инструментов обработки естественного языка (NLP). Для предложения как The man went to the store
, аннотации могли бы быть похожими:
Word POS Chunk NER ==== === ===== ======== The DT NP Person man NN NP Person went VBD VP - to TO PP - the DT NP Location store NN NP Location
Я хотел бы индексировать набор документов с аннотациями как эти использование Lucene и затем выполнить поиски через различные слои. Пример простого запроса состоял бы в том, чтобы получить все документы, где Вашингтон отмечен как человек. В то время как я не абсолютно посвящаю себя нотации, синтаксически конечные пользователи могли бы ввести запрос следующим образом:
Запрос: Word=Washington,NER=Person
Я также хотел бы сделать более сложные запросы, включающие последовательный порядок аннотаций через различные слои, например, найти все документы, где существует отмеченная личность слова, сопровождаемая словами arrived at
сопровождаемый словом отметил местоположение. Такой запрос мог бы быть похожим:
Запрос: "NER=Person Word=arrived Word=at NER=Location"
Что хороший путь состоит в том, чтобы пойти о приближении к этому с Lucene? Там должен так или иначе индексировать и искать по полям документа, которые содержат структурированные маркеры?
Полезные нагрузки
Одно предложение состояло в том, чтобы попытаться использовать полезные нагрузки Lucene. Но, я думал, что полезные нагрузки могли только использоваться для корректировки рейтингов документов, и что они не используются для выбора, какие документы возвращаются.
Последний важен с тех пор, для некоторых примеров использования количество документов, которые содержат шаблон, действительно, что я хочу.
Кроме того, только полезные нагрузки на условиях, которые соответствуют запросу, исследованы. Это означает, что полезные нагрузки могли только даже помочь с рейтингами первого запроса в качестве примера, Word=Washington,NER=Person
, посредством чего мы просто хотим удостовериться термин Washingonton
отмечен как a Person
. Однако для второго запроса в качестве примера, "NER=Person Word=arrived Word=at NER=Location"
, Я должен проверить неуказанные теги, и таким образом несоответствие, условия.
Вам нужны полезные данные . В Lucid Imagination есть подробная запись в блоге на эту тему. Полезные данные позволяют хранить байтовый массив метаданных об отдельных терминах. После того, как вы проиндексировали свои данные, включая полезные нагрузки, вы можете создать новый механизм подобия, который учитывает ваши полезные нагрузки при скоринге.
Вы действительно можете искать шаблоны текста в Lucene, используя SpanQuery и настраивать расстояние наклона, чтобы ограничить количество терминов друг друга, в которых могут встречаться термины запроса, и даже порядок, в котором они появляются.