Eine tiefere Bedeutung: Themenmodellierung in Python

Veröffentlicht: 2022-03-11

Computer und die Prozessoren, die sie antreiben, sind darauf ausgelegt, mit Zahlen zu arbeiten. Im Gegensatz dazu hat die Alltagssprache von E-Mails und Social-Media-Posts eine lockere Struktur, die sich nicht für Berechnungen eignet.

Hier kommt die Verarbeitung natürlicher Sprache (NLP) ins Spiel. NLP ist ein Zweig der Informatik, der sich mit der Linguistik überschneidet, indem Computertechniken (insbesondere künstliche Intelligenz) zur Analyse natürlicher Sprache und Sprache angewendet werden. Die Themenmodellierung konzentriert sich darauf, zu verstehen, um welche Themen es in einem bestimmten Text geht. Mithilfe der Themenmodellierung können Entwickler hilfreiche Funktionen implementieren, z. B. das Erkennen aktueller Nachrichten in sozialen Medien, das Empfehlen personalisierter Nachrichten, das Erkennen gefälschter Benutzer und das Charakterisieren des Informationsflusses.

Wie können Entwickler berechnungsorientierte Computer dazu bringen, die menschliche Kommunikation auf diesen Ebenen der Komplexität zu verstehen?

Eine Tüte voller Wörter

Um diese Frage zu beantworten, müssen wir einen Text mathematisch beschreiben können. Wir beginnen unser Themenmodellierungs-Python-Tutorial mit der einfachsten Methode: einem Wortschatz.

Diese Methode stellt einen Text als eine Menge von Wörtern dar. Beispielsweise kann der Satz This is an example als eine Reihe von Wörtern beschrieben werden, wobei die Häufigkeit verwendet wird, mit der diese Wörter vorkommen:

 {"an": 1, "example": 1, "is": 1, "this": 1}

Beachten Sie, dass diese Methode die Wortreihenfolge ignoriert. Nehmen Sie diese Beispiele:

  • „Ich mag Star Wars, aber ich mag Harry Potter nicht.“
  • „Ich mag Harry Potter, aber ich mag Star Wars nicht.“

Diese Gefühle werden durch die gleichen Wörter dargestellt, aber sie haben entgegengesetzte Bedeutungen. Für die thematische Analyse der Texte spielen diese Unterschiede jedoch keine Rolle. In beiden Fällen sprechen wir über Vorlieben für Harry Potter und Star Wars, unabhängig davon, was diese Vorlieben sind. Daher ist die Wortstellung unerheblich.

Wenn wir mehrere Texte haben und versuchen, die Unterschiede zwischen ihnen zu verstehen, brauchen wir eine mathematische Darstellung für unser gesamtes Korpus, die jeden Text separat betrachtet. Dazu können wir eine Matrix verwenden, in der jede Spalte ein Wort oder einen Begriff und jede Zeile einen Text darstellt. Eine mögliche Darstellung eines Korpus besteht darin, in jeder Zelle die Häufigkeit anzugeben, mit der ein bestimmtes Wort (Spalte) in einem bestimmten Text (Zeile) verwendet wird.

In unserem Beispiel besteht der Korpus aus zwei Sätzen (unseren Matrixzeilen):

 ["I like Harry Potter", "I like Star Wars"]

Wir listen die Wörter in diesem Korpus in der Reihenfolge auf, in der wir ihnen begegnen: I , like , Harry , Potter , Star , Wars . Diese entsprechen unseren Matrixspalten.

Die Werte in der Matrix geben an, wie oft ein bestimmtes Wort in jedem Satz verwendet wird:

 [[1,1,1,1,0,0], [1,1,0,0,1,1]] 

Das Bild zeigt links zwei Textzeilen: Ich mag Harry Potter und ich mag Star Wars. Dieser Text wird dann in der Mitte in eine Worttüte umgewandelt, wobei auf jedes Wort die Häufigkeit folgt, mit der dieses Wort verwendet wurde: „I like Harry Potter“ wird zu „{I: 1, like: 1, Harry: 1, Potter : 1, Star: 0, Wars: 0}“ und „I like Star Wars“ wird zu „{I: 1, like: 1, Harry: 0, Potter: 0, Star: 1, Wars: 1}“ auf der rechten Seite , werden diese Zahlen dann in einer Matrixdarstellung angeordnet: Erstere wird zur Zeile "1 1 1 1 0 0" und letztere wird zu "1 1 0 0 1 1".
In eine Matrixdarstellung umgewandelter Text

Beachten Sie, dass die Größe der Matrix bestimmt wird, indem die Anzahl der Texte mit der Anzahl der verschiedenen Wörter multipliziert wird, die in mindestens einem Text vorkommen. Letztere ist meist unnötig groß und kann verkleinert werden. Beispielsweise könnte eine Matrix zwei Spalten für konjugierte Verben wie „spielen“ und „gespielt“ enthalten, ungeachtet der Tatsache, dass ihre Bedeutung ähnlich ist.

