У меня есть набор данных с несколькими слоями аннотаций поверх основного текста, например часть-теги , фрагменты из мелкого анализатора , имя сущностей и другие из различных инструментов обработки естественного языка (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
Я также хотел бы выполнять более сложные запросы, включающие последовательный порядок аннотаций на разных уровнях, например. найдите все документы, в которых есть слово с меткой person , за которыми следуют слова arrived at
, за которыми следует слово с меткой location . Такой запрос может выглядеть так:
Запрос : "NER=Person Word=arrived Word=at NER=Location"
Какой хороший способ приблизиться к этому с Lucene? Есть ли способ индексировать и выполнять поиск по полям документа, которые содержат структурированные токены?
Payloads
Одним из предложений было попытаться использовать Lucene payloads . Но я думал, что полезные данные можно использовать только для корректировки ранжирования документов, и что они не используются для выбора того, какие документы возвращаются.
Последнее важно, поскольку для некоторых случаев использования количество документов , содержащих шаблон, действительно то, что я хочу.
Кроме того, проверяются только полезные данные на терминах, соответствующих запросу. Это означает, что полезных нагрузок может помочь только в ранжировании первого примера запроса , Word=Washington,NER=Person
, при этом мы просто хотим убедиться, что термин Washingonton
помечен как Person
. Однако для второго примера запроса "NER=Person Word=arrived Word=at NER=Location"
мне нужно проверить теги на неуказанных и, следовательно, несоответствующих терминах.