Schritt 2: Daten analysieren

Das Erstellen und Trainieren eines Modells ist nur ein Teil des Workflows. Wenn Sie die Eigenschaften Ihrer Daten im Voraus kennen, können Sie ein besseres Modell erstellen. Das kann einfach bedeuten, eine höhere Genauigkeit zu erzielen. Es kann auch bedeuten, dass Sie für das Training weniger Daten oder weniger Rechenressourcen benötigen.

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

Nachdem Sie die Daten geladen haben, sollten Sie einige Prüfungen durchführen: Wählen Sie einige Beispiele aus und prüfen Sie manuell, ob sie Ihren Erwartungen entsprechen. Drucken Sie beispielsweise ein paar zufällige Beispiele aus, um festzustellen, ob das Sentimentlabel zur Stimmung der Rezension passt. Hier ist eine Rezension, die wir nach dem Zufallsprinzip aus dem IMDb-Dataset ausgewählt haben: „Zehn Minuten Geschichte, die sich über einen längeren Zeitraum von zwei Stunden erstreckt. Wenn am Ende der Hälfte nichts passiert ist, sollte ich es nicht mehr haben.“ Die erwartete (negative) Stimmung entspricht dem Label der Stichprobe.

Wichtige Messwerte erfassen

Nachdem Sie die Daten überprüft haben, können Sie die folgenden wichtigen Messwerte erfassen, die das Problem der Textklassifizierung beschreiben können:

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

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

  3. Anzahl der Beispiele pro Klasse: Anzahl der Beispiele pro Klasse (Thema/Kategorie). In einem ausgewogenen Dataset haben alle Klassen eine ähnliche Anzahl von Stichproben. Bei einem unausgeglichenen Dataset variiert die Anzahl der Stichproben in jeder Klasse stark.

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

  5. Häufigkeitsverteilung der Wörter: Verteilung der Häufigkeit jedes Wortes im Dataset.

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

Sehen wir uns an, welche Werte diese Messwerte für das IMDb-Rezensions-Dataset haben. In den Grafiken 3 und 4 sehen Sie die Verteilungen der Worthäufigkeit und der Stichprobenlänge.

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

Tabelle 1: Dataset-Messwerte von IMDb prüfen

explore_data.py enthält Funktionen zum Berechnen und Analysieren dieser Messwerte. 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 der Wörter für IMDb

Abbildung 3: Häufigkeitsverteilung der Wörter für IMDb

Verteilung der Stichprobenlänge für IMDb

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