2011-02-05 26 views
17

Estoy trabajando en un proyecto para clasificar fragmentos de texto utilizando el módulo nltk de python y el clasificador naivebayes. Puedo entrenar en datos de corpus y clasificar otro conjunto de datos, pero me gustaría proporcionar información de entrenamiento adicional en el clasificador después del entrenamiento inicial.Cómo entrenar incrementalmente un clasificador nltk

Si no me equivoco, no parece haber una manera de hacerlo, ya que el método NaiveBayesClassifier.train toma un conjunto completo de datos de entrenamiento. ¿Hay alguna manera de agregar los datos de entrenamiento sin alimentar el conjunto de características original?

Estoy abierto a sugerencias que incluyen otros clasificadores que pueden aceptar nuevos datos de entrenamiento a lo largo del tiempo.

+1

¿Finalmente encontró una solución para este problema? – w2lame

+0

Hackeé un poco el interior del clasificador para proporcionar nuevos datos de entrenamiento sin volver a entrenar. Fue hace mucho tiempo, así que no puedo recordar exactamente, pero creo que fue posible. No llegué lejos con el proyecto después de eso, por lo que no está en servicio activo. – Rog

+0

Ok, gracias por responder @rog :) – w2lame

Respuesta

9

Hay 2 opciones, que yo sepa:

1) Periódicamente volver a entrenar al clasificador en los nuevos datos. Debería acumular nuevos datos de entrenamiento en un corpus (que ya contiene los datos de entrenamiento originales), luego, cada pocas horas, volver a entrenar & volver a cargar el clasificador. Esta es probablemente la solución más simple.

2) Externalice el modelo interno y luego actualícelo manualmente. El NaiveBayesClassifier se puede crear directamente dándole un label_prodist y un feature_probdist. Puede crearlos por separado, pasarlos a un NaiveBayesClassifier, luego actualizarlos cada vez que ingresen datos nuevos. El clasificador usaría estos datos nuevos inmediatamente. Tendría que mirar el método train para obtener detalles sobre cómo actualizar las distribuciones de probabilidad.

+0

Gracias Jacob! Espero evitar la opción 1 ya que sospecho que podría haber problemas de rendimiento (tendré muchos clasificadores por separado). Analizaré la opción 2, también podría ayudar con el clasificador persistente (o al menos es un conocimiento), y decapado todo produce un archivo bastante grande (de nuevo, considerando la escalabilidad). – Rog

+3

Si está dispuesto a sacrificar un poco de velocidad en aras de la escalabilidad horizontal, puede persistir en los modelos en Redis creando una subclase ProbDistI que use una función Redis Hash para almacenamiento/búsqueda. Entonces no tiene que hacer ningún decapado, y el clasificador está "siempre encendido". – Jacob

+0

Gracias por la sugerencia. Estoy mirando algunas opciones de base de datos memcached + también. – Rog

0

Estoy aprendiendo NLTK, por favor corrígeme si me equivoco. Esto está usando la rama Python 3 de NLTK, que podría ser incompatible.

Existe un método update() a la NaiveBayesClassifier ejemplo, que parece añadir a los datos de entrenamiento:

from textblob.classifiers import NaiveBayesClassifier 

train = [ 
    ('training test totally tubular', 't'), 
] 

cl = NaiveBayesClassifier(train) 
cl.update([('super speeding special sport', 's')]) 

print('t', cl.classify('tubular test')) 
print('s', cl.classify('super special')) 

Esto muestra:

t t 
s s 
+2

note que textblob realmente no "actualiza" el modelo ajustando las probabilidades sino que reentrena un nuevo modelo. – alvas

Cuestiones relacionadas