Kursinhalt
Einführung in NLP
Einführung in NLP
Bag of Words
Verständnis des BoW-Modells
Wie wir bereits im vorherigen Kapitel erwähnt haben, stellt das Bag-of-Words (BoW) Modell Dokumente als Vektoren dar, wobei jede Dimension einem einzigartigen Wort entspricht. Jede Dimension kann entweder das Vorhandensein eines Wortes im Dokument darstellen (1
wenn vorhanden, 0
wenn nicht vorhanden) oder seine Häufigkeit (Wortanzahl). Daher können BoW-Modelle entweder binär oder frequenzbasiert sein.
Schauen wir uns an, wie derselbe Satz (Dokument) von jedem Typ dargestellt wird:
Wie Sie sehen können, stellt ein binäres Modell dieses Dokument als den Vektor [1, 1, 1] dar, während frequenzbasierte Modelle es als [2, 1, 2] darstellen, wobei die Wortfrequenz berücksichtigt wird.
BoW-Implementierung
Lassen Sie uns nun in die Implementierung des BoW-Modells in Python eintauchen. Die Implementierung des BoW-Modells kann ein unkomplizierter Prozess sein, insbesondere mit Hilfe der sklearn
(Scikit-learn) Bibliothek und ihrer CountVectorizer
Klasse.
Ohne weitere Umschweife, lassen Sie uns mit einem Beispiel eines binären Bag of Words fortfahren:
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Jede Zeile in der Matrix entspricht einem Dokument und jede Spalte einem Token (Wort). Um es visuell darzustellen, haben wir diese spärliche Matrix in ein dichtes 2D-Array umgewandelt, indem wir die Methode .toarray()
verwendet haben.
Um ein frequenzbasiertes Bag-of-Words-Modell zu erstellen, müssen wir lediglich den Parameter binary=True
entfernen, da der Standardwert dafür False
ist:
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
Umwandlung der Matrix in ein DataFrame
Es kann sehr praktisch sein, die resultierende Bag-of-Words-Matrix in ein pandas DataFrame
umzuwandeln. Darüber hinaus bietet die CountVectorizer
-Instanz die Methode get_feature_names_out()
, die ein Array von einzigartigen Wörtern (Feature-Namen) abruft, die im Modell verwendet werden. Diese Feature-Namen können als Spalten des resultierenden DataFrame
festgelegt werden, hier ist ein Beispiel:
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Mit dieser Darstellung können wir nun nicht nur leicht auf den Vektor für ein bestimmtes Dokument zugreifen, sondern auch auf den Vektor eines bestimmten Wortes:
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Da jedes einzigartige Wort einer Spalte entspricht, ist der Zugriff auf einen Wortvektor so einfach wie der Zugriff auf eine Spalte im DataFrame
, indem das Wort angegeben wird (zum Beispiel 'global'
). Wir verwenden auch das values
-Attribut, um ein Array anstelle einer Series
als Ergebnis zu erhalten.
Danke für Ihr Feedback!