2011-02-15 15 views
5

estoy usando Lucene para obtener la frecuencia de términos en los documentos, es decir, el número de apariciones de un término en cada documento. Yo uso IndexReader.termDocs() para este propósito, y funciona bien para términos de una sola palabra, pero dado que todas las palabras se almacenan en índice por separado, no funciona para términos de varias palabras.¿Cómo obtener la frecuencia de términos de varias palabras en Lucene?

Ejemplo (tomado de this pregunta): Estoy interesado en la frecuencia de término "basket-ball" (o incluso "baloncesto"), pero después de tokenizar habrá dos palabras, y yo estaré capaz de obtener la frecuencia del término "canasta" y el término "pelota", pero no del término "canasta".

sé todos los términos de varias palabras que quiero llegar frecuencia para, además no estoy interesado en el almacenamiento de texto original - sólo en conseguir estadísticas. Por lo tanto, mi primera enfoque era sólo palabras concatenar en un término. P.ej. "Jugué baloncesto ayer" se convierte en "Jugué baloncesto ayer" y "Mi escritor favorito es Kurt Vonnegut" se convierte en "Mi escritor favorito es Kurt Vonnegut". Éste funciona: los términos concatenados se tratan como cualquier otra palabra, por lo que puedo obtener fácilmente la frecuencia. Pero este método es feo y, lo que es más importante, muy lento. Así que vine a otro.

Mi segundo enfoque es escribir filtro ficha especial, que capturará fichas y comprobar si son parte de los términos para ser reemplazado (algo así como SynonymFilter de Lucene in Action). En nuestro caso, cuando el filtro verá palabra "canasta" se leerá una ficha más, y si se trata de "bola", el filtro se coloque un término ("baloncesto") en lugar de dos ("cesta" y "bola") en una secuencia de token de salida. La ventaja de este método en comparación con el anterior es que busca coincidencias entre palabras completas y no analiza el texto completo de las subcadenas. De hecho, la mayoría de los tokens tendrán diferentes longitudes y, por lo tanto, serán descartados sin siquiera verificar la correspondencia de ninguna letra en ellos. Pero ese filtro no es fácil de escribir, además, no estoy seguro de que sea lo suficientemente rápido como para satisfacer mis necesidades.

tercer enfoque de lo que puedo pensar es que jugar con posiciones de dos palabras en mismos documentos. Pero lo más probable es que itere a través de TermDocs durante la obtención del tiempo de frecuencia, que cuesta mucho más que el tiempo de indexación.

Así que, finalmente, mi pregunta es: ¿hay alguna forma de indexar de manera eficiente y obtener la frecuencia de términos de varias palabras en Lucene?

Respuesta

6

Mirar hacia arriba shingling .. Esta índices de grupos de términos. Está en el libro de Solr 1.4. y here

lo tanto, si usted tiene la cadena: "Baloncesto comenzó en la década de 1900

Se podría recuperar todos los términos individuales en un índice, pero luego también."

"baloncesto" " la pelota comenzó " " comenzó en " principios de 1900", etc ...

ya través de la configuración, también

"pelota de baloncesto comenzó" "pelota comenzó en" "de la década de 1900" etc ...

+0

que he encontrado de Lucene [ShingleFilter] (http://lucene.apache.org/java/3_0_3/api/contrib-analyzers/org/apache/lucene/analysis/shingle/ShingleFilter.html) y [ShingleAnalyzerWrapper] (http://lucene.apache.org/java/3_0_3/ api/contrib-analyzers/org/apache/lucene/analysis/shingle/ShingleAnalyzerWrapper.html), que son exactamente lo que necesito, ¡gracias! – ffriend

Cuestiones relacionadas