Krok 2. Sprawdź swoje dane

Tworzenie i trenowanie modelu to tylko jedna z części przepływu pracy. Zrozumienie określonych danych z góry pozwoli Ci utworzyć model atrybucji. Może to po prostu oznaczać uzyskanie większej dokładności. Może to też oznaczać, wymagają mniej danych do trenowania lub mniejszej liczby zasobów obliczeniowych.

Wczytywanie zbioru danych

Najpierw wczytajmy zbiór danych w Pythonie.

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

Sprawdź dane

Po załadowaniu danych warto przeprowadzić kilka testów: kilka próbek i ręcznie sprawdzić, czy odpowiadają one Twoim oczekiwaniom. Możesz na przykład wydrukować kilka losowych próbek, aby sprawdzić, czy etykieta nastawienia co odpowiada nastrojowi danej opinii. Oto opinia, którą wybraliśmy losowo ze zbioru danych IMDb: „Dziesięć minut historii rozciągnęła się niecałe dwie godziny. Jeśli w czasie, kiedy nie wydarzyło się nic istotnego, połowa powinna być już po lewej stronie”. Oczekiwane (ujemne) odczucia pasują do etykieta próbki.

Zbieranie kluczowych wskaźników

Po zweryfikowaniu danych zbierz te ważne dane, które pomogą Ci pomóż scharakteryzować problem z klasyfikacją tekstu:

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

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

  3. Liczba przykładów na zajęcia: liczba próbek na zajęcia. (temat/kategoria). W zrównoważonym zbiorze danych wszystkie klasy będą miały podobną liczbę próbek; w niezrównoważonym zbiorze danych liczba próbek w każdej klasie bardzo się różnią.

  4. Liczba słów na próbkę: mediana liczby słów w 1 próbce.

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

  6. Rozkład długości próbki: rozkład pokazujący liczbę słów na próbkę w zbiorze danych.

Zobaczmy, jakie wartości są wartościami w przypadku zbioru danych opinii w IMDb Wykresy przedstawiające częstotliwość występowania słów i długość próbki znajdziesz na rysunkach 3 i 4. rozkłady).

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

Tabela 1. Wskaźniki zbioru danych weryfikacji przez IMDb

explore_data.py zawiera funkcje do obliczać i analizować te dane. 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 częstotliwości występowania słów dla IMDb

Rysunek 3. Rozkład częstotliwości występowania słów w IMDb

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

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