Naive Bayes und seine Anwendungen in der Textklassifizierung verstehen (Teil I)

author
4 minutes, 20 seconds Read

Textklassifizierung mit Naive Bayes

Um zu verstehen, wie die Textklassifizierung mit dem Naive Bayes-Algorithmus durchgeführt wird, müssen wir zuerst den zu verwendenden Datensatz definieren und importieren.

Der Datensatz, den wir verwenden werden, ist der Datensatz 20 Newsgroups (Download-Link). Der Datensatz umfasst rund 18.000 Newsgroup-Beiträge zu 20 Themen, die in zwei Teilmengen unterteilt sind: eine für Training (oder Entwicklung) und die andere für Tests (oder Leistungsbewertung).

Die Aufteilung zwischen Zug und Testset basiert auf Nachrichten, die vor und nach einem bestimmten Datum gesendet wurden. Alternativ kann man die Dateien in Scikit-learn mit herunterladen und extrahieren:

from sklearn.datasets import fetch_20newsgroups

In diesem Tutorial konzentrieren wir uns auf fünf Kategorien in unserer Zielvariablen, nämlich alt.atheism, soc.religion.christian, talks.politics.misc, comp.graphics, und sci.med, die wir in den Zug- und Testsätzen wie unten gezeigt angeben:

categories = news_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True)
news_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True)

Um auf die Zielnamen unserer Trainingsdaten zuzugreifen, können wir sie in einer Zelle eines Jupyter-Notizbuchs mit print(news_train) ausdrucken. Ebenso können wir den Inhalt der Trainingsdaten von print(news_train) anzeigen — was im Wesentlichen ein Wörterbuch von Texten ist.

Datenvorbereitung & Modellierung

Jetzt müssen wir einige wichtige Konzepte im Textklassifizierungsprozess behandeln. Wir werden eine spezielle Klasse von sklearn.feature_extraction.text namens CountVectorizer verwenden. Die Idee ist also, dass wir, da wir eine Textzeichenfolge haben, jedem Wort im Text eindeutige Zahlen zuweisen können.

Nachdem wir die eindeutigen Nummern zugewiesen haben, zählen wir das Auftreten dieser Nummern. Dieses Konzept, jedem Wort in einem Text eindeutige Zahlen zuzuweisen, wird als Tokenisierung bezeichnet. Schauen wir uns ein Beispiel an:

Example Text: The boy in green shirt is sitting on the chair.Assigning unique number to each word gives:
{'the': 9, 'boy': 0, 'in': 4, 'green': 3, 'shirt': 7, 'is': 5, 'sitting': 8, 'on': 6, 'chair': 2}

Die Funktionen im Vokabelwörterbuch sind also wie unten gezeigt:


Wir können dies in Scikit-learn mit dem folgenden Code-Snippet implementieren:

from sklearn.feature_extraction.text import CountVectorizer
text =
vector = CountVectorizer()
vector.fit(text)#learn a vocabulary dictionary of all tokens in the raw documents
print("Print Vocabulary: "+str(vector.vocabulary_)+'\n\n')vector.get_feature_names()
print("Feature names:"+str(vector.get_feature_names())+'\n\n')counts = vector.transform(text)
print("The shape of count is: "+str(counts.shape)+'\n\n')
#Only 1 sample space and it has 8 features
print("Printing count: "+'\n'+str(counts.toarray()))

Beachten Sie jedoch, dass wir zur Verwendung von CountVectorizer zuerst die Klasse importieren, eine Instanz der Klasse erstellen, die wir vector aufrufen, und die fit -Methode aufrufen müssen, um das Vokabular im Rohdokument zu lernen. Die transform -Methode zählt die Vorkommen jedes Wortes: grundsätzlich sagen wir in ML-Begriffen „Dokumente codieren“. Die Ergebnisse des Snippets sind das Vokabularwörterbuch, die Feature-Namen und die Form sowie die Anzahl der Features.

Das sieht vielversprechend aus. Eine Sache, die Sie möglicherweise herausgefunden haben, ist jedoch, dass Wörter wie „das“ in fast allen Textdokumenten häufig vorkommen. Daher bedeutet die Anzahl des Wortes „das“ nicht unbedingt, dass es für die Klassifizierung wichtig ist.

Es gibt Möglichkeiten, damit umzugehen:

  1. Entfernen von sogenannten Stoppwörtern (häufig vorkommende Wörter in englischer Sprache wie Artikel, Präpositionen usw.) und / oder
  2. Einführung eines Konzepts namens Term-Frequency Inverse Document Frequency (TF-IDF). Zusammenfassend zählt TF-IDF zunächst die Häufigkeit, mit der ein bestimmtes Wort in einem Dokument vorkommt, und gewichtet es dann, was seine Bedeutung für die Klassifizierung beschreibt. Mal sehen, wie das in Python gemacht wird:
from sklearn.feature_extraction.text import TfidfTransformer
vectorizer = TfidfTransformer()
vectorizer.fit(counts)
print('Learning Frequency of all features:'+str(vectorizer.idf_)+'\n\n')
freq = vectorizer.transform(counts)
print('Transforming the matrix based on the learnt frequencies or weight: \n\n'+str(freq.toarray()))

Wiederum importieren wir die TfidfTransformer , erstellen eine Instanz der Klasse und rufen die fit -Methode auf – übergeben als Argument das Array der von CountVectorizer im vorherigen Block zurückgegebenen Zählungen – und schließlich verwenden wir die transform -Methode, um diesen Features relevante Gewichtungen zuzuweisen, wie unten gedruckt:

Jetzt, da wir ein festes Verständnis von CountVectorizer und TF-IDF haben, können wir die gleichen Schritte für unseren 20 News Group-Datensatz wiederholen.

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_tf = count_vect.fit_transform(news_train.data)from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_tf)

Nachdem die entsprechende Transformation und Zuweisung von Gewichten durchgeführt wurde, ist es nun an der Zeit, das Naive Bayes-Modell tatsächlich zu erstellen :).

Dazu importieren wir MultiNomialNB von sklearn.naive_bayes, um das Modell an den Trainingssatz anzupassen:

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB().fit(X_train_tfidf, news_train.target)

Wir können unsere eigenen Sätze erstellen, um die Vorhersagen des Klassifikators zu testen:

docs_new = 
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)

Wie wir sehen können, funktioniert es sehr gut und klassifiziert die Dokumente in docs_new in ihre jeweiligen Ziele.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.