ขั้นตอนที่ 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)))

ตรวจสอบข้อมูล

หลังจากโหลดข้อมูลแล้ว คุณควรทำการตรวจสอบข้อมูลโดยเลือก 2-3 ตัวอย่าง และตรวจสอบด้วยตนเองว่าสอดคล้องกับสิ่งที่คุณคาดหวังหรือไม่ เช่น พิมพ์ตัวอย่างแบบสุ่ม 2-3 ตัวอย่างเพื่อดูว่าป้ายกำกับความเห็น สอดคล้องกับความเห็นของรีวิว นี่คือรีวิวที่เราสุ่มมาให้ จากชุดข้อมูล IMDb: "เรื่องราวความยาว 10 นาทีขยายออกไปสู่ ที่ดีขึ้นภายใน 2 ชั่วโมง เมื่อไม่มีนัยสำคัญเกิดขึ้นที่ ครึ่งทางที่ฉันควรจะได้เหลืออยู่" ความรู้สึกที่ตรงกันที่คาดไว้ (เชิงลบ) ป้ายกำกับของตัวอย่างเพลง

รวบรวมเมตริกหลัก

เมื่อคุณยืนยันข้อมูลแล้ว ให้รวบรวมเมตริกที่สำคัญต่อไปนี้ซึ่งสามารถ ช่วยจำแนกลักษณะของปัญหาการจัดประเภทข้อความของคุณ

  1. จำนวนตัวอย่าง: จำนวนตัวอย่างทั้งหมดที่คุณมีในข้อมูล

  2. จำนวนชั้นเรียน: จำนวนหัวข้อหรือหมวดหมู่ทั้งหมดในข้อมูล

  3. จำนวนตัวอย่างต่อคลาส: จำนวนตัวอย่างต่อคลาส (หัวข้อ/หมวดหมู่) ในชุดข้อมูลที่สมดุล คลาสทั้งหมดจะมีจำนวนใกล้เคียงกัน ตัวอย่าง ในชุดข้อมูลที่ไม่สมดุล จำนวนตัวอย่างในแต่ละคลาสจะ แตกต่างกันอย่างมาก

  4. จำนวนคำต่อตัวอย่าง: จำนวนคำมัธยฐานใน 1 ตัวอย่าง

  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