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 데이터 세트에서 분석: “ 시간을 절약할 수 있습니다. 1980년대 중반에 아무 의미도 일어나지 않았을 때 중간 지점에 도달해야 합니다.'라는 질문에 예상되는 감정 (부정적인 감정)이 샘플 라벨에 따라 다릅니다.

주요 측정항목 수집

데이터가 확인되면 다음과 같은 중요한 측정항목을 수집하세요. 텍스트 분류 문제를 규정하는 데 도움이 됩니다.

  1. 샘플 수: 데이터에 있는 총 예시 수입니다.

  2. 클래스 수: 데이터에 있는 주제 또는 카테고리의 총 개수입니다.

  3. 클래스당 샘플 수: 클래스당 샘플 수 확인할 수 있습니다. 균형 잡힌 데이터 세트에서는 모든 클래스가 비슷한 수를 갖습니다. 샘플의 각 클래스의 샘플 수는 크게 다를 수 있습니다

  4. 샘플당 단어 수: 한 샘플의 단어 수 중앙값입니다.

  5. 단어의 빈도 분포: 빈도를 보여주는 분포 (일치하는 항목 수)를 반환합니다.

  6. 샘플 길이 분포: 단어 수를 보여주는 분포 각 샘플에 적용됩니다

IMDb 리뷰 데이터 세트에서 이러한 측정항목의 값이 무엇인지 살펴보겠습니다. (단어-빈도 및 샘플-길이에 대한 도표는 그림 34를 참고하세요.) 배포).

측정항목 이름 측정항목 값
샘플 수 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의 샘플 길이 분포