2. Adım: Verilerinizi Keşfedin

Model oluşturma ve eğitme, iş akışının yalnızca bir parçasıdır. Verilerinizin özelliklerini önceden anlamak daha iyi bir model oluşturmanıza olanak sağlar. Bu, daha yüksek doğruluk elde etmeniz anlamına gelebilir. Ayrıca eğitim için daha az veri veya daha az bilgi işlem kaynağı kullanılmasını da gerektirebilir.

Veri Kümesini Yükleme

İlk olarak veri kümesini Python'a yükleyelim.

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

Verileri kontrol etme

Verileri yükledikten sonra, bazı kontroller gerçekleştirmeniz önerilir: Birkaç örnek seçin ve beklentilerinizle tutarlı olup olmadığını manuel olarak kontrol edin. Örneğin, duygu etiketinin yorumun duygularına uygun olup olmadığını görmek için birkaç rastgele örnek yazdırın. IMDb veri kümesinden rastgele seçtiğimiz bir yorumu burada bulabilirsiniz: "On dakika değerinde hikaye, iki saatten kısa bir süreye yayıldı. Yarıda bırakmam gereken, hiçbir önemli nokta yoktu." Beklenen duygu (negatif), örneğin etiketiyle eşleşiyor.

Temel Metrikleri Toplama

Verileri doğruladıktan sonra metin sınıflandırma sorununuzun tanımlanmasına yardımcı olabilecek aşağıdaki önemli metrikleri toplayın:

  1. Örnek sayısı: Verilerdeki toplam örnek sayısı.

  2. Sınıf sayısı: Verilerdeki toplam konu veya kategori sayısı.

  3. Sınıf başına örnek sayısı: Sınıf başına örnek sayısı (konu/kategori). Dengeli bir veri kümesinde, tüm sınıfların örnek sayısı benzer olacaktır. Dengesiz bir veri kümesinde, her sınıftaki örnek sayısı büyük farklılıklar gösterir.

  4. Örnek başına kelime sayısı: Tek bir örnekteki kelimelerin ortalama sayısı.

  5. Kelimelerin sıklık dağılımı: Veri kümesindeki her bir kelimenin sıklığını (oluşma sayısı) gösteren dağılım.

  6. Örnek uzunluğu dağılımı: Veri kümesindeki örnek başına kelime sayısını gösteren dağılım.

Şimdi, IMDb yorumları veri kümesi için bu metriklerin değerlerinin ne olduğuna bakalım (Kelime sıklığı ve örnek uzunluğu dağılımları için Şekiller 3 ve 4'e bakın).

Metrik adı Metrik değeri
Örnek sayısı 25000
Sınıf sayısı 2
Sınıf başına örnek sayısı 12500
Örnek başına kelime sayısı 174

1. Tablo: IMDb, veri kümesi metriklerini inceler

explore_data.py bu metrikleri hesaplamaya ve analiz etmeye yönelik işlevler içerir. Aşağıda birkaç örnek verilmiştir:

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

IMDb için kelimelerin sıklık dağılımı

Şekil 3: IMDb için kelimelerin sıklık dağılımı

IMDb için örnek uzunluğu dağılımı

Şekil 4: IMDb için örnek uzunluğu dağılımı