In Kapitel 6 von Praktisches maschinelles Lernsystem gab es ein Beispiel für eine Textklassifizierung von Naive Bayes, daher werde ich mich selbst herausfordern.
sklearn-Datensatz 20newsgroups [sklearn.naive_bayes.MultinomialNB](http: /scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html) Zum Kategorisieren verwenden.
Es wird der Fluss sein.
Bis auf die Stoppworteinstellung bleibt alles auf seiner Standardeinstellung.
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))
Die korrekte Antwortrate für die Testdaten betrug 62%. (81% für Trainingsdaten)
Ich fand heraus, dass die Verwendung von sklearn das Klassifizieren von Texten mit dem Naive Bayes-Klassifikator erleichtert. Da die korrekte Antwortrate jedoch 62% beträgt, erscheint es notwendig, verschiedene Verarbeitungen in natürlicher Sprache wie TfIdf und Stemming anzuwenden, um die Genauigkeit zu verbessern.
Ich habe zu TfidVectorizer gewechselt und versucht, mit GridSearchCV den optimalen Parameter zu finden. Der Prozentsatz der richtigen Antworten auf Testdaten stieg leicht auf 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