Krok 2. Sprawdź swoje dane

Tworzenie i trenowanie modelu to tylko jeden z elementów przepływu pracy. Poznanie wcześniej charakterystyk danych pozwala utworzyć lepszy model. Może to oznaczać uzyskanie większej dokładności. Może to też wymagać mniejszej ilości danych do trenowania lub mniejszej ilości zasobów obliczeniowych.

Wczytywanie zbioru danych

Najpierw wczytaj zbiór danych do języka 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)))

Sprawdzanie danych

Po wczytaniu danych warto przetestować je: wybierz kilka próbek i sprawdź, czy są zgodne z Twoimi oczekiwaniami. Wydrukuj na przykład kilka losowych próbek, aby sprawdzić, czy etykieta nastawienia pasuje do nastawienia. Oto recenzja, którą wybraliśmy losowo ze zbioru IMDb: „Dziesięć minut historii zostało rozciągniętych na lepszą część dwóch godzin. Gdy w połowie tak się stało, nic nie powinno się stać”. Oczekiwane nastawienie (negatywne) pasuje do etykiety próbki.

Gromadzenie kluczowych danych

Po zweryfikowaniu danych zbierz te ważne dane, które mogą pomóc Ci określić cechę klasyfikacji tekstu:

  1. Liczba próbek: łączna liczba przykładów w danych.

  2. Liczba zajęć: łączna liczba tematów lub kategorii w danych.

  3. Liczba próbek na zajęcia: liczba próbek na klasę (temat/kategoria). W zrównoważonym zbiorze danych wszystkie klasy będą miały podobną liczbę próbek, a w zrównoważonym zbiorze danych liczba prób w każdej klasy będzie się znacznie różnić.

  4. Liczba słów w próbce: mediana liczby słów w jednej próbce.

  5. Rozkład częstotliwości występowania słów: rozkład częstotliwości (liczby wystąpień) każdego słowa w zbiorze danych.

  6. Rozkład długości próbki: rozkład z liczbą słów w próbce w zbiorze danych.

Sprawdźmy wartości tych danych w przypadku zbioru danych z opiniami IMDb.

Nazwa danych Wartość wskaźnika
Liczba próbek 25000
Liczba zajęć 2
Liczba próbek na klasy 12500
Liczba słów na próbkę 174

Tabela 1. Dane IMDb opinii

explore_data.py zawiera funkcje umożliwiające obliczanie i analizowanie tych danych. Oto kilka przykładów:

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

Rozkład słów na liście IMDb

Ilustracja 3. Rozkład słów na liście IMDb

Rozkład długości próbki dla IMDb

Rysunek 4. Rozkład długości próbki dla IMDb