[PYTHON] Classification des textes du défi par Naive Bayes avec sklearn

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.

Choses à faire

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.

  1. Utilisez CountVectorizer pour convertir un document en une matrice de fréquence de mots.
  2. Utilisez MultinomialNB pour former un classificateur de baies naïves.
  3. Vérifier avec les données de test

Ce sera le flux.

la mise en oeuvre

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))

résultat

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.

Postscript (30/03/2016)

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

Classification des textes du défi par Naive Bayes avec sklearn
Filtrage de texte avec des baies naïves de sklearn
Naive Bays (classification multi-classes)
Classification de texte non supervisée avec Doc2Vec et k-means
Classification multi-étiquettes par forêt aléatoire avec scikit-learn
Classification des documents avec texte toch de PyTorch
Une époque où la classification de texte par BERT est possible avec 3 lignes de code
J'ai essayé de juger Tundele avec Naive Bays
Défiez la classification des images par TensorFlow2 + Keras 6-Essayez le prétraitement et la classification des images préparées par vous-même-
Défiez l'analyse des composants principaux des données textuelles avec Python
Challenge classification des images par TensorFlow2 + Keras 3 ~ Visualiser les données MNIST ~