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