2012-02-27 14 views
5

He clasificado un conjunto de documentos con Lucene (campos: contenido, categoría). Cada documento tiene su propia categoría, pero algunos de ellos están etiquetados como sin categoría. ¿Hay alguna forma de clasificar estos documentos fácilmente en Java?Cómo clasificar documentos indexados con lucene

Respuesta

3

La clasificación es un problema amplio en el campo de Machine Learning/Statistics. Después de leer tu pregunta, creo que has usado un tipo de cláusula SQL group by (aunque en Lucene). Si desea que la máquina clasifique los documentos, no necesita saber Algoritmos de aprendizaje automático como Redes neuronales, Bayesiano, SVM, etc. Existen excelentes bibliotecas disponibles en Java para estas tareas. Para que esto funcione, necesitará características (un conjunto de atributos extraídos de los datos) en los que puede entrenar su Algoritmo para que pueda predecir su etiqueta de clasificación.

Hay algunas buenas API en Java (que le permiten concentrarse en el código sin profundizar mucho en la comprensión de la teoría matemática detrás de esos algoritmos, aunque si usted sabe que sería muy ventajoso). Weka es bueno. También encontré un par de libros de Manning que han manejado bien estas tareas. Aquí van:

Capítulo 10 (Clasificación) de la inteligencia colectiva en acción: http://www.manning.com/alag/

Capítulo 5 (Clasificación) de Algoritmos de Inteligente Web: http://www.manning.com/marmanis/

Estos son absolutamente fantástico materiales (para la gente de Java) en la clasificación particularmente adecuado para personas que simplemente no quieren sumergirse en la teoría (aunque es muy esencial :)) y simplemente quieren un código de trabajo rápido.

La inteligencia colectiva en acción ha resuelto el problema de la clasificación usando JDM y Weka. Así que eche un vistazo a estos dos para sus tareas.

+0

Por supuesto que puedo extraer características de mis índices producidos por Lucene. Déjenme chequearlo en este libro y regresaré;) – orezvani

+0

Creo que el problema con muchos de estos ML es que producen categorización de etiqueta única donde sería ideal tener una categorización multi-etiqueta. Puedo estar equivocado, pero Weka tuvo una buena implementación de esto. El resto no parecía que hicieran el trabajo. –

3

Sí, puede utilizar consultas de similitud como las implementadas por el MoreLikeThisQuery class para este tipo de cosas (suponiendo que tiene algún campo de texto grande en los documentos para su índice de lucene). Eche un vistazo al javadoc del subyacente MoreLikeThis class para obtener detalles sobre cómo funciona.

Para encender el índice de Lucene en un clasificador de texto tiene dos opciones:

  1. Para cualquier nuevo texto a clasificador, de consulta para los 10 o 50 primeros documentos más similares que tienen al menos una categoría, suma las ocurrencias de la categoría entre esos "vecinos" y recogen las 3 categorías frecuentes más frecuentes entre esos documentos similares (por ejemplo).

  2. Alternativamente, puede indexar un nuevo conjunto de documentos agregados, uno para cada categoría al concatenar (todo o una muestra de) el texto de los documentos de esta categoría. A continuación, ejecute una consulta de similitud con la introducción de texto directamente en esos documentos "falsos".

La primera estrategia es conocida en el aprendizaje de la máquina como la clasificación k-vecinos más cercanos. El segundo es un truco :)

Si tiene muchas categorías (digamos más de 1000) la segunda opción podría ser mejor (más rápida de clasificar). No he realizado ninguna evaluación de rendimiento limpia sin embargo.

También puede encontrar este blog post interesting.

Si desea utilizar Solr, debe habilitar MoreLikeThisHandler y establecer termVectors=true en el campo de contenido.

El cliente Solr quemado por el sol para python puede realizar mlt consultas. Aquí es un clasificador pitón prototipo que utiliza Solr para la clasificación de acuerdo con un índice de categorías de Wikipedia:

https://github.com/ogrisel/pignlproc/blob/master/examples/topic-corpus/categorize.py

+0

Gracias por el consejo, pero hay alrededor de 10^6 documentos para clasificar, ¿es buena la primera opción? – orezvani

+0

Creo que el primero es más fácil de implementar: no necesita ningún objeto nuevo en su índice. Si no está funcionando lo suficientemente bien para su aplicación, intente lo último también. No tengo suficiente experiencia para estar seguro. Para clasificar que muchos ejemplos en lote pueden llevar algún tiempo. Dependiendo del número en el término máximo de consulta (yo uso 30), si usa tejas y el número de documentos con una categoría en el índice, el tiempo de consulta individual puede ser bastante largo, digamos 300ms. Formación de un clasificador SGD mahout y la predicción por lotes en una única extracción de características puede ser más rápida. – ogrisel

3

A partir de Lucene 5.2.1, puede utilizar indexed documents to classify new documents. Fuera de la caja, Lucene ofrece un clasificador Bayes ingenuo, un clasificador k-Nearest Neighbor (basado en la clase MoreLikeThis) y un clasificador basado en Perceptron.

El inconveniente es que todas estas clases están marcadas con advertencias experimentales y documentadas con enlaces a Wikipedia.

Cuestiones relacionadas