KI mit Python - NLTK-Paket

In diesem Kapitel erfahren Sie, wie Sie mit dem Natural Language Toolkit-Paket beginnen.

Voraussetzung

Wenn wir Anwendungen mit der Verarbeitung natürlicher Sprache erstellen möchten, ist die Änderung des Kontexts am schwierigsten. Der Kontextfaktor beeinflusst, wie die Maschine einen bestimmten Satz versteht. Daher müssen wir Anwendungen in natürlicher Sprache mithilfe von Ansätzen des maschinellen Lernens entwickeln, damit die Maschine auch verstehen kann, wie ein Mensch den Kontext verstehen kann.

Um solche Anwendungen zu erstellen, verwenden wir das Python-Paket NLTK (Natural Language Toolkit Package).

NLTK importieren

Wir müssen NLTK installieren, bevor wir es verwenden können. Es kann mit Hilfe des folgenden Befehls installiert werden:

pip install nltk

Verwenden Sie den folgenden Befehl, um ein Conda-Paket für NLTK zu erstellen:

conda install -c anaconda nltk

Nachdem Sie das NLTK-Paket installiert haben, müssen Sie es über die Python-Eingabeaufforderung importieren. Wir können es importieren, indem wir den folgenden Befehl an die Python-Eingabeaufforderung schreiben:

>>> import nltk

Herunterladen der NLTK-Daten

Nach dem Import von NLTK müssen wir nun die erforderlichen Daten herunterladen. Dies kann mit Hilfe des folgenden Befehls an der Python-Eingabeaufforderung erfolgen:

>>> nltk.download()

Installieren anderer erforderlicher Pakete

Für die Erstellung von Anwendungen zur Verarbeitung natürlicher Sprache mithilfe von NLTK müssen die erforderlichen Pakete installiert werden. Die Pakete sind wie folgt -

gensim

Es ist eine robuste semantische Modellierungsbibliothek, die für viele Anwendungen nützlich ist. Wir können es installieren, indem wir den folgenden Befehl ausführen:

pip install gensim

Muster

Es wird verwendet, um zu machen gensimPaket funktioniert richtig. Wir können es installieren, indem wir den folgenden Befehl ausführen

pip install pattern

Konzept der Tokenisierung, Stemming und Lemmatisierung

In diesem Abschnitt werden wir verstehen, was Tokenisierung, Stemming und Lemmatisierung sind.

Tokenisierung

Es kann als der Prozess des Aufbrechens des gegebenen Textes definiert werden, dh der Zeichenfolge in kleinere Einheiten, die als Token bezeichnet werden. Die Token können Wörter, Zahlen oder Satzzeichen sein. Es wird auch Wortsegmentierung genannt. Das Folgende ist ein einfaches Beispiel für die Tokenisierung -

Input - Mango, Banane, Ananas und Apfel sind Früchte.

Output - -

Das Aufbrechen des angegebenen Textes kann mithilfe der Wortgrenzen erfolgen. Das Ende eines Wortes und der Anfang eines neuen Wortes werden Wortgrenzen genannt. Das Schriftsystem und die typografische Struktur der Wörter beeinflussen die Grenzen.

Im Python NLTK-Modul gibt es verschiedene Pakete zur Tokenisierung, mit denen wir den Text gemäß unseren Anforderungen in Token unterteilen können. Einige der Pakete sind wie folgt:

Paket sent_tokenize

Wie der Name schon sagt, teilt dieses Paket den eingegebenen Text in Sätze. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.tokenize import sent_tokenize

word_tokenize-Paket

Dieses Paket unterteilt den eingegebenen Text in Wörter. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.tokenize import word_tokenize

WordPunctTokenizer-Paket

Dieses Paket unterteilt den eingegebenen Text in Wörter sowie die Satzzeichen. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.tokenize import WordPuncttokenizer

Stemming

Bei der Arbeit mit Wörtern stoßen wir aus grammatikalischen Gründen auf viele Variationen. Das Konzept der Variationen bedeutet hier, dass wir uns mit verschiedenen Formen der gleichen Wörter wie beschäftigen müssendemocracy, democratic, und democratization. Maschinen müssen unbedingt verstehen, dass diese verschiedenen Wörter dieselbe Grundform haben. Auf diese Weise wäre es nützlich, die Grundformen der Wörter zu extrahieren, während wir den Text analysieren.

Wir können dies erreichen, indem wir eindämmen. Auf diese Weise können wir sagen, dass Stemming der heuristische Prozess ist, bei dem die Grundformen der Wörter durch Abhacken der Wortenden extrahiert werden.

