Étape 2: Explorez vos données

Créer et entraîner un modèle ne constitue qu'une partie du workflow. Comprendre les caractéristiques de vos données à l'avance vous permettra de créer un meilleur modèle. Cela peut simplement signifier une plus grande précision. Cela peut également nécessiter moins de données pour l'entraînement ou moins de ressources de calcul.

Charger l'ensemble de données

Commençons par charger l'ensemble de données dans 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)))

Vérifier les données

Une fois les données chargées, il est recommandé d'effectuer des vérifications sur celles-ci: sélectionnez quelques échantillons et vérifiez manuellement qu'ils sont conformes à vos attentes. Par exemple, imprimez quelques échantillons aléatoires pour voir si l'étiquette de sentiment correspond au sentiment de l'avis. Voici un avis que nous avons choisi au hasard sur l'ensemble de données IMDb: "Dix minutes d'histoire s'étendent sur deux heures au maximum. alors que rien ne s'était passé à mi-chemin." Le sentiment attendu (négatif) correspond à l'étiquette de l'échantillon.

Collecter les métriques clés

Une fois les données validées, collectez les métriques importantes suivantes pour vous aider à caractériser votre problème de classification de texte:

  1. Nombre d'échantillons : nombre total d'exemples dont vous disposez dans les données.

  2. Nombre de classes : nombre total de thèmes ou de catégories dans les données.

  3. Nombre d'échantillons par classe : nombre d'échantillons par classe (thème/catégorie). Dans un ensemble de données équilibré, toutes les classes ont un nombre d'échantillons similaire. Dans un ensemble de données déséquilibré, le nombre d'échantillons dans chaque classe varie considérablement.

  4. Nombre de mots par échantillon : nombre médian de mots dans un échantillon.

  5. Répartition de la fréquence des mots : distribution indiquant la fréquence (nombre d'occurrences) de chaque mot de l'ensemble de données.

  6. Répartition de la longueur de l'échantillon: distribution indiquant le nombre de mots par échantillon dans l'ensemble de données.

Voyons les valeurs de ces métriques pour l'ensemble de données d'avis IMDb (voir les figures 3 et 4 pour les graphiques des distributions de la fréquence des mots et de la longueur de l'échantillon).

Nom de la métrique Valeur de métrique
Nombre d'échantillons 25 000
Nombre de classes 2
Nombre d'échantillons par classe 12500
Nombre de mots par échantillon 174

Tableau 1: IMDb examine les métriques de l'ensemble de données

explore_data.py contient des fonctions permettant de calculer et d'analyser ces métriques. Voici quelques exemples:

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()

Distribution de la fréquence des mots pour IMDb

Figure 3: Distribution de la fréquence des mots pour IMDb

Distribution de la longueur de l'échantillon pour IMDb

Figure 4: Répartition de la longueur de l'échantillon pour IMDb