NLP-Serie – Implementierung eines einfachen Textklassifizierers in Python

Autor: Zen und die Kunst der Computerprogrammierung

1. Einleitung

Im Bereich der Verarbeitung natürlicher Sprache (Natural Language Processing, NLP) ist die Textklassifizierung eine Textanalysemethode, mit der Texte nach Themen gruppiert, kategorisiert oder klassifiziert werden können. Sein Zweck besteht darin, die potenzielle Bedeutung des Textes zu ermitteln, um Organisatoren dabei zu helfen, die Informationen besser zu verstehen und effektive Informationen daraus zu extrahieren. Im Allgemeinen ist die Textklassifizierung Teil des überwachten Lernens (Supervised Learning), dh der Trainingsdatensatz ist bekannt und die Beschriftung neuer Daten muss vorhergesagt werden. Generell gibt es folgende Arten der Textklassifizierung:

  • Topic Modeling ist ein Clustering-Algorithmus.
  • Bag of Words Modeling ist ein Vektorraummodell.
  • Stimmungsanalyse.
  • Emotionserkennung.
  • Zusammenfassungsklassifizierung.

In diesem Artikel wird erläutert, wie Sie mithilfe der Python-Sprache einen einfachen Textklassifikator basierend auf der Scikit-Learn-Bibliothek implementieren.

2. Erläuterung grundlegender Konzepte und Begriffe

2.1 Datensatz

Der Input einer NLP-Aufgabe ist in der Regel eine Textsequenz (Dokument), also ein Textabsatz, ein Artikel, ein Kommentar etc. Normalerweise unterscheiden sich Trainingstext und Testtext. Der Trainingstext wird zum Trainieren des Klassifikators verwendet, während der Testtext zur Bewertung der Leistung des Klassifikators verwendet wird. Um die Wirkung des Klassifikators zu überprüfen, muss der Testtext daher unsichtbar sein. Darüber hinaus darf die Anzahl der Testtexte nicht zu gering sein, da dies die Generalisierungsfähigkeit des Klassifikators beeinträchtigt. Daher besteht der gebräuchlichste Ansatz darin, einen bestimmten Anteil der Stichproben aus dem Trainingssatz zufällig als Testsatz auszuwählen.

2.2 Feature-Engineering

Der Schlüssel zu Textklassifizierungsaufgaben besteht darin, ausreichend gute Funktionen zu erhalten. Unter Feature Engineering versteht man die Auswahl geeigneter Textmerkmale und deren Umwandlung in eine Form, die von maschinellen Lernalgorithmen verwendet werden kann, also Vorgänge wie Digitalisierung (Numericalize), Standardisierung (Standardlize) oder Kodierung (Encode). Daher umfassen Textklassifizierungsaufgaben häufig auch Vorgänge wie Merkmalsauswahl, Dimensionsreduzierung und Merkmalsüberschneidung.

2.3 Modellauswahl und Hyperparameteranpassung

In praktischen Anwendungen umfassen Modelle für Textklassifizierungsaufgaben häufig neuronale Netze, Entscheidungsbäume, Support-Vektor-Maschinen, Bayes'sche Methoden usw. Jedes dieser Modelle hat Vor- und Nachteile und unterschiedliche Modelle eignen sich für unterschiedliche Datensätze. Gleichzeitig verfügt jedes Modell über einige Hyperparameter, die angepasst werden müssen, z. B. die Anzahl der verborgenen Schichten, die Tiefe, die Lernrate, den Regularisierungskoeffizienten, die Parameteranpassungsstrategie usw. des neuronalen Netzwerks. Wählen Sie ein gutes Modell und optimieren Sie die Hyperparameter, um den besten Klassifizierungseffekt zu erzielen.

2.4 Bewertungsindikatoren

