Tianchi PNL Competição - Classificação de textos de notícias (2) - Leitura de dados e análise de dados


Série de artigos
Classificação do texto de notícias da competição de PNL da Tianchi (1) ——Compreensão das questões da competição Classificação do texto de notícias da competição da
PNL da Tianchi (2) —— Leitura de dados e análise de dados


2. Leitura e análise de dados

2.1 Leitura de dados

Embora os dados da pergunta sejam dados de texto, cada notícia tem tamanho variável, mas ainda é armazenada no formato csv. Portanto, você pode usar diretamente o Pandas para concluir a operação de leitura de dados.

import pandas as pd
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=100)

Aqui é read_csvcomposto por três partes:

  • O caminho do arquivo de leitura, aqui precisa ser alterado para o caminho local, você pode usar um caminho relativo ou um caminho absoluto;
  • Separator, sepque é o caractere a \tser separado em cada coluna, basta configurá-lo como;
  • O número de linhas nrowslidas é a função de leitura do arquivo desta vez, e é um tipo numérico (devido ao conjunto de dados relativamente grande, é recomendado defini-lo como 100 primeiro);
train_df.head()

Insira a descrição da imagem aqui
A primeira coluna é a categoria das notícias, e a segunda coluna é o personagem das notícias.

2.2 Análise de dados

Nesta etapa, lemos todos os dados do conjunto de treinamento. Aqui, esperamos tirar as seguintes conclusões por meio da análise de dados:

  • Qual é o comprimento do texto da notícia nos dados da pergunta?
  • Qual é a distribuição de categorias dos dados da pergunta e quais categorias são mais numerosas?
  • Qual é a distribuição de personagens nos dados da pergunta?

2.2.1 Análise do comprimento da frase

%%time
%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())

Preenchendo o namespace interativo da
contagem numpy e matplotlib
200000,000000 média 907,207110
std 996,029036
min 2.000000
25% 374,000000
50% 676,000000
75% 1131,000000
máx 57921,000000
Nome: text_len, dtype: float64
Tempo na parede: 10,1 s

As estatísticas das frases-notícia permitem concluir que o texto dado neste concurso é relativamente longo, cada frase é composta por 907 caracteres em média, a menor duração da frase é 2 e a maior é 57921.

A figura a seguir desenha um histograma do comprimento da frase. Pode-se ver que a maior parte do comprimento da frase está dentro de 2.000.

_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")

Insira a descrição da imagem aqui

2.2.2 Distribuição da categoria de notícias

Em seguida, você pode realizar estatísticas de distribuição nas categorias do conjunto de dados e, especificamente, contar o número de amostras de cada tipo de notícia.

train_df['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")

Insira a descrição da imagem aqui

A relação correspondente dos rótulos no conjunto de dados é a seguinte: {'Tecnologia': 0, 'Ações': 1, 'Esportes': 2, 'Entretenimento': 3, 'Atualidades': 4, 'Sociedade': 5, 'Educação': 6, 'Finanças': 7, 'Móveis para casa': 8, 'Jogo': 9, 'Propriedade': 10, 'Moda': 11, 'Loteria': 12, 'Constelação': 13 }

Os resultados estatísticos mostram que a distribuição das categorias do conjunto de dados das questões da competição é relativamente desigual. No conjunto de treinamento, as notícias de tecnologia são as mais recentes, seguidas pelas notícias da bolsa, e as menos notícias são as notícias de constelações.

2.2.3 Estatísticas de distribuição de caracteres

A seguir, o número de ocorrências de cada personagem pode ser contado. Primeiro, todas as sentenças no conjunto de treinamento podem ser emendadas e então divididas em caracteres, e o número de cada personagem pode ser contado.

Os resultados estatísticos mostram que um total de 6.869 palavras estão incluídas no conjunto de treinamento, das quais a palavra número 3750 é a que aparece mais vezes e a palavra número 3133 é a que menos aparece.

from collections import Counter
all_lines = ' '.join(list(train_df['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True)

print(len(word_count))

print(word_count[0])

print(word_count[-1])

2405

('3750', 3702)

('5034', 1)

Aqui você também pode inferir os sinais de pontuação de acordo com a aparência das palavras em cada frase. O código a seguir conta o número de vezes que diferentes caracteres aparecem em uma frase. Dentre eles, a taxa de cobertura do personagem 3750, personagem 900 e personagem 648 em notícias 20w é próxima a 99%, o que é provável que seja pontuação.

from collections import Counter
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse = True)

print(word_count[0])

print(word_count[1])

print(word_count[2])

('900', 99)

('3750', 99)

('648', 96)

2.3 Conclusão da análise de dados

Por meio da análise acima, podemos tirar as seguintes conclusões:

  1. O número médio de caracteres contidos em cada item de notícia na pergunta é 1000, e alguns personagens de notícias são mais longos;
  2. A distribuição das categorias de notícias nas questões da competição é desigual, o tamanho da amostra de notícias de ciência e tecnologia é próximo a 4w e o tamanho da amostra de notícias da constelação é inferior a 1k;
  3. As questões do concurso consistem em 7000-8000 caracteres no total;

Por meio da análise de dados, também podemos tirar as seguintes conclusões:

  1. O número médio de caracteres por notícia é grande e pode precisar ser truncado
  2. Devido ao desequilíbrio das categorias, isso afetará seriamente a precisão do modelo;

Acho que você gosta

Origin blog.csdn.net/bosszhao20190517/article/details/107520201
Recomendado
Clasificación