[PYTHON] Vorverarbeitung von Textdaten (Vektorisierung, TF-IDF)

Textvektorisierung

Um einen Algorithmus für maschinelles Lernen auf Textdaten anzuwenden, müssen Rohdaten, bei denen es sich um eine Liste von Wörtern handelt, in einen numerischen Merkmalsvektor konvertiert werden.

Bag-of-Words: Die Idee, Grammatik und Wortreihenfolge zu ignorieren und Sätze als eine Reihe von Wörtern zu behandeln.

Hier wird eine Bibliothek für Themenmodelle namens gensim verwendet. Verwenden Sie zum Üben einen kurzen Korpus mit 9 Sätzen, wie im offiziellen Tutorial beschrieben.

from gensim import corpora

documents = ["Human machine interface for lab abc computer applications",
             "A survey of user opinion of computer system response time",
             "The EPS user interface management system",
             "System and human system engineering testing of EPS",              
             "Relation of user perceived response time to error measurement",
             "The generation of random binary unordered trees",
             "The intersection graph of paths in trees",
             "Graph minors IV Widths of trees and well quasi ordering",
             "Graph minors A survey"]

Gängige Wörter wie a, the, for, of und haben in Bag-of-words keine Bedeutung, daher werden sie als Stoppwörter ausgeschlossen. Um den Einfluss von Unschärfe in der Notation und das Vorhandensein von Wörtern am Satzanfang zu beseitigen, werden alle in Kleinbuchstaben umgewandelt.

# remove common words and tokenize
stoplist = set('for a of the and to in'.split())
texts = [[word for word in document.lower().split() if word not in stoplist]
         for document in documents]

Wörter, die nur einmal im Korpus vorkommen, enthalten nicht viele Informationen und werden daher ausgeschlossen.

# remove words that appear only once
from collections import defaultdict
frequency = defaultdict(int)
for text in texts:
    for token in text:
        frequency[token] += 1

texts = [[token for token in text if frequency[token] > 1] for text in texts]

from pprint import pprint  # pretty-printer
pprint(texts)

Hier sind die Ergebnisse.

[['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

Bis zu diesem Punkt wurde das Wort in Leerzeichen unterteilt und mit einem Token versehen. Geben Sie als Nächstes jedem Wort eine ID und zählen Sie die Anzahl der Vorkommen (Anzahl). Die Klasse gensim.corpora.dictionary.Dictionary ist ein Wörterbuch, das die Zuordnung zwischen Token und IDs darstellt.

dictionary = corpora.Dictionary(texts)

print(dictionary)
print(dictionary.token2id)
Dictionary(12 unique tokens: ['human', 'interface', 'computer', 'survey', 'user']...)
{'human': 0, 'interface': 1, 'computer': 2, 'survey': 3, 
'user': 4, 'system': 5, 'response': 6, 'time': 7, 
'eps': 8, 'trees': 9, 'graph': 10, 'minors': 11}

Es gibt 12 einzigartige Wörter im Korpus. Jeder Satz wird durch einen 12-dimensionalen Vektor dargestellt, der die Anzahl jedes Wortes enthält. Verwenden Sie doc2bow, um neuen Text zu vektorisieren.

new_doc = "Human computer interaction"
new_vec = dictionary.doc2bow(new_doc.lower().split())
print(new_vec)  # the word "interaction" does not appear in the dictionary and is ignored
[(0, 1), (2, 1)]

Das Ergebnis wird in der Form [(word_id, word_count), ...] zurückgegeben. In diesem Fall sind ein Mensch mit id = 0 und eine Interaktion mit id = 2 enthalten. Wörter mit 0 Vorkommen werden übersprungen. Außerdem ist "Interaktion" nicht im Wörterbuch enthalten und wird ignoriert.

Vektorisieren Sie den Originaltext.

corpus = [dictionary.doc2bow(text) for text in texts]
for c in corpus:
    print(c)
[(0, 1), (1, 1), (2, 1)]
[(2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
[(1, 1), (4, 1), (5, 1), (8, 1)]
[(0, 1), (5, 2), (8, 1)]
[(4, 1), (6, 1), (7, 1)]
[(9, 1)]
[(9, 1), (10, 1)]
[(9, 1), (10, 1), (11, 1)]
[(3, 1), (10, 1), (11, 1)]

TF-IDF

der Begriff Bedeutung
TF (term frequency) Häufigkeit des Auftretens von Wörtern
IDF (inverse document frequency) Häufigkeit der Dokumentdarstellung umkehren

Wörter, die extrem häufig im Korpus vorkommen, enthalten möglicherweise keine sehr nützlichen Informationen. Wenn Wortzählungsdaten (TF) direkt an den Klassifizierer übergeben werden, werden weniger häufige, aber aussagekräftigere Wörter in diesen Wörtern vergraben. Daher wird zusätzlich zu TF die Merkmalsmenge mit IDF gewichtet.

IDF ist wie folgt definiert. $ n_d $ ist die Gesamtzahl der Dokumente, $ df (d, t) $ ist die Anzahl der Dokumente, die das Wort t enthalten. Je weniger Dokumente das Wort t enthalten, desto größer ist die IDF (was das Gewicht seltener Wörter erhöht).

idf(t)=log\frac{1+n_d}{1+df(d,t)}+1

Konvertieren Sie mit TF-IDF mit Gensim.

from gensim import models
# step 1 -- initialize a model
tfidf = models.TfidfModel(corpus)

# step 2 -- use the model to transform vectors
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
    print(doc)
[(1, 0.5710059809418182), (4, 0.4170757362022777), (5, 0.4170757362022777), (8, 0.5710059809418182)]
[(0, 0.49182558987264147), (5, 0.7184811607083769), (8, 0.49182558987264147)]
[(4, 0.45889394536615247), (6, 0.6282580468670046), (7, 0.6282580468670046)]
[(9, 1.0)]
[(9, 0.7071067811865475), (10, 0.7071067811865475)]
[(9, 0.5080429008916749), (10, 0.5080429008916749), (11, 0.695546419520037)]
[(3, 0.6282580468670046), (10, 0.45889394536615247), (11, 0.6282580468670046)]

Hier wurde der für das Training verwendete Korpus selbst von TF-IDF konvertiert, aber natürlich kann jeder Satzvektor konvertiert werden (solange er zum selben Vektorraum gehört).

Recommended Posts

Vorverarbeitung von Textdaten (Vektorisierung, TF-IDF)
Korrelation durch Datenvorverarbeitung
Vorverarbeitung von Präfekturdaten
Wählen Sie Features mit Textdaten aus
[Übersetzung] scicit-learn 0.18 Tutorial Manipulation von Textdaten
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Persönliche Notizen zur Vorverarbeitung von Python Pandas-Daten
Vorverarbeitungsvorlage für die Datenanalyse (Python)
Vorverarbeitung beim maschinellen Lernen 2 Datenerfassung
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 4.3. Datenvorverarbeitung
Vorverarbeitung beim maschinellen Lernen 4 Datenkonvertierung