Criar e treinar um modelo é apenas uma parte do fluxo de trabalho. Se você entender as características dos seus dados com antecedência, poderá criar um modelo melhor. Isso significa simplesmente uma precisão maior. Também pode significar exigir menos dados para treinamento ou menos recursos computacionais.
Carregar o conjunto de dados
Primeiro, vamos carregar o conjunto de dados no 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)))
Verificar os dados
Após carregar os dados, é recomendável executar algumas verificações neles: escolha algumas amostras e verifique manualmente se elas são consistentes com suas expectativas. Por exemplo, exiba algumas amostras aleatórias para ver se o rótulo de sentimento corresponde ao sentimento da avaliação. Veja uma avaliação que escolhemos aleatoriamente do conjunto de dados da IMDb: "Dez minutos de história se esticaram na parte melhor de duas horas. Quando nada de nada tinha acontecido na metade do caminho, eu devia ter ido embora.” O sentimento esperado (negativo) corresponde ao rótulo da amostra.
Colete métricas importantes
Depois de verificar os dados, colete as seguintes métricas importantes que podem ajudar a caracterizar seu problema de classificação de texto:
Número de amostras: número total de exemplos nos dados.
Número de turmas: o número total de temas ou categorias nos dados.
Número de amostras por classe: número de amostras por classe (tópico/categoria). Em um conjunto de dados equilibrado, todas as classes terão um número semelhante de amostras. Em um conjunto de dados desequilibrado, o número de amostras em cada classe vai variar totalmente.
Número de palavras por amostra: número mediano de palavras em uma amostra.
Distribuição de frequência de palavras: distribuição que mostra a frequência (número de ocorrências) de cada palavra no conjunto de dados.
Distribuição do tamanho da amostra: distribuição que mostra o número de palavras por amostra no conjunto de dados.
Vamos ver quais são os valores dessas métricas para o conjunto de dados de avaliações do IMDb (consulte as figuras 3 e 4 para ver um gráfico das distribuições de frequência de palavras e tamanho da amostra).
Nome da métrica | Valor métrico |
---|---|
Número de amostras | 25.000 |
Número de classes | 2 |
Número de amostras por classe | 12500 |
Número de palavras por amostra | 174 |
Tabela 1: IMDb analisa as métricas do conjunto de dados
explore_data.py
contém funções para
calcular e analisar essas métricas. Veja alguns exemplos:
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()
Figura 3: distribuição de frequência de palavras para IMDb
Figura 4: distribuição do tamanho da amostra para IMDb