Schritt 2: Daten analysieren

Das Erstellen und Trainieren eines Modells ist nur ein Teil des Workflows. Verständnis der Eigenschaften Ihrer Daten im Vorfeld hilft Ihnen, ein besseres modellieren. Dies könnte einfach bedeuten, dass eine höhere Genauigkeit erreicht wird. Es kann auch bedeuten, und erfordern weniger Daten für das Training oder weniger Rechenressourcen.

Dataset laden

Zuerst laden wir das Dataset in Python.

def load_imdb_sentiment_analysis_dataset(data_path, seed=123):
    """Loads the IMDb movie reviews sentiment analysis dataset.

    # Arguments
        data_path: string, path to the data directory.
        seed: int, seed for randomizer.

    # Returns
        A tuple of training and validation data.
        Number of training samples: 25000
        Number of test samples: 25000
        Number of categories: 2 (0 - negative, 1 - positive)

    # References
        Mass et al., http://www.aclweb.org/anthology/P11-1015

        Download and uncompress archive from:
        http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
    """
    imdb_data_path = os.path.join(data_path, 'aclImdb')

    # Load the training data
    train_texts = []
    train_labels = []
    for category in ['pos', 'neg']:
        train_path = os.path.join(imdb_data_path, 'train', category)
        for fname in sorted(os.listdir(train_path)):
            if fname.endswith('.txt'):
                with open(os.path.join(train_path, fname)) as f:
                    train_texts.append(f.read())
                train_labels.append(0 if category == 'neg' else 1)

    # Load the validation data.
    test_texts = []
    test_labels = []
    for category in ['pos', 'neg']:
        test_path = os.path.join(imdb_data_path, 'test', category)
        for fname in sorted(os.listdir(test_path)):
            if fname.endswith('.txt'):
                with open(os.path.join(test_path, fname)) as f:
                    test_texts.append(f.read())
                test_labels.append(0 if category == 'neg' else 1)

    # Shuffle the training data and labels.
    random.seed(seed)
    random.shuffle(train_texts)
    random.seed(seed)
    random.shuffle(train_labels)

    return ((train_texts, np.array(train_labels)),
            (test_texts, np.array(test_labels)))

Daten prüfen

Es empfiehlt sich, nach dem Laden der Daten einige Prüfungen durchzuführen: Wählen Sie und prüfen Sie manuell, ob sie Ihren Erwartungen entsprechen. Sie können z. B. ein paar zufällige Stichproben ausgeben, um zu sehen, ob das Label der in der Rezension verfassten Meinung entspricht. Diese Rezension haben wir nach dem Zufallsprinzip ausgewählt. aus dem IMDb-Dataset: „Eine 10-minütige Geschichte mehr als zwei Stunden. Als am selben Tag Ich hätte den Weg zur Hälfte verlassen sollen.“ Die erwartete Stimmung stimmt (negativ) überein. das Label der Stichprobe.

Wichtige Messwerte erfassen

Sobald Sie die Daten verifiziert haben, sammeln Sie die folgenden wichtigen Messwerte, bei der Charakterisierung Ihres Textklassifizierungsproblems:

  1. Anzahl der Beispiele: Die Gesamtzahl der Beispiele in den Daten.

  2. Anzahl der Kurse: Gesamtzahl der Themen oder Kategorien in den Daten

  3. Anzahl der Proben pro Klasse: Anzahl der Proben pro Klasse (Thema/Kategorie) In einem ausgewogenen Dataset haben alle Klassen eine ähnliche Anzahl von Stichproben; in einem unausgeglichenen Dataset enthält die Anzahl der Stichproben in jeder Klasse variieren stark.

  4. Anzahl der Wörter pro Probe: Medianwert der Wörter in einer Leseprobe

  5. Häufigkeitsverteilung von Wörtern: Verteilung der Häufigkeit (Anzahl der Vorkommen) jedes Worts im Dataset.

  6. Verteilung der Stichprobenlänge: Verteilung der Anzahl der Wörter pro Stichprobe im Dataset.

Sehen wir uns an, welche Werte diese Messwerte für das IMDb-Rezensions-Dataset haben. (In den Abbildungen 3 und 4 sind Diagramme der Worthäufigkeit und der Stichprobenlänge dargestellt. Verteilungen).

Messwertname Messwert
Anzahl der Beispiele 25.000
Anzahl der Kurse 2
Anzahl der Beispiele pro Klasse 12500
Anzahl der Wörter pro Leseprobe 174

Tabelle 1: IMDb-Überprüfungen für Dataset-Messwerte

explore_data.py enthält Funktionen, um um diese Messwerte zu berechnen und zu analysieren. Hier einige Beispiele:

import numpy as np
import matplotlib.pyplot as plt

def get_num_words_per_sample(sample_texts):
    """Returns the median number of words per sample given corpus.

    # Arguments
        sample_texts: list, sample texts.

    # Returns
        int, median number of words per sample.
    """
    num_words = [len(s.split()) for s in sample_texts]
    return np.median(num_words)

def plot_sample_length_distribution(sample_texts):
    """Plots the sample length distribution.

    # Arguments
        samples_texts: list, sample texts.
    """
    plt.hist([len(s) for s in sample_texts], 50)
    plt.xlabel('Length of a sample')
    plt.ylabel('Number of samples')
    plt.title('Sample length distribution')
    plt.show()

Häufigkeitsverteilung von Wörtern für IMDb

Abbildung 3: Häufigkeitsverteilung von Wörtern für IMDb

Verteilung der Stichprobenlänge für IMDb

Abbildung 4: Verteilung der Stichprobenlänge für IMDb