Индексирование и поиск по уровням аннотаций на уровне слов в Lucene - PullRequest
8 голосов
/ 21 мая 2010

У меня есть набор данных с несколькими слоями аннотаций поверх основного текста, например часть-теги , фрагменты из мелкого анализатора , имя сущностей и другие из различных инструментов обработки естественного языка (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" мне нужно проверить теги на неуказанных и, следовательно, несоответствующих терминах.

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

Возможно, один из способов добиться того, о чем вы просите, - индексировать каждый класс аннотаций в одной и той же позиции (т. Е. Word, POS, Chunk, NER) и добавлять к каждой аннотации префикс уникальной строкой. Не беспокойтесь о приставках для слов. Вам понадобится собственный анализатор для сохранения префиксов, но тогда вы сможете использовать синтаксис, который вы хотите для запросов.

Если быть точным, я предлагаю индексировать следующие токены на указанных позициях:

Position Word   POS      Chunk     NER
======== ====   ===      =====     ========
1        The    POS=DT   CHUNK=NP  NER=Person     
2        man    POS=NN   CHUNK=NP  NER=Person
3        went   POS=VBD  CHUNK=VP       -
4        to     POS=TO   CHUNK=PP       - 
5        the    POS=DT   CHUNK=NP  NER=Location
6        store  POS=NN   CHUNK=NP  NER=Location

Чтобы получить семантику, используйте SpanQuery или SpanTermQuery для сохранения последовательности токена.

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

NER = Человек прибыл в NER = Местоположение

Обратите внимание на отличие от вашего примера: я удалил префикс Word =, чтобы использовать его по умолчанию. Кроме того, выбранный вами синтаксис префикса (например, «class =») может ограничивать содержимое индексируемого документа. Убедитесь, что документы либо не содержат фраз, либо что вы избегаете их каким-либо образом при предварительной обработке. Это, конечно, связано с анализатором, который вам нужно использовать.

Обновление: Я использовал эту технику для индексации границ предложений и абзацев в тексте (используя токены break=sen и break=para), чтобы я мог решить, где прерывать совпадения запросов фраз. Кажется, работает просто отлично.

1 голос
/ 21 мая 2010

То, что вы ищете, это полезная нагрузка . У Lucid Imagination есть подробная запись в блоге на эту тему. Полезные нагрузки позволяют хранить байтовый массив метаданных об отдельных терминах. После того как вы проиндексировали свои данные, включая полезные нагрузки, вы можете создать новый механизм сходства, который учитывает ваши полезные нагрузки при оценке.

0 голосов
/ 22 мая 2010

Вы действительно можете выполнить поиск шаблонов текста в Lucene, используя SpanQuery и отрегулировать наклонное расстояние, чтобы ограничить количество терминов друг относительно друга, которые могут встречаться в терминах запроса, и даже порядок их появления.

...