Es gibt viele Bewertungsindikatoren für Textklassifizierungsaufgaben, wie z. B. Genauigkeit, Präzision, Rückruf, F-Wert, AUC-ROC-Kurve usw. Der Unterschied zwischen Genauigkeit und Präzision besteht hauptsächlich in zwei Aspekten:

  • Die Genauigkeit ist der Durchschnitt aller Proben und gibt den Anteil der Proben an, die vom Klassifikator korrekt klassifiziert wurden.
  • Präzision ist der Durchschnittswert für jede Kategorie und gibt den Anteil der vom Klassifikator korrekt vorhergesagten Stichproben in jeder Kategorie an.

Es gibt einen Zusammenhang zwischen Genauigkeit und Präzision, aber sie sind nicht genau dasselbe. Wenn wir beispielsweise die Aufgabe zur Erkennung handschriftlicher Ziffern als binäre Klassifizierungsaufgabe betrachten, besteht die Genauigkeitsrate darin, alle Bilder zu erkennen, und die Präzisionsrate besteht darin, alle Ziffern zu erkennen. Bei Klassifizierungsaufgaben mit mehreren Etiketten sind jedoch sowohl Genauigkeit als auch Präzision schwer zu messen. Eine häufig verwendete Metrik zur Bewertung von Klassifizierungsaufgaben mit mehreren Etiketten ist der F1-Wert, der sowohl Präzision als auch Rückruf berücksichtigt.

Wenn wir schließlich die Leistung eines Klassifikators messen möchten, sollten wir die oben genannten mehreren Bewertungsindikatoren sowie andere Leistungsindikatoren wie Effizienz und Ressourcenverbrauch berücksichtigen.

3. Erläuterung der Grundprinzipien des Algorithmus, spezifischer Arbeitsschritte und mathematischer Formeln

3.1 TF-IDF-Algorithmus

Der TF-IDF-Algorithmus (Term Frequency – Inverse Document Frequency, Term Frequency – Inverse Document Frequency) ist eine wichtige Methode zur Berechnung der Merkmalsgewichtung und wird häufig in der Textklassifizierung, Suchsortierung, Informationsabfrage, Text Mining, Werbeempfehlungssystemen und anderen Bereichen verwendet . Seine Grundidee ist:

  • Begriffshäufigkeit: Je öfter ein Wort vorkommt, desto größer ist sein Gewicht im Text. Mit anderen Worten: Je höher die Worthäufigkeit, desto wahrscheinlicher ist es, dass das aktuelle Wort als repräsentativ angesehen wird.
  • Inverse Dokumenthäufigkeit: Je geringer die Wahrscheinlichkeit ist, dass das aktuelle Wort in allen Dokumenten vorkommt, desto größer ist das Gewicht des Wortes im Text. Mit anderen Worten: Wenn ein Wort in der gesamten Dokumentbibliothek sehr häufig und selten vorkommt, weist dieses Wort eine geringe Repräsentativität auf.

Die spezifische Berechnungsformel lautet wie folgt:

tfidf = tf * idf

tf = n / d(w) # wobei n die Häufigkeit ist, mit der das aktuelle Wort w im aktuellen Dokument d vorkommt, d die Anzahl der Dokumente ist idf = log(N / df(w)) + 1 # wobei N ist die Gesamtzahl der Dokumente, df (w) ist die Anzahl der Dokumente, die das Wort enthalten

3.2 KNN-Algorithmus

K-Nearest Neighbors (KNN) ist ein einfacher und effektiver Klassifizierungsalgorithmus, der in der Textklassifizierung, Bilderkennung, Klassifizierung biologischer Informationen und anderen Bereichen verwendet werden kann. Die Grundidee besteht darin, anhand eines Trainingsbeispielsatzes die k am nächsten liegenden Stichproben zu finden und dann deren Kategorien dem Abfragebeispiel zuzuweisen. Im Allgemeinen können durch Auswahl eines geeigneten k-Werts bessere Klassifizierungsergebnisse erzielt werden.