Es könnten jedoch Spalten fehlen, die neue Konzepte beschreiben. Zum Beispiel haben „Klassik“ und „Musik“ jeweils individuelle Bedeutungen, aber wenn sie kombiniert werden – „klassische Musik“ – haben sie eine andere Bedeutung.

Aufgrund dieser Probleme ist es notwendig, Text vorzuverarbeiten, um gute Ergebnisse zu erzielen.

Vorverarbeitungs- und Topic-Clustering-Modelle

Um optimale Ergebnisse zu erzielen, müssen mehrere Vorverarbeitungstechniken verwendet werden. Hier sind einige der am häufigsten verwendeten:

  1. Kleinbuchstaben. Machen Sie alle Wörter klein. Machen Sie alle Wörter klein. Die Bedeutung eines Wortes ändert sich nicht unabhängig von seiner Position im Satz.
  2. n -Gramm. Betrachten Sie alle Gruppen von n Wörtern in einer Reihe als neue Begriffe, die als n-Gramme bezeichnet werden. So werden Fälle wie „Weißes Haus“ berücksichtigt und der Vokabelliste hinzugefügt.
  3. Stemmen. Identifizieren Sie Präfixe und Suffixe von Wörtern, um sie von ihrer Wurzel zu isolieren. Auf diese Weise werden Wörter wie „play“, „played“ oder „player“ durch das Wort „play“ repräsentiert. Stemming kann nützlich sein, um die Anzahl der Wörter in der Vokabelliste zu reduzieren und gleichzeitig ihre Bedeutung zu bewahren, aber es verlangsamt die Vorverarbeitung erheblich, da es auf jedes Wort im Korpus angewendet werden muss.
  4. Schluss mit Worten. Berücksichtigen Sie keine Wortgruppen, denen es an Bedeutung oder Nützlichkeit mangelt. Dazu gehören Artikel und Präpositionen, aber auch Wörter, die für unsere spezielle Fallstudie nicht nützlich sind, wie z. B. bestimmte gebräuchliche Verben.
  5. Begriffshäufigkeit – inverse Dokumenthäufigkeit (tf–idf). Verwenden Sie den Koeffizienten von tf–idf, anstatt die Häufigkeit jedes Wortes in jeder Zelle der Matrix zu notieren. Es besteht aus zwei Zahlen, multipliziert:
    • tf – die Häufigkeit eines bestimmten Begriffs oder Wortes in einem Text, und
    • idf – der Logarithmus der Gesamtzahl der Dokumente dividiert durch die Anzahl der Dokumente, die diesen bestimmten Begriff enthalten.

    tf–idf ist ein Maß dafür, wie häufig ein Wort im Korpus verwendet wird. Um Wörter in Gruppen einteilen zu können, ist es wichtig, nicht nur zu verstehen, welche Wörter in welchen Texten vorkommen, sondern auch, welche Wörter in einem Text häufig vorkommen, in anderen aber überhaupt nicht.

Die folgende Abbildung zeigt einige einfache Beispiele dieser Vorverarbeitungstechniken, bei denen der ursprüngliche Text des Korpus modifiziert wird, um eine relevante und handhabbare Wortliste zu erzeugen.

Die Technik der „Kleinbuchstaben“ wandelt den Satz „Das Weiße Haus“ um. in eine Wortliste: "the", "white", "house". Die „n-grams“-Technik verwandelt sie in eine längere Liste: „the“, „white“, „house“, „the white“, „white house“. Die „Stemming“-Technik verwandelt den Satz „Der Fußballer hat ein gutes Spiel gemacht“. in diese Liste: "the", "football", "play", "a", "good", "game". Die „Stoppwörter“-Technik verwandelt sie in eine kürzere Liste: „Fußball“, „spielen“, „gut“, „Spiel“.
Beispiele für Textvorverarbeitungstechniken

Jetzt zeigen wir Ihnen, wie Sie einige dieser Techniken in Python anwenden. Sobald wir unser Korpus mathematisch dargestellt haben, müssen wir die diskutierten Themen identifizieren, indem wir unbeaufsichtigte Algorithmen für maschinelles Lernen anwenden. In diesem Fall bedeutet „unbeaufsichtigt“, dass der Algorithmus keine vordefinierten Themenkennzeichnungen wie „Science Fiction“ hat, die er auf seine Ausgabe anwenden kann.

Um unseren Korpus zu clustern, können wir aus mehreren Algorithmen wählen, darunter nicht-negative Matrixfaktorisierung (NMF), Sparse-Hauptkomponentenanalyse (Sparse-PCA) und latente Dirichlet-Allokation (LDA). Wir konzentrieren uns auf LDA, da es aufgrund seiner guten Ergebnisse in den Bereichen soziale Medien, Medizin, Politikwissenschaft und Softwareentwicklung von der wissenschaftlichen Gemeinschaft weit verbreitet ist.

LDA ist ein Modell zur unüberwachten Themenzerlegung: Es gruppiert Texte anhand der enthaltenen Wörter und der Wahrscheinlichkeit, dass ein Wort zu einem bestimmten Thema gehört. Der LDA-Algorithmus gibt die Themenwortverteilung aus. Mit diesen Informationen können wir die Hauptthemen basierend auf den Wörtern definieren, die am wahrscheinlichsten damit verbunden sind. Sobald wir die Hauptthemen und die zugehörigen Wörter identifiziert haben, können wir wissen, welches Thema oder welche Themen auf jeden Text zutreffen.

Betrachten Sie den folgenden Korpus, der aus fünf kurzen Sätzen besteht (alle aus den Schlagzeilen der New York Times entnommen):

 corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]

Der Algorithmus sollte ein Thema im Zusammenhang mit Politik und Coronavirus und ein zweites im Zusammenhang mit Nadal und Tennis eindeutig identifizieren.

Anwenden der Strategie in Python

Um die Themen zu erkennen, müssen wir die notwendigen Bibliotheken importieren. Python hat einige nützliche Bibliotheken für NLP und maschinelles Lernen, einschließlich NLTK und Scikit-learn (sklearn).

 from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords

Mit CountVectorizer() erzeugen wir die Matrix, die die Häufigkeit der Wörter jedes Textes mit CountVectorizer() bezeichnet. Beachten Sie, dass der CountVectorizer eine Vorverarbeitung ermöglicht, wenn Sie Parameter wie stop_words zum Einschließen der Stoppwörter, ngram_range zum Einschließen von n -grams oder lowercase=True zum Konvertieren aller Zeichen in Kleinbuchstaben einschließen.

 count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64)

Um das Vokabular unseres Korpus zu definieren, können wir einfach das Attribut .get_feature_names() verwenden:

 count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']

Dann führen wir die tf–idf-Berechnungen mit der sklearn-Funktion durch:

 tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)

Um die LDA-Zerlegung durchzuführen, müssen wir die Anzahl der Themen definieren. In diesem einfachen Fall wissen wir, dass es zwei Themen oder „Dimensionen“ gibt. Aber im Allgemeinen ist dies ein Hyperparameter, der etwas abgestimmt werden muss, was mit Algorithmen wie der Zufallssuche oder der Rastersuche erfolgen könnte:

 dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])

LDA ist eine probabilistische Methode. Hier sehen wir die Wahrscheinlichkeit, dass jede der fünf Schlagzeilen zu jedem der beiden Themen gehört. Wir sehen, dass die ersten beiden Texte erwartungsgemäß mit höherer Wahrscheinlichkeit zum ersten Thema und die nächsten drei zum zweiten Thema gehören.

Wenn wir schließlich verstehen wollen, worum es bei diesen beiden Themen geht, können wir die wichtigsten Wörter in jedem Thema sehen:

 components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]

Wie erwartet ordnete LDA Wörter im Zusammenhang mit Tennisturnieren und Nadal korrekt dem ersten Thema und Wörter im Zusammenhang mit Biden und Virus dem zweiten Thema zu.

Umfangreiche Analysen und Anwendungsfälle aus der Praxis

Eine großangelegte Analyse der Themenmodellierung ist in diesem Papier zu sehen; Ich habe die wichtigsten Nachrichtenthemen während der US-Präsidentschaftswahlen 2016 studiert und die Themen beobachtet, die einige Massenmedien – wie die New York Times und Fox News – in ihre Berichterstattung aufgenommen haben, wie etwa Korruption und Einwanderung. In diesem Beitrag habe ich auch die Korrelationen und Kausalitäten zwischen Massenmedieninhalten und den Wahlergebnissen analysiert.

Die Themenmodellierung wird auch außerhalb der Wissenschaft häufig verwendet, um verborgene Themenmuster zu entdecken, die in großen Textsammlungen vorhanden sind. Beispielsweise kann es in Empfehlungssystemen verwendet werden oder um festzustellen, worüber Kunden/Benutzer in Umfragen, in Feedback-Formularen oder in sozialen Medien sprechen.

Der Toptal Engineering Blog dankt Juan Manuel Ortiz de Zarate für die Durchsicht der in diesem Artikel vorgestellten Codebeispiele.

Empfohlene Lektüre zur Themenmodellierung

Verbesserte Themenmodellierung in Twitter
Albanese, Federico und Esteban Feuerstein. „Verbesserte Themenmodellierung in Twitter durch Community-Pooling.“ (20. Dezember 2021): arXiv:2201.00690 [cs.IR]

Analyse von Twitter für die öffentliche Gesundheit
Paul, Michael und Mark Dredze. „Du bist, was du twitterst: Analyse von Twitter für die öffentliche Gesundheit.“ 3. August 2021.

Politische Orientierung auf Twitter einordnen
Cohen, Raviv und Derek Ruths. „Politische Orientierung auf Twitter einordnen: Das ist nicht einfach!“ 3. August 2021.

Verwenden relationaler Topic-Modelle zum Erfassen der Kopplung
Gethers, Malcolm und Denis Poshyvanyk. "Verwendung relationaler Themenmodelle zur Erfassung der Kopplung zwischen Klassen in objektorientierten Softwaresystemen." 25. Oktober 2010.