2010-05-21 5 views
8

У меня есть набор данных с несколькими слоями аннотации над основным текстом, например, part-of-tags, chunks from a shallow parser, name entities и других различных natural language processing (NLP) инструментов. Для предложения, как The man went to the store, аннотация может выглядеть следующим образом:индексирования и поиск по уровню слов аннотаций Слоев в Lucene

 

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

запрос: Word=Washington,NER=Person

Я хотел бы также сделать более сложные запросы, связанные с последовательным порядком аннотаций на разных слоях, например найти все документы, в которых есть слово с пометкой человек, а затем слова arrived at, за которым следует слово с пометкой Местонахождение. Такой запрос может выглядеть следующим образом:

Query: "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", мне нужно проверить теги на неопределенные и, следовательно, несовпадающие термины.

+0

Вы нашли подходящее решение? – enguerran

ответ

1

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

+0

Я думал, что полезная нагрузка может быть использована только для корректировки ранжирования документов. Могут ли они также использоваться, чтобы фактически выбрать, какие документы будут возвращены? – dmcer

+0

Несомненно, полезная нагрузка работает с подсчетом, но забил способ получения документов. Документы можно исключить на основе терминов - подумайте о НЕ-запросах. Возможно, вам придется написать свой собственный QueryParser для второго элемента. –

0

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

1

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

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

НЭК прибыл = Person при НЭК = Местоположение

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

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