Il y avait un exemple de classification de texte par Naive Bayes au chapitre 6 de Practical Machine Learning System, donc je vais me mettre au défi.
ensemble de données sklearn 20newsgroups [sklearn.naive_bayes.Multinomial: / /scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html) Utilisé pour catégoriser.
Ce sera le flux.
Tout est laissé à sa valeur par défaut, à l'exception du paramètre de mot de passe.
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
import nltk
def stopwords():
symbols = ["'", '"', '`', '.', ',', '-', '!', '?', ':', ';', '(', ')', '*', '--', '\\']
stopwords = nltk.corpus.stopwords.words('english')
return stopwords + symbols
newsgroups_train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
newsgroups_test = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))
vectorizer = CountVectorizer(stop_words=stopwords())
vectorizer.fit(newsgroups_train.data)
# Train
X = vectorizer.transform(newsgroups_train.data)
y = newsgroups_train.target
print(X.shape)
clf = MultinomialNB()
clf.fit(X, y)
print(clf.score(X,y))
# Test
X_test = vectorizer.transform(newsgroups_test.data)
y_test = newsgroups_test.target
print(clf.score(X_test, y_test))
Le taux de réponse correct pour les données de test était de 62%. (81% pour les données d'entraînement)
J'ai trouvé que l'utilisation de sklearn facilite la classification des textes à l'aide du classificateur Naive Bayes. Cependant, comme le taux de réponse correcte est de 62%, il semble nécessaire d'appliquer divers traitements de langage naturel tels que TfIdf et Stemming afin d'améliorer la précision.
J'ai changé pour TfidVectorizer et j'ai essayé de trouver le paramètre optimal en utilisant GridSearchCV. Le pourcentage de réponses correctes aux données de test a légèrement augmenté pour atteindre 66%.
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.grid_search import GridSearchCV
from sklearn.pipeline import Pipeline
import nltk
def stopwords():
symbols = ["'", '"', '`', '.', ',', '-', '!', '?', ':', ';', '(', ')', '*', '--', '\\']
stopwords = nltk.corpus.stopwords.words('english')
return stopwords + symbols
newsgroups_train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
newsgroups_test = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))
# Pipeline
pipeline = Pipeline([('vectorizer', TfidfVectorizer()), ('multinomial_nb', MultinomialNB())])
params = {
'vectorizer__max_df': [1.0, 0.99],
'vectorizer__ngram_range': [(1,1), (1, 2)],
'vectorizer__stop_words' : [stopwords()],
}
clf = GridSearchCV(pipeline, params)
# Train
X = newsgroups_train.data
y = newsgroups_train.target
clf.fit(X,y)
print(clf.score(X, y))
# Test
X_test = newsgroups_test.data
y_test = newsgroups_test.target
print(clf.score(X_test, y_test))
Recommended Posts