Bước 2: Khám phá dữ liệu của bạn

Việc xây dựng và huấn luyện mô hình chỉ là một phần của quy trình làm việc. Thấu hiểu các đặc điểm của dữ liệu sẽ giúp bạn có được mô hình. Điều này chỉ đơn giản là có được độ chính xác cao hơn. Điều này cũng có thể đồng nghĩa với việc cần ít dữ liệu hơn cho việc huấn luyện hoặc tài nguyên điện toán ít hơn.

Tải tập dữ liệu

Trước tiên, hãy tải tập dữ liệu vào 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)))

Kiểm tra dữ liệu

Sau khi tải dữ liệu, bạn nên chạy một số bước kiểm tra đối với dữ liệu đó: chọn một số mẫu và kiểm tra theo cách thủ công xem chúng có phù hợp với mong đợi của bạn không. Ví dụ: in một vài mẫu ngẫu nhiên để xem nhãn biểu cảm có được không tương ứng với ý kiến của bài đánh giá. Mời bạn xem bài đánh giá chúng tôi đã chọn ngẫu nhiên từ tập dữ liệu IMDb: “Câu chuyện dài 10 phút kéo dài trong 2 giờ. Khi không có bất kỳ ý nghĩa nào xảy ra tại thời điểm nửa chừng mà mình lẽ ra nên bỏ đi.” Ý kiến dự kiến (tiêu cực) khớp với nhãn của mẫu.

Thu thập các chỉ số chính

Sau khi bạn xác minh dữ liệu, hãy thu thập các chỉ số quan trọng sau đây giúp mô tả đặc điểm của bài toán phân loại văn bản:

  1. Số lượng mẫu: Tổng số ví dụ mà bạn có trong dữ liệu.

  2. Số lớp: Tổng số chủ đề hoặc danh mục trong dữ liệu.

  3. Số lượng mẫu trong mỗi lớp: Số lượng mẫu trong mỗi lớp (chủ đề/danh mục). Trong một tập dữ liệu cân bằng, tất cả các lớp sẽ có số liệu tương tự nhau mẫu; trong một tập dữ liệu không cân bằng, số lượng mẫu trong mỗi lớp sẽ rất khác nhau.

  4. Số từ trong mỗi mẫu: Số từ trung vị trong một mẫu.

  5. Mức phân bổ tần suất của từ: Phân phối thể hiện tần suất (số lần xuất hiện) của mỗi từ trong tập dữ liệu.

  6. Phân bố thời lượng mẫu: Phân phối thể hiện số lượng từ cho mỗi mẫu trong tập dữ liệu.

Hãy cùng xem giá trị của các chỉ số này là gì đối với tập dữ liệu bài đánh giá IMDb (Xem Hình 34 để biết biểu đồ tần suất từ và độ dài mẫu bản phân phối).

Tên chỉ số Giá trị chỉ số
Số lượng mẫu 25000
Số lớp 2
Số lượng mẫu cho mỗi lớp 12500
Số từ trên mỗi mẫu 174

Bảng 1: Các chỉ số về tập dữ liệu bài đánh giá IMDb

explore_data.py chứa các hàm để tính toán và phân tích các chỉ số này. Sau đây là một vài ví dụ:

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

Mức phân bổ tần suất của từ trong IMDb

Hình 3: Mức phân bổ tần suất của từ khoá trong IMDb

Phân phối độ dài mẫu cho IMDb

Hình 4: Phân phối độ dài mẫu cho IMDb