Der spezifische Berechnungsprozess ist wie folgt:

  1. Berechnen Sie den Abstand zwischen der Abfrageprobe und der Trainingsprobe. Die Entfernungsmessmethode kann die euklidische Entfernung, die Manhattan-Entfernung oder die Tschebyscheff-Entfernung sein.
  2. Sortieren Sie nach der Entfernung und wählen Sie die k Trainingsstichproben mit dem kleinsten Abstand zur Abfragestichprobe aus.
  3. Bestimmen Sie die Kategorien der ausgewählten k Trainingsmuster und weisen Sie der Abfrageprobe dieselbe Kategorie zu.

3.3 Polynomialer Bayesianischer Algorithmus

Multinomial Naive Bayes (MNB) ist ein Naive-Bayes-Klassifizierungsalgorithmus, der Klassifizierungsprobleme mit mehreren Kategorien lösen kann. Seine Grundidee ist: Nehmen Sie an, dass die A-priori-Wahrscheinlichkeiten jeder Kategorie unabhängig voneinander sind, d. h. P(Ci|X) = P(Cj|X), i!= j. Das heißt, bei Klassifizierungsproblemen sind die Merkmale jeder Kategorie bedingt unabhängig.

Der spezifische Berechnungsprozess ist wie folgt:

  1. Berechnen Sie für einen gegebenen Eingabemerkmalsvektor x die A-priori-Wahrscheinlichkeit p(Ci) jeder Kategorie.
  2. Berechnen Sie für jede Kategorie i die Anzahl der charakteristischen Wörter, die im Dokument vorkommen, zeichnen Sie sie als Ni auf und glätten Sie Ni.
  3. Berechnen Sie für jede Kategorie i die Anzahl der Dokumente in der gesamten Dokumentbibliothek, die als Di bezeichnet wird.
  4. Berechnen Sie für einen gegebenen Eingabemerkmalsvektor x die Auftrittswahrscheinlichkeit p(wi|Ci) jedes Kategoriemerkmals im Dokument und glätten Sie jede Wahrscheinlichkeit.
  5. Berechnen Sie für einen gegebenen Eingabemerkmalsvektor x die A-Posteriori-Wahrscheinlichkeit p(Ci|X), also P(Ci|X) = p(Ci)*prod{p(wi|Ci)}.
  6. Geben Sie die Kategorie mit der größten A-Posteriori-Wahrscheinlichkeit als Klassifizierungsergebnis zurück.

3.4 Logistischer Regressionsalgorithmus

Der logistische Regressionsalgorithmus (Logistic Regression) ist ein Klassifizierungsalgorithmus, der für binäre Klassifizierungsaufgaben geeignet ist. Seine Grundidee ist: Angenommen, es gibt eine gerade Linie auf der Sigmoid-Funktionskurve zwischen der Eingangsvariablen und der Ausgangsvariablen, so dass der Wert der Eingangsvariablen auf die Kurve in Richtung des Werts der Ausgangsvariablen projiziert wird (Werte größer). kleiner oder gleich Null werden auf 1 abgebildet, und Werte kleiner als Null werden auf 1 abgebildet. Der Wert wird auf 0 abgebildet. Klassifizieren Sie dann anhand der Punkte auf der Kurve.

Der spezifische Berechnungsprozess ist wie folgt:

  1. Die Gradientenabstiegsmethode wird verwendet, um die Modellparameter iterativ zu optimieren, dh den Parameter θ so zu lösen, dass die Wahrscheinlichkeitsfunktion maximiert wird.
  2. Verwenden Sie die Sigmoidfunktion, um den linearen Vorhersagewert in einen Wahrscheinlichkeitswert umzuwandeln. Je näher der Wahrscheinlichkeitswert an 1 liegt, desto glaubwürdiger ist das Vorhersageergebnis.
  3. Das Klassifizierungsergebnis wird anhand des Schwellenwerts ermittelt.

3.5 SVM-Algorithmus

Der Support Vector Machine (SVM)-Algorithmus ist ein Zwei-Klassen-Klassifizierungsalgorithmus, der komplexe nichtlineare Klassifizierungsprobleme lösen kann. Seine Grundidee ist: Zunächst wird eine Segmentierungshyperebene (Hyperebene) durch den Trainingsdatensatz konstruiert, und die Trennungshyperebene dieser Hyperebene maximiert den Abstand zwischen den Stützvektoren. Anschließend wird die Kernelfunktion verwendet, um die ursprünglichen Merkmale einem hochdimensionalen Raum zuzuordnen, und ein Strafparameter wird verwendet, um das Intervall zwischen den Unterstützungsvektoren zu maximieren.

