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

Việc xây dựng và đào tạo một mô hình chỉ là một phần của quy trình làm việc. Việc hiểu trước các đặc điểm của dữ liệu sẽ giúp bạn xây dựng một mô hình hiệu quả hơn. Điều này có thể đơn giản có nghĩa là giúp có được độ chính xác cao hơn. Ngoài ra, bạn cũng có thể phải tốn ít dữ liệu hơn cho việc đào tạo hoặc ít tài nguyên điện toán 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 trên đó: chọn một số mẫu và kiểm tra thủ công xem các mẫu đó có phù hợp với kỳ vọng của bạn hay không. Ví dụ: xuất một vài mẫu ngẫu nhiên để xem nhãn ý kiến có tương ứng với ý kiến đánh giá không. Sau đây là một bài đánh giá mà chúng tôi chọn ngẫu nhiên từ tập dữ liệu IMDb: “Câu chuyện trị giá mười phút trải dài trong phần tốt hơn trong hai giờ. Khi không có ý nghĩa nào xảy ra ở điểm giữa chừng mà tôi nên để lại." Tình trạng dự kiến (âm tính) 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 có thể giúp xác định vấn đề về việc 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 trên mỗi lớp: Số lượng mẫu trên 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ố lượng mẫu tương tự nhau; trong một tập dữ liệu không cân bằng, số lượng mẫu trong từng lớp sẽ thay đổi rộng rãi.

  4. Số từ trên mỗi mẫu: Số từ trung bình trong một mẫu.

  5. Phân bổ tần suất các từ: Mức phân bổ cho biết 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 phối độ dài mẫu: Việc phân phối cho thấy số từ trên mỗi mẫu trong tập dữ liệu.

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

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

Bảng 1: IMDb xem xét các chỉ số của tập dữ liệu

explore_data.py chứa các hàm để tính toán và phân tích những chỉ số này. Dưới đây là một số 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()

Phân bổ tần suất các từ cho IMDb

Hình 3: Phân bổ tần suất các từ cho IMDb

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

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