Clasificación de texto de noticias PNL de entrada de base cero_Task2

Clasificación de texto de noticias PNL de entrada de base cero_Task2

Lo principal que se debe hacer en Taks2 es explorar y comprender la ley de distribución de los datos de noticias. Aquí es principalmente para reproducir y explicar el código.
1. Importar módulos de terceros

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter     # python中自带的计数器

2. Leer el conjunto de formación, aquí importé el conjunto de formación completo

train_df = pd.read_csv(r'D:\Users\Felixteng\Documents\Pycharm Files\Nlp\data\train_set.csv', sep='\t')
train_df.head()

Inserte la descripción de la imagen aquí
Se puede encontrar que los datos se componen principalmente de dos partes: 'texto' y 'etiqueta'. El texto está separado por espacios.

3. Análisis de la longitud de las oraciones

'''
数据中每行句子的字符使用空格进行隔开,所以可以直接统计单次的个数来得到每个句子的长度
%pylab inline 是jupyternotebook中用于调试的的魔法函数,pycharm中用回plt.show()即可
'''
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))   # text数据按空格分割后计数
print(train_df['text_len'].describe())  # 对每个句子的长度做统计性描述

Inserte la descripción de la imagen aquí

Se puede ver que el texto de datos es más largo, cada oración se compone de 907 caracteres en promedio, la longitud de oración más corta es 2 y la longitud de oración más larga es 57921.

4. Dibuja un histograma con la longitud de una oración.

plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
sns.distplot(train_df['text_len'], axlabel='Text char count', kde=False, bins=200)

Inserte la descripción de la imagen aquí
5. Realizar estadísticas de distribución para las categorías del conjunto de datos y contar específicamente el número de muestras para cada tipo de noticia.

train_df['label'].value_counts().plot(kind='bar')
plt.xlabel('category')

Inserte la descripción de la imagen aquí
Se puede ver que las categorías del conjunto de datos están distribuidas de manera desigual. El conjunto de entrenamiento tiene la mayor cantidad de noticias de tecnología (casi 4W), seguido de noticias de bolsa, y la menor es noticias de constelaciones (menos de 1K)
. La relación correspondiente entre las etiquetas en el conjunto de datos es la siguiente
{'科技': 0, 'Acciones': 1, 'Deportes': 2, 'Entretenimiento': 3, 'Actualidad': 4, 'Sociedad': 5, 'Educación': 6,
'Finanzas': 7, 'Mobiliario': 8, 'Juego': 9, 'Propiedad': 10, 'Moda': 11, 'Lotería': 12, 'Constelación': 13}

6. Estadísticas de distribución de personajes, contando el número de veces que aparece cada personaje

# all_lines = ' '.join(list(train_df['text']))    # 将所有text用空格连接起来
# word_count = Counter(all_lines.split(" "))
# word_count = sorted(word_count.items(), key=lambda d: d[1], reverse=True)

Debido a la computadora, informé el error de memoria insuficiente: MemoryError. Aumentó la memoria en ejecución de pycharm, pero aún no se puede resolver.

7. Puntuación inversa

train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
'''
set()函数表示创建一个集合,特点是集合内不会有重复的元素
text_unique可以理解成一句话中所有不重复的字符用空格连接而成的单元句子
'''
all_lines = ' '.join(list(train_df['text_unique']))     # 这里把所有去重后的句子用空格连接
word_count = Counter(all_lines.split(' '))  # 去重以后不报内存不足的错误了
'''
Counter()函数返回的是一个字典,包括了元素及其出现的次数
'''
word_count = sorted(word_count.items(), key=lambda d: int(d[1]), reverse=True)
'''
sorted(iterable, key, reverse)
    iterable:可迭代对象;
    key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,
        指定可迭代对象中的一个元素进行排序,这里取字典中的第二个元素,也就是出现次数来进行排序;
    reverse:排序规则,True-降序/False-升序(默认)
'''
print(word_count[0])
print(word_count[1])
print(word_count[2])
print(word_count[3])

Se encuentra que los caracteres 3750, 900, 648 tienen una alta tasa de cobertura y es probable que sean signos de puntuación.

8. Cuente los personajes que aparecen con mayor frecuencia en cada tipo de noticia, primero clasifique el conjunto de datos según la etiqueta y cree una función para clasificar etiquetas

def select_label(df, num):
    df_num = df[df['label'] == num]
    return df_num

Tomemos, por ejemplo, los personajes que aparecen con más frecuencia en las noticias de tecnología de estadísticas.

df_0 = select_label(train_df, 0)
all_lines_0 = ' '.join(list(df_0['text']))
word_count_0 = Counter(all_lines_0.split(' '))
word_count_0 = sorted(word_count_0.items(), key=lambda d: d[1], reverse=True)
print(word_count_0[0])

Inserte la descripción de la imagen aquí
Se puede saber que 3750 caracteres aparecen más en ciencia y tecnología.

Si le resulta problemático recorrer uno por uno, puede crear una función para clasificar los datos por etiqueta y usar lambda para recorrer

def top_count(x):
    all_lines = ' '.join(list(x))
    word_count = Counter(all_lines.split(' '))
    word_count = sorted(word_count.items(), key=lambda d: int(d[1]), reverse=True)
    return word_count[0]

Esta tarea es principalmente para explorar datos de texto de noticias y sentar las bases para la próxima tarea de clasificación de texto utilizando el aprendizaje automático.

Supongo que te gusta

Origin blog.csdn.net/Baby1601tree/article/details/107528829
Recomendado
Clasificación