with sklearn scikit multiclass machine logistic learning learn classify python nlp machine-learning nltk bayesian

python - sklearn - Implementando el clasificador Naive-Bayes de Bag-of-Words en NLTK



sklearn classify text (3)

Básicamente tengo la misma pregunta que este tipo . El ejemplo en el libro NLTK para el clasificador Naive Bayes considera solo si una palabra ocurre en un documento como una característica ... no considera la frecuencia de las palabras como la característica para mira ("bolsa de palabras").

Una de las respuestas parece sugerir que esto no se puede hacer con los clasificadores NLTK integrados. Es ese el caso? ¿Cómo puedo hacer la clasificación NB de frecuencia / bolsa de palabras con NLTK?


Las características en el clasificador bayes NLTK son "nominales", no numéricas. Esto significa que pueden tomar un número finito de valores discretos (etiquetas), pero no pueden tratarse como frecuencias.

Entonces, con el clasificador de Bayes, no puede usar directamente la frecuencia de las palabras como una característica. Podría hacer algo así como usar las 50 palabras más frecuentes de cada texto como su conjunto de características, pero eso es bastante diferente.

Pero tal vez haya otros clasificadores en el NLTK que dependen de la frecuencia. No lo sabría, pero ¿has mirado? Yo diría que vale la pena echarle un vistazo.


scikit-learn tiene una implementación de Bayes ingenuo multinomial , que es la variante correcta de Bayes ingenuo en esta situación. Sin embargo, una máquina de vectores de soporte (SVM) probablemente funcione mejor.

Como señaló Ken en los comentarios, NLTK tiene una buena envoltura para los clasificadores scikit-learn . Modificado a partir de los documentos, este es un tanto complicado que hace la ponderación TF-IDF, elige las 1000 mejores características basadas en una estadística chi2, y luego las pasa a un clasificador Bayes ingenuo multinomial. (Apuesto a que esto es algo torpe, ya que no estoy muy familiarizado con NLTK ni con scikit-learn).

import numpy as np from nltk.probability import FreqDist from nltk.classify import SklearnClassifier from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_selection import SelectKBest, chi2 from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline pipeline = Pipeline([(''tfidf'', TfidfTransformer()), (''chi2'', SelectKBest(chi2, k=1000)), (''nb'', MultinomialNB())]) classif = SklearnClassifier(pipeline) from nltk.corpus import movie_reviews pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids(''pos'')] neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids(''neg'')] add_label = lambda lst, lab: [(x, lab) for x in lst] classif.train(add_label(pos[:100], ''pos'') + add_label(neg[:100], ''neg'')) l_pos = np.array(classif.classify_many(pos[100:])) l_neg = np.array(classif.classify_many(neg[100:])) print "Confusion matrix:/n%d/t%d/n%d/t%d" % ( (l_pos == ''pos'').sum(), (l_pos == ''neg'').sum(), (l_neg == ''pos'').sum(), (l_neg == ''neg'').sum())

Esto impreso para mí:

Confusion matrix: 524 376 202 698

No es perfecto, pero decente, considerando que no es un problema súper fácil y solo está entrenado en 100/100.


  • pon la cuerda que estás viendo en una lista, dividida en palabras
  • para cada elemento de la lista, pregunte: ¿este elemento es una característica que tengo en mi lista de características?
  • Si es así, agregue el problema de registro como siempre, de lo contrario, ignórelo.

Si su oración tiene la misma palabra varias veces, simplemente agregará los problemas varias veces. Si la palabra aparece varias veces en la misma clase, los datos de tu entrenamiento deberían reflejar eso en el conteo de palabras.

Para mayor precisión, cuente todos los bi-gramos, tri-gramos, etc. como características separadas.

Ayuda a escribir manualmente sus propios clasificadores para que comprenda exactamente lo que está sucediendo y lo que debe hacer para mejorar la precisión. Si usa una solución preempaquetada y no funciona lo suficientemente bien, no hay mucho que pueda hacer al respecto.