2010-05-21 8 views
8

que tienen un conjunto de datos con múltiples capas de anotaciones sobre el texto subyacente, como part-of-tags, chunks from a shallow parser, name entities, y otros de diversas herramientas natural language processing (PNL). Para una oración como The man went to the store, las anotaciones pueden ser:indexación y búsqueda capas de anotaciones sobre palabra de nivel en 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 

me gustaría índice de un montón de documentos con anotaciones como estas utilizando Lucene y luego realizar búsquedas a través de las diferentes capas. Un ejemplo de consulta simple sería recuperar todos los documentos donde Washington está etiquetado como persona. Aunque no estoy absolutamente comprometido con la notación, sintácticamente los usuarios finales podrían entrar en la consulta de la siguiente manera:

consulta: Word=Washington,NER=Person

También me gustaría hacer consultas más complejas que implican el orden secuencial de las anotaciones en diferentes capas, por ejemplo encuentre todos los documentos donde hay una palabra etiquetada persona seguida de las palabras arrived at seguido de una palabra etiquetada ubicación. dicha consulta podría ser:

consulta: "NER=Person Word=arrived Word=at NER=Location"

Qué es una buena manera de ir sobre esto con Lucene se acerca? ¿Hay alguna forma de indexar y buscar en los campos de documentos que contienen tokens estructurados?

cargas útiles

Una de ellas fue a tratar de utilizar Lucene payloads. Pero, pensé que las cargas útiles solo se podían usar para ajustar los rankings de los documentos, y que no se usan para seleccionar qué documentos se devuelven.

Esto último es importante ya que, para algunos casos de uso, el número de documentos que contienen un patrón es realmente lo que quiero.

Además, solo se examinan las cargas útiles en los términos que coinciden con la consulta. Esto significa que las cargas útiles sólo podrían incluso ayudar con la clasificación de la primera consulta de ejemplo, Word=Washington,NER=Person, con lo que sólo quieren asegurarse de que el término Washingonton está etiquetado como Person. Sin embargo, para la segunda consulta de ejemplo, "NER=Person Word=arrived Word=at NER=Location", necesito verificar las etiquetas en términos no especificados y, por lo tanto, no coincidentes.

+0

¿Encontró una solución satisfactoria? – enguerran

Respuesta

1

Lo que usted está buscando es payloads. Lucid Imagination tiene un detailed blog entry sobre el tema. Las cargas útiles le permiten almacenar una matriz de bytes de metadatos sobre términos individuales. Una vez que hayas indexado tus datos con las cargas útiles incluidas, puedes crear un nuevo mecanismo de similitud que tenga en cuenta tus cargas útiles al anotar.

+0

Pensé que las cargas útiles solo se podían usar para ajustar la clasificación de los documentos. ¿Se pueden usar también para seleccionar qué documentos se devuelven? – dmcer

+0

Claro, las cargas útiles funcionan con la puntuación, pero la puntuación es la forma en que se recuperan los documentos. Los documentos se pueden excluir en función de los términos; piense en NO consultas. Puede que tenga que escribir su propio QueryParser para hacer el segundo elemento. –

0

Puede buscar patrones de texto en Lucene usando SpanQuery y ajustar la distancia de la pendiente para limitar cuántos términos de la otra pueden aparecer los términos de la consulta, e incluso el orden en el que aparecen.

1

Quizás una forma de lograr lo que está pidiendo es indexar cada clase de anotación en la misma posición (es decir, Word, POS, Chunk, NER) y prefija cada una de las anotaciones con una cadena única. No te molestes con los prefijos de las palabras. Necesitará un analizador personalizado para conservar los prefijos, pero luego podrá usar la sintaxis que desee para las consultas.

Para ser más específicos, lo que estoy proponiendo es que se indexa las siguientes fichas en las posiciones especificadas:

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 

Para obtener la semántica, utilice SpanQuery o SpanTermQuery para preservar secuencia de tokens.

No he probado esto, pero la indexación de las diferentes clases de términos en la misma posición debe permitir consultas sensibles a la posición a hacer lo correcto para evaluar expresiones tales como

NER = persona llegó al NER = Ubicación

Tenga en cuenta la diferencia con su ejemplo: eliminé el prefijo Word = para tratar eso como el valor predeterminado. Además, su elección de sintaxis de prefijo (por ejemplo, "clase =") puede restringir el contenido del documento que está indexando. Asegúrese de que los documentos no contengan las frases o que los escape de algún modo en el procesamiento previo. Esto, por supuesto, está relacionado con el analizador que necesitarás usar.

Actualización: que utilizaron esta técnica para la indexación límites de la frase y párrafo en el texto (usando break=sen y break=para fichas) para que pudiera decidir dónde romper la frase consulta coincide. Parece que funciona bien.

Cuestiones relacionadas