مرحله 2: داده های خود را کاوش کنید

ساخت و آموزش یک مدل تنها بخشی از گردش کار است. درک ویژگی های داده های خود از قبل به شما امکان می دهد مدل بهتری بسازید. این به سادگی می تواند به معنای دستیابی به دقت بالاتر باشد. همچنین می تواند به معنای نیاز به داده کمتر برای آموزش یا منابع محاسباتی کمتر باشد.

مجموعه داده را بارگیری کنید

ابتدا بیایید مجموعه داده را در پایتون بارگذاری کنیم.

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

داده ها را بررسی کنید

پس از بارگیری داده ها، تمرین خوبی است که برخی از آنها را بررسی کنید : چند نمونه را انتخاب کنید و به صورت دستی بررسی کنید که آیا مطابق با انتظارات شما هستند یا خیر. به عنوان مثال، چند نمونه تصادفی را چاپ کنید تا ببینید آیا برچسب احساسات با احساس بررسی مطابقت دارد یا خیر. در اینجا مروری است که ما به صورت تصادفی از مجموعه داده های IMDb انتخاب کردیم: «داستان ده دقیقه ای در بخش بهتری از دو ساعت طول کشید. وقتی هیچ اتفاق مهمی در نیمه راه رخ نداده بود، باید می رفتم.» احساس مورد انتظار (منفی) با برچسب نمونه مطابقت دارد.

معیارهای کلیدی را جمع آوری کنید

هنگامی که داده ها را تأیید کردید، معیارهای مهم زیر را جمع آوری کنید که می تواند به شناسایی مشکل طبقه بندی متن شما کمک کند:

  1. تعداد نمونه : تعداد کل نمونه هایی که در داده ها دارید.

  2. تعداد کلاس‌ها : تعداد کل موضوعات یا دسته‌ها در داده‌ها.

  3. تعداد نمونه در هر کلاس : تعداد نمونه در هر کلاس (موضوع/دسته). در یک مجموعه داده متعادل، همه کلاس‌ها دارای تعداد مشابهی از نمونه‌ها خواهند بود. در یک مجموعه داده نامتعادل، تعداد نمونه ها در هر کلاس به طور گسترده ای متفاوت خواهد بود.

  4. تعداد کلمات در هر نمونه : میانه تعداد کلمات در یک نمونه.

  5. توزیع فراوانی کلمات : توزیعی که فراوانی (تعداد وقوع) هر کلمه در مجموعه داده را نشان می دهد.

  6. توزیع طول نمونه : توزیعی که تعداد کلمات هر نمونه در مجموعه داده را نشان می دهد.

بیایید ببینیم که مقادیر این معیارها برای مجموعه داده بررسی های IMDb چیست (شکل 3 و 4 را برای نمودارهای توزیع فراوانی کلمه و طول نمونه ببینید).

نام متریک مقدار متریک
تعداد نمونه 25000
تعداد کلاس ها 2
تعداد نمونه در هر کلاس 12500
تعداد کلمات در هر نمونه 174

جدول 1: IMDb معیارهای مجموعه داده را بررسی می کند

explore_data.py دارای توابعی برای محاسبه و تجزیه و تحلیل این معیارها است. در اینجا چند نمونه وجود دارد:

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

شکل 3: توزیع فراوانی کلمات برای IMDb

توزیع طول نمونه برای IMDb

شکل 4: توزیع طول نمونه برای IMDb