שלב 2: בחינת הנתונים

יצירה ואימון של מודל הם רק חלק אחד בתהליך העבודה. הבנה המאפיינים של הנתונים מראש יאפשרו לכם ליצור מודל טרנספורמר. המשמעות יכולה פשוט להיות שיפור רמת הדיוק. אפשר גם פחות נתונים לאימון או פחות משאבי חישוב.

טעינת מערך הנתונים

קודם כול, טוענים את מערך הנתונים ב-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)))

בדיקת הנתונים

לאחר טעינת הנתונים, מומלץ להריץ כמה בדיקות עליהם: בוחרים כמה דוגמאות ולבדוק ידנית אם הן תואמות לציפיות שלך. לדוגמה, הדפסת מספר דוגמאות אקראיות כדי לראות אם תווית הסנטימנט שתואם לתחושה של הביקורת. הנה ביקורת שבחרנו באופן אקראי ממערך הנתונים של 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