Langkah 2: Pelajari Data Anda

Membuat dan melatih model hanyalah salah satu bagian dari alur kerja. Dengan memahami karakteristik data sebelumnya, Anda dapat membuat model yang lebih baik. Ini dapat berarti memperoleh akurasi yang lebih tinggi. Ini juga berarti memerlukan lebih sedikit data untuk pelatihan, atau lebih sedikit resource komputasi.

Memuat Set Data

Pertama, mari muat set data ke 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)))

Periksa Data

Setelah memuat data, sebaiknya jalankan beberapa pemeriksaan terhadap data tersebut: pilih beberapa sampel dan periksa secara manual apakah konsisten dengan ekspektasi Anda. Misalnya, cetak beberapa sampel acak untuk melihat apakah label sentimen sesuai dengan sentimen ulasan. Berikut adalah ulasan yang kami pilih secara acak dari set data IMDb: “Kisah sepuluh menit yang membentang hingga ke bagian yang lebih baik dalam dua jam.

Mengumpulkan Metrik Utama

Setelah Anda memverifikasi data, kumpulkan metrik penting berikut yang dapat membantu mengkarakterisasi masalah klasifikasi teks:

  1. Jumlah sampel: Jumlah total contoh yang ada pada data.

  2. Jumlah kelas: Jumlah total topik atau kategori dalam data.

  3. Jumlah sampel per class: Jumlah sampel per class (topik/kategori). Dalam set data yang seimbang, semua class akan memiliki jumlah sampel yang mirip; dalam set data yang tidak seimbang, jumlah sampel di setiap class akan sangat bervariasi.

  4. Jumlah kata per sampel: Median jumlah kata dalam satu sampel.

  5. Distribusi frekuensi kata: Distribusi yang menampilkan frekuensi (jumlah kemunculan) setiap kata dalam set data.

  6. Distribusi panjang sampel: Distribusi yang menampilkan jumlah kata per sampel dalam set data.

Mari kita lihat nilai metrik ini untuk set data ulasan IMDb (Lihat Gambar 3 dan 4 untuk plot distribusi frekuensi kata dan panjang sampel).

Nama metrik Nilai metrik
Jumlah sampel 25000
Jumlah kelas 2
Jumlah sampel per kelas 12500
Jumlah kata per sampel 174

Tabel 1: Metrik set data ulasan IMDb

explore_data.py berisi fungsi untuk menghitung dan menganalisis metrik ini. Berikut ini beberapa contohnya:

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

Distribusi frekuensi kata untuk IMDb

Gambar 3: Distribusi frekuensi kata untuk IMDb

Distribusi panjang sampel untuk IMDb

Gambar 4: Distribusi panjang sampel untuk IMDb