الخطوة 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