2010-06-29 23 views
5

Me gustaría obtener algunas frases frecuentes con Lucene. Estoy obteniendo información de los archivos TXT, y estoy perdiendo un montón de contexto por no tener información para frases, p. Ej. La "recuperación de información" está indexada como dos palabras separadas.Cómo obtener frases frecuentes con Lucene

¿Cuál es la manera de obtener frases como esta? No puedo encontrar nada útil en internet, ¡todos los consejos, enlaces, sugerencias, especialmente ejemplos son apreciados!

EDIT: almaceno mis documentos simplemente por título y contenido:

Document doc = new Document(); 
doc.add(new Field("name", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("text", fReader, Field.TermVector.WITH_POSITIONS_OFFSETS)); 

porque por lo que yo estoy haciendo lo más importante es el contenido del archivo. Con demasiada frecuencia, los títulos no son descriptivos en absoluto (p. Ej., Tengo muchos documentos académicos PDF cuyos títulos son códigos o números).

Necesito desesperadamente indexar las frases más frecuentes del contenido del texto, ahora mismo veo cuánto no es eficiente este simple enfoque de "bolsa de palabras".

Respuesta

7

Julia, Parece que lo que busca es n-grams, específicamente Bigrams (también llamados colocaciones).

Aquí hay chapter about finding collocations (PDF) de Manning y Schutze's Foundations of Statistical Natural Language Processing.

Para hacer esto con Lucene, sugiero usar Solr con ShingleFilterFactory. Consulte this discussion para más detalles.

+0

Sí, exactamente, lo que necesito es ngrams .... Tenía la esperanza de no tener que entrar demasiado en NLP:/... pero puedo preguntarte por favor antes de irme. en este capítulo del libro, si utilizo las herramientas que me recomendó (y si lo hago de todos modos), los ngrams se encuentran durante el tiempo de búsqueda, ¿no durante el tiempo de indexación? ¿Puedo obtener como resultado final un índice con índices indexados? y ngrams frecuentes? Porque estoy haciendo una coincidencia de conceptos con la ontología, y sería la mejor solución para tenerlo de esa manera (si es posible, por supuesto) Thanx! – Julia

+0

+1 para reconocer correctamente el problema m ... :) – Favonius

+0

@Julia: Creo que puede aplicar ShingleFilterFactory durante la indexación. Y tal vez puedas usar Luke (http://wiki.apache.org/solr/LukeRequestHandler) para ver los resultados. Espero que ahora tengas lo suficiente como para ponerte en marcha. –

0

¿Es posible que publique algún código que haya escrito?

Básicamente, mucho depende de la forma en que cree sus campos y almacene documentos en lucene.

Consideremos un caso en el que tengo dos campos: ID y comentarios; y en mi campo ID, permito valores como este 'finding nemo', es decir, cadenas con espacio. Mientras que 'Comentarios' es un campo de texto de flujo libre, es decir, permití todo lo que mi teclado permite y lo que Lucene puede entender.

Ahora en el escenario de la vida real no tiene sentido hacer que mi ID: 'encontrar nemo' como dos cadenas de búsqueda diferentes. Mientras que quiero indexar todo en Comentarios.

Entonces, ¿qué voy a hacer es, voy a crear un documento (org.apache.lucene.document.Document) objeto de hacerse cargo de esto ... Algo como esto

Document doc = new Document(); 
doc.add(new Field("comments","Finding nemo was a very tough job for a clown fish ...", Field.Store.YES, Field.Index.ANALYZED)); 
doc.add(new Field("id", "finding nemo", Field.Store.YES, Field.Index.NOT_ANALYZED)); 

Así que, esencialmente, he creado dos campos:

  1. comentarios: ¿Dónde he preferido analizan mediante el uso de Field.Index.ANALYZED
  2. Identificación: Cuando yo dirigía Lucene para almacenarla pero no analizarlo Field.Index.NOT_ANALYZED

Esta es la forma de personalizar Lucene por incumplimiento Tokenizer y el analizador. De lo contrario, puede escribir su propio Tokenizer y analizadores.

Enlace (s) http://darksleep.com/lucene/

Hope esto le ayudará a ... :)

+0

Gracias por su respuesta Favonius! He editado mi publicación, para que pueda ver cómo indexo documentos. Si entiendo lo que está diciendo, usar solo la información del título, ¿no será apropiado para mi caso ...? :( – Julia

+0

@Julia: En realidad mi respuesta es parcialmente correcta. He entendido mal los problemas de n-gramas como un problema simple de indexación: o. Aunque considerar solo el 'id' ('título' en su caso) podría no ser apropiado. .que creo que ya has reconocido ... – Favonius

0

Bueno, el problema de perder el contexto de las frases se puede resolver con PhraseQuery.

Un índice de forma predeterminada contiene información posicional de los términos, siempre que no haya creado campos booleanos puros indizando con la opción omitTermFreqAndPositions. PhraseQuery usa esta información para localizar documentos donde los términos están dentro de una cierta distancia el uno del otro.

Por ejemplo, supongamos que un campo contiene la frase "el zorro café rápido saltó sobre el perro perezoso". Sin conocer la frase exacta, aún puede encontrar este documento buscando documentos con campos que tengan rápido y zorro cerca uno del otro. Claro, un TermQuery simple haría el truco para localizar este documento conociendo cualquiera de esas palabras, pero en este caso solo queremos documentos que tengan frases donde las palabras estén exactamente una al lado de la otra (zorro rápido) o tengan una palabra intermedia (zorro rápido [irrelevante]). La distancia posicional máxima permisible entre los términos que se consideran una coincidencia se denomina slop. La distancia es el número de movimientos posicionales de términos para reconstruir la frase en orden.

Salida Lucene's JavaDoc for PhraseQuery

See this example code which demonstrates how to work with various Query Objects:

También puede tratar de combinar diferentes tipos de consulta con la ayuda de la clase BooleanQuery.

Y con respecto a la frecuencia de las frases, supongo que la puntuación de Lucene considera la frecuencia de los términos que ocurren en los documentos.

Cuestiones relacionadas