Im Python NLTK-Modul gibt es verschiedene Pakete zum Thema Stemming. Diese Pakete können verwendet werden, um die Grundformen von Wörtern zu erhalten. Diese Pakete verwenden Algorithmen. Einige der Pakete sind wie folgt:

PorterStemmer-Paket

Dieses Python-Paket verwendet den Porter-Algorithmus, um das Basisformular zu extrahieren. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.stem.porter import PorterStemmer

Zum Beispiel, wenn wir das Wort geben ‘writing’ Als Eingabe für diesen Stemmer werden wir das Wort bekommen ‘write’ nach dem Stemming.

LancasterStemmer-Paket

Dieses Python-Paket verwendet den Lancaster-Algorithmus, um das Basisformular zu extrahieren. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.stem.lancaster import LancasterStemmer

Zum Beispiel, wenn wir das Wort geben ‘writing’ Als Eingabe für diesen Stemmer werden wir das Wort bekommen ‘write’ nach dem Stemming.

SnowballStemmer-Paket

Dieses Python-Paket verwendet den Schneeball-Algorithmus, um das Basisformular zu extrahieren. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.stem.snowball import SnowballStemmer

Zum Beispiel, wenn wir das Wort geben ‘writing’ Als Eingabe für diesen Stemmer werden wir das Wort bekommen ‘write’ nach dem Stemming.

Alle diese Algorithmen haben unterschiedliche Strenge. Wenn wir diese drei Stemmers vergleichen, sind die Porter-Stemmers am wenigsten streng und Lancaster am strengsten. Schneeball-Stemmer ist sowohl in Bezug auf Geschwindigkeit als auch in Bezug auf Strenge gut zu verwenden.

Lemmatisierung

Wir können die Grundform von Wörtern auch durch Lemmatisierung extrahieren. Grundsätzlich wird diese Aufgabe unter Verwendung eines Vokabulars und einer morphologischen Analyse von Wörtern ausgeführt, wobei normalerweise nur die Beugung von Beugungsenden angestrebt wird. Diese Art der Grundform eines Wortes wird Lemma genannt.

Der Hauptunterschied zwischen Stemming und Lemmatisierung besteht in der Verwendung des Wortschatzes und der morphologischen Analyse der Wörter. Ein weiterer Unterschied besteht darin, dass das Stemming am häufigsten derivativ verwandte Wörter zusammenbricht, während die Lemmatisierung gewöhnlich nur die verschiedenen Flexionsformen eines Lemmas zusammenbricht. Wenn wir beispielsweise das Wort saw als Eingabewort angeben, gibt das Stemming möglicherweise das Wort 's' zurück, aber die Lemmatisierung würde versuchen, das Wort see oder saw zurückzugeben, je nachdem, ob die Verwendung des Tokens ein Verb oder ein Substantiv war.

Im Python NLTK-Modul haben wir das folgende Paket zum Lemmatisierungsprozess, mit dem wir die Grundformen von Wörtern erhalten können -

WordNetLemmatizer-Paket

Dieses Python-Paket extrahiert die Grundform des Wortes, je nachdem, ob es als Substantiv oder als Verb verwendet wird. Wir können dieses Paket mit Hilfe des folgenden Python-Codes importieren:

from nltk.stem import WordNetLemmatizer

Chunking: Aufteilen von Daten in Chunks

Es ist einer der wichtigsten Prozesse in der Verarbeitung natürlicher Sprache. Die Hauptaufgabe des Chunking besteht darin, die Wortarten und kurzen Phrasen wie Nominalphrasen zu identifizieren. Wir haben bereits den Prozess der Tokenisierung, die Erstellung von Token, untersucht. Chunking ist im Grunde die Kennzeichnung dieser Token. Mit anderen Worten, Chunking zeigt uns die Struktur des Satzes.

Im folgenden Abschnitt lernen wir die verschiedenen Arten von Chunking kennen.

Arten von Chunking

Es gibt zwei Arten von Chunking. Die Typen sind wie folgt:

Chunking up

In diesem Prozess des Zerhackens werden das Objekt, die Dinge usw. allgemeiner und die Sprache wird abstrakter. Es gibt mehr Chancen auf Einigung. In diesem Prozess verkleinern wir. Wenn wir zum Beispiel die Frage aufwerfen, „für welchen Zweck Autos sind“? Wir können die Antwort "Transport" bekommen.

Chunking down

In diesem Prozess des Zerhackens werden das Objekt, die Dinge usw. spezifischer und die Sprache wird durchdringender. Die tiefere Struktur würde beim Zerlegen untersucht. In diesem Prozess zoomen wir hinein. Wenn wir beispielsweise die Frage „Erzählen Sie speziell von einem Auto“ aufteilen? Wir werden kleinere Informationen über das Auto erhalten.