Der spezifische Berechnungsprozess ist wie folgt:

  1. Passen Sie die Segmentierungshyperebene an den Trainingsdatensatz an, d. h. lösen Sie nach den Parametern Φ und b auf.
  2. Verwenden Sie für das neue Eingabebeispiel x die Kernelfunktion, um es einem hochdimensionalen Raum zuzuordnen, und berechnen Sie die Projektion auf die Hyperebene.
  3. Die Klassifizierungsergebnisse werden anhand der Projektionsgröße beurteilt.

4. Spezifische Codebeispiele und Erklärungen

In diesem Abschnitt wird hauptsächlich gezeigt, wie Sie mit der Python-Sprache einen einfachen Textklassifikator basierend auf der Scikit-Learn-Bibliothek implementieren. Wir haben einen fiktiven Textdatensatz vorbereitet und mithilfe der Scikit-Learn-API einen einfachen Textklassifikator implementiert. Die Codestruktur ist wie folgt:

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

# Load the dataset and split it into training set and testing set randomly
corpus = ["apple pie is delicious", "banana bread is yummy",
          "orange juice is tasty", "grape soda is sweet"]
labels = [0, 0, 1, 1]
np.random.seed(0)
indices = np.arange(len(corpus))
np.random.shuffle(indices)
train_size = int(0.7*len(corpus))
train_indices = indices[:train_size]
test_indices = indices[train_size:]
training_set = [(corpus[idx], labels[idx]) for idx in train_indices]
testing_set = [(corpus[idx], labels[idx]) for idx in test_indices]
print("Training Set:", training_set)
print("Testing Set:", testing_set)

# Define a pipeline with text vectorization using count matrix, followed by MNB classifier
pipe = Pipeline([('vectorizer', CountVectorizer()),
                 ('classifier', MultinomialNB())])

# Train the model on the training set
model = pipe.fit(training_set[0::,0], training_set[0::,1])

# Test the trained model on the testing set
predicted = model.predict(testing_set[0::,0])
actual = testing_set[0::,1]
accuracy = sum((predicted == actual).astype(int))/len(actual)
print("Model Accuracy:", accuracy)

Wenn Sie den obigen Code ausführen, können Sie die folgende Ausgabe sehen:

Training Set: [('apple pie is delicious', 0), ('banana bread is yummy', 0), ('orange juice is tasty', 1)]
Testing Set: [('grape soda is sweet', 1)]
Model Accuracy: 0.5

Es zeigt, dass unser Textklassifizierer bestimmte Klassifizierungsaufgaben erfüllt und eine gute Genauigkeit erreicht hat. Da dieser Datensatz jedoch einfach ist und das Verhältnis von Trainings- und Testdaten 7:3 beträgt, muss die Genauigkeit möglicherweise noch verbessert werden. Gleichzeitig können wir auch versuchen, mit mehr Daten zu trainieren und zu testen und mehr Funktionen zu nutzen, wie zum Beispiel:

  • Stoppen Sie die Textverarbeitung: Durch das Entfernen gängiger Stoppwörter (z. B. „ist“, „der“, „und“) kann die Klassifizierungsgenauigkeit verbessert werden.
  • Nominalphrasen extrahieren: Phrasen oder Sätze können als Merkmale extrahiert werden, um die Klassifizierungsgenauigkeit zu verbessern.
  • Weitere Klassifizierungsalgorithmen: Zusätzlich zu Naive Bayes können wir auch andere Methoden wie Random Forest, AdaBoost, SVM usw. verwenden, um die Auswirkungen der einzelnen Algorithmen zu vergleichen.

Ich denke du magst

Origin blog.csdn.net/universsky2015/article/details/133446753
Empfohlen
Rangfolge