Membangun dan melatih model hanyalah salah satu bagian dari alur kerja. Memahami karakteristik data sebelumnya akan memungkinkan Anda untuk membangun model transformer. Hal ini bisa berarti mendapatkan akurasi yang lebih tinggi. Hal itu juga bisa berarti membutuhkan lebih sedikit data untuk pelatihan, atau lebih sedikit sumber daya komputasi.
Memuat Set Data
Pertama, mari kita 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 Datanya
Setelah memuat data, sebaiknya jalankan beberapa pemeriksaan terhadap data tersebut: pilih sedikit sampel dan memeriksa secara manual apakah sesuai dengan harapan Anda. Misalnya, cetak beberapa sampel acak untuk melihat apakah label sentimen sesuai dengan sentimen ulasan. Berikut ulasan yang kami pilih secara acak dari kumpulan data IMDb: “Kisah selama sepuluh menit membentang ke dua jam yang lebih baik. Ketika tidak terjadi apa pun yang signifikan pada titik tengah saya seharusnya sudah pergi.” Sentimen yang diharapkan (negatif) cocok pada label sampel.
Kumpulkan Metrik Utama
Setelah Anda memverifikasi data, kumpulkan metrik penting berikut yang dapat membantu menandakan masalah klasifikasi teks Anda:
Jumlah sampel: Jumlah total contoh yang Anda miliki dalam data.
Jumlah kelas: Jumlah total topik atau kategori dalam data.
Jumlah sampel per kelas: Jumlah sampel per kelas (topik/kategori). Dalam {i>dataset<i} yang seimbang, semua class akan memiliki sampel; dalam set data yang tidak seimbang, jumlah sampel di setiap kelas akan sangat bervariasi.
Jumlah kata per sampel: Jumlah kata median dalam satu sampel.
Distribusi frekuensi kata: Distribusi yang menunjukkan frekuensi (jumlah kejadian) setiap kata dalam {i>dataset<i}.
Distribusi panjang sampel: Distribusi yang menunjukkan jumlah kata per sampel dalam set data.
Mari kita lihat nilai metrik ini dalam {i>dataset<i} ulasan IMDb (Lihat Gambar 3 dan 4 untuk mengetahui plot frekuensi kata dan panjang sampel distribusi).
Nama metrik | Nilai metrik |
---|---|
Jumlah sampel | 25000 |
Jumlah kelas | 2 |
Jumlah sampel per kelas | 12500 |
Jumlah kata per sampel | 174 |
Tabel 1: IMDb meninjau metrik set data
explore_data.py
berisi fungsi untuk
menghitung dan menganalisis metrik tersebut. Berikut 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()
Gambar 3: Distribusi frekuensi kata untuk IMDb
Gambar 4: Distribusi panjang sampel untuk IMDb