Example

In diesem Beispiel führen wir das Nunk-Phrase-Chunking durch, eine Chunking-Kategorie, bei der die Nomen-Phrasen-Chunks im Satz mithilfe des NLTK-Moduls in Python gefunden werden.

Follow these steps in python for implementing noun phrase chunking −

Step 1- In diesem Schritt müssen wir die Grammatik für das Chunking definieren. Es würde aus den Regeln bestehen, denen wir folgen müssen.

Step 2- In diesem Schritt müssen wir einen Chunk-Parser erstellen. Es würde die Grammatik analysieren und die Ausgabe geben.

Step 3 - In diesem letzten Schritt wird die Ausgabe in einem Baumformat erzeugt.

Importieren wir das erforderliche NLTK-Paket wie folgt:

import nltk

Jetzt müssen wir den Satz definieren. Hier bedeutet DT die Determinante, VBP das Verb, JJ das Adjektiv, IN die Präposition und NN das Substantiv.

sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
          ("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

Jetzt müssen wir die Grammatik geben. Hier geben wir die Grammatik in Form eines regulären Ausdrucks an.

grammar = "NP:{<DT>?<JJ>*<NN>}"

Wir müssen einen Parser definieren, der die Grammatik analysiert.

parser_chunking = nltk.RegexpParser(grammar)

Der Parser analysiert den Satz wie folgt:

parser_chunking.parse(sentence)

Als nächstes müssen wir die Ausgabe erhalten. Die Ausgabe wird in der einfachen Variablen namens generiertoutput_chunk.

Output_chunk = parser_chunking.parse(sentence)

Nach Ausführung des folgenden Codes können wir unsere Ausgabe in Form eines Baums zeichnen.

output.draw()

Bag of Word (BoW) Modell

Bag of Word (BoW), ein Modell in der Verarbeitung natürlicher Sprache, wird im Wesentlichen verwendet, um die Merkmale aus Text zu extrahieren, damit der Text bei der Modellierung verwendet werden kann, beispielsweise bei Algorithmen für maschinelles Lernen.

Nun stellt sich die Frage, warum wir die Features aus dem Text extrahieren müssen. Dies liegt daran, dass die Algorithmen für maschinelles Lernen nicht mit Rohdaten arbeiten können und numerische Daten benötigen, damit sie aussagekräftige Informationen daraus extrahieren können. Die Umwandlung von Textdaten in numerische Daten wird als Merkmalsextraktion oder Merkmalskodierung bezeichnet.

Wie es funktioniert

Dies ist ein sehr einfacher Ansatz zum Extrahieren der Features aus Text. Angenommen, wir haben ein Textdokument und möchten es in numerische Daten konvertieren oder sagen, wir möchten die Features daraus extrahieren. Dann extrahiert dieses Modell zunächst ein Vokabular aus allen Wörtern im Dokument. Mithilfe einer Dokumenttermmatrix wird dann ein Modell erstellt. Auf diese Weise stellt BoW das Dokument nur als Wortsack dar. Alle Informationen über die Reihenfolge oder Struktur der Wörter im Dokument werden verworfen.

Konzept der Dokumenttermmatrix

Der BoW-Algorithmus erstellt ein Modell unter Verwendung der Dokumenttermmatrix. Wie der Name schon sagt, ist die Dokumenttermmatrix die Matrix verschiedener Wortzahlen, die im Dokument vorkommen. Mit Hilfe dieser Matrix kann das Textdokument als gewichtete Kombination verschiedener Wörter dargestellt werden. Durch Festlegen des Schwellenwerts und Auswählen der aussagekräftigeren Wörter können wir ein Histogramm aller Wörter in den Dokumenten erstellen, die als Merkmalsvektor verwendet werden können. Das Folgende ist ein Beispiel, um das Konzept der Dokumenttermmatrix zu verstehen -

Example

Angenommen, wir haben die folgenden zwei Sätze -

  • Sentence 1 - Wir verwenden das Bag of Words-Modell.

  • Sentence 2 - Das Bag of Words-Modell wird zum Extrahieren der Features verwendet.

Wenn wir nun diese beiden Sätze betrachten, haben wir die folgenden 13 verschiedenen Wörter -

  • we
  • are
  • using
  • the
  • bag
  • of
  • words
  • model
  • is
  • used
  • for
  • extracting
  • features

Jetzt müssen wir für jeden Satz ein Histogramm erstellen, indem wir die Wortzahl in jedem Satz verwenden -

  • Sentence 1 - [1,1,1,1,1,1,1,1,0,0,0,0,0]

  • Sentence 2 - [0,0,0,1,1,1,1,1,1,1,1,1,1]

Auf diese Weise haben wir die Merkmalsvektoren, die extrahiert wurden. Jeder Merkmalsvektor ist 13-dimensional, da wir 13 verschiedene Wörter haben.

Konzept der Statistik

Das Konzept der Statistik heißt TermFrequency-Inverse Document Frequency (tf-idf). Jedes Wort ist im Dokument wichtig. Die Statistiken helfen uns, die Wichtigkeit jedes Wortes zu verstehen.

Laufzeit (tf)

Dies ist das Maß dafür, wie häufig jedes Wort in einem Dokument vorkommt. Dies kann erreicht werden, indem die Anzahl jedes Wortes durch die Gesamtzahl der Wörter in einem bestimmten Dokument geteilt wird.

Inverse Dokumentfrequenz (idf)

Dies ist das Maß dafür, wie eindeutig ein Wort für dieses Dokument in den angegebenen Dokumenten ist. Um idf zu berechnen und einen charakteristischen Merkmalsvektor zu formulieren, müssen wir die Gewichtung häufig vorkommender Wörter wie das reduzieren und die seltenen Wörter abwägen.

Erstellen eines Bag of Words-Modells in NLTK

In diesem Abschnitt definieren wir eine Sammlung von Zeichenfolgen, indem wir mit CountVectorizer Vektoren aus diesen Sätzen erstellen.

Lassen Sie uns das notwendige Paket importieren -

from sklearn.feature_extraction.text import CountVectorizer

Definieren Sie nun die Menge der Sätze.

Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
           used for extracting the features.']

vectorizer_count = CountVectorizer()

features_text = vectorizer.fit_transform(Sentences).todense()

print(vectorizer.vocabulary_)

Das obige Programm erzeugt die Ausgabe wie unten gezeigt. Es zeigt, dass wir in den beiden obigen Sätzen 13 verschiedene Wörter haben -

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
 'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

Dies sind die Merkmalsvektoren (Text in numerische Form), die für maschinelles Lernen verwendet werden können.

Probleme lösen

In diesem Abschnitt werden wir einige verwandte Probleme lösen.

Kategorie Vorhersage

In einer Reihe von Dokumenten sind nicht nur die Wörter, sondern auch die Kategorie der Wörter wichtig. In welche Textkategorie fällt ein bestimmtes Wort? Zum Beispiel möchten wir vorhersagen, ob ein bestimmter Satz zur Kategorie E-Mail, Nachrichten, Sport, Computer usw. gehört. Im folgenden Beispiel werden wir tf-idf verwenden, um einen Merkmalsvektor zu formulieren, um die Kategorie von Dokumenten zu finden. Wir werden die Daten aus 20 Newsgroup-Datensätzen von sklearn verwenden.

Wir müssen die notwendigen Pakete importieren -

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

Definieren Sie die Kategorieübersicht. Wir verwenden fünf verschiedene Kategorien mit den Namen Religion, Autos, Sport, Elektronik und Weltraum.

category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
   'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}

Erstellen Sie das Trainingsset -

training_data = fetch_20newsgroups(subset = 'train',
   categories = category_map.keys(), shuffle = True, random_state = 5)

Erstellen Sie einen Count-Vektorisierer und extrahieren Sie die Termzählungen -

vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)

