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:
Liczba próbek: łączna liczba przykładów w danych.
Liczba zajęć: łączna liczba tematów lub kategorii w danych.
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ć.
Liczba słów w próbce: mediana liczby słów w jednej próbce.
Rozkład częstotliwości występowania słów: rozkład częstotliwości (liczby wystąpień) każdego słowa w zbiorze danych.
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()
Ilustracja 3. Rozkład słów na liście IMDb
Rysunek 4. Rozkład długości próbki dla IMDb