Der tf-idf-Transformator wird wie folgt erstellt:

tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)

Definieren Sie nun die Testdaten -

input_data = [
   'Discovery was a space shuttle',
   'Hindu, Christian, Sikh all are religions',
   'We must have to drive safely',
   'Puck is a disk made of rubber',
   'Television, Microwave, Refrigrated all uses electricity'
]

Die obigen Daten helfen uns, einen multinomialen Naive Bayes-Klassifikator zu trainieren -

classifier = MultinomialNB().fit(train_tfidf, training_data.target)

Transformieren Sie die Eingabedaten mit dem Count Vectorizer -

input_tc = vectorizer_count.transform(input_data)

Jetzt werden wir die vektorisierten Daten mit dem tfidf-Transformator transformieren -

input_tfidf = tfidf.transform(input_tc)

Wir werden die Ausgabekategorien vorhersagen -

predictions = classifier.predict(input_tfidf)

Die Ausgabe wird wie folgt generiert:

for sent, category in zip(input_data, predictions):
   print('\nInput Data:', sent, '\n Category:', \
      category_map[training_data.target_names[category]])

Der Kategorie-Prädiktor generiert die folgende Ausgabe:

Dimensions of training data: (2755, 39297)

Input Data: Discovery was a space shuttle
Category: Space

Input Data: Hindu, Christian, Sikh all are religions
Category: Religion

Input Data: We must have to drive safely
Category: Autos

Input Data: Puck is a disk made of rubber
Category: Hockey

Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics

Gender Finder

In dieser Problemstellung würde ein Klassifikator geschult, um das Geschlecht (männlich oder weiblich) durch Angabe der Namen zu finden. Wir müssen eine Heuristik verwenden, um einen Merkmalsvektor zu konstruieren und den Klassifikator zu trainieren. Wir werden die gekennzeichneten Daten aus dem scikit-learn-Paket verwenden. Es folgt der Python-Code zum Erstellen eines Gender Finders -

Lassen Sie uns die notwendigen Pakete importieren -

import random

from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names

Jetzt müssen wir die letzten N Buchstaben aus dem eingegebenen Wort extrahieren. Diese Buchstaben dienen als Merkmale -

def extract_features(word, N = 2):
   last_n_letters = word[-N:]
   return {'feature': last_n_letters.lower()}
	
if __name__=='__main__':

Erstellen Sie die Trainingsdaten mit beschrifteten Namen (männlich wie weiblich), die in NLTK verfügbar sind -

male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)

random.seed(5)
random.shuffle(data)

Jetzt werden Testdaten wie folgt erstellt:

namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']

Definieren Sie die Anzahl der für Zug und Test verwendeten Proben mit dem folgenden Code

train_sample = int(0.8 * len(data))

Jetzt müssen wir verschiedene Längen durchlaufen, damit die Genauigkeit verglichen werden kann -

for i in range(1, 6):
   print('\nNumber of end letters:', i)
   features = [(extract_features(n, i), gender) for (n, gender) in data]
   train_data, test_data = features[:train_sample],
features[train_sample:]
   classifier = NaiveBayesClassifier.train(train_data)

Die Genauigkeit des Klassifikators kann wie folgt berechnet werden:

accuracy_classifier = round(100 * nltk_accuracy(classifier, test_data), 2)
   print('Accuracy = ' + str(accuracy_classifier) + '%')

Jetzt können wir die Ausgabe vorhersagen -

for name in namesInput:
   print(name, '==>', classifier.classify(extract_features(name, i)))

Das obige Programm erzeugt die folgende Ausgabe -

Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

In der obigen Ausgabe können wir sehen, dass die Genauigkeit der maximalen Anzahl von Endbuchstaben zwei beträgt und mit zunehmender Anzahl von Endbuchstaben abnimmt.

Themenmodellierung: Identifizieren von Mustern in Textdaten

Wir wissen, dass Dokumente im Allgemeinen in Themen gruppiert sind. Manchmal müssen wir die Muster in einem Text identifizieren, die einem bestimmten Thema entsprechen. Die Technik dazu wird als Themenmodellierung bezeichnet. Mit anderen Worten, wir können sagen, dass die Themenmodellierung eine Technik ist, um abstrakte Themen oder verborgene Strukturen in den angegebenen Dokumenten aufzudecken.

Wir können die Themenmodellierungstechnik in den folgenden Szenarien verwenden:

Textklassifizierung

Mithilfe der Themenmodellierung kann die Klassifizierung verbessert werden, da ähnliche Wörter zusammengefasst werden, anstatt jedes Wort einzeln als Feature zu verwenden.

Empfehlungssysteme

Mithilfe der Themenmodellierung können wir die Empfehlungssysteme mithilfe von Ähnlichkeitsmaßen erstellen.

Algorithmen zur Themenmodellierung

Die Themenmodellierung kann mithilfe von Algorithmen implementiert werden. Die Algorithmen sind wie folgt:

Latent Dirichlet Allocation (LDA)

Dieser Algorithmus ist der beliebteste für die Themenmodellierung. Es verwendet die probabilistischen grafischen Modelle zur Implementierung der Themenmodellierung. Wir müssen das Gensim-Paket in Python importieren, um den LDA-Algorithmus verwenden zu können.

Latent Semantic Analysis (LDA) oder Latent Semantic Indexing (LSI)

Dieser Algorithmus basiert auf der linearen Algebra. Grundsätzlich wird das Konzept der SVD (Singular Value Decomposition) in der Dokumenttermmatrix verwendet.

Nicht negative Matrixfaktorisierung (NMF)

Es basiert auch auf der linearen Algebra.

Alle oben genannten Algorithmen zur Themenmodellierung hätten die number of topics als Parameter, Document-Word Matrix als Eingabe und WTM (Word Topic Matrix) & TDM (Topic Document Matrix) als Ausgabe.