Introducción al procesamiento del lenguaje natural (NLP) (2)

Conectarse a un blog

V. Construir un modelo que reconozca las emociones del texto.

Utilizando el conjunto de datos de títulos publicados por los usuarios de kaggle, los títulos se han dividido en 'sarcástico' y 'no sarcástico'. 'Sarcástico' se representa con 1 y 'no sarcástico' se representa con 0.
Propósito: entrenar un clasificador de texto y probar si una oración es irónica Significa el
primer paso: los datos internos del conjunto de datos se almacenan en json, primero debemos convertirlos a formato Python
Inserte la descripción de la imagen aquí
——————>
Inserte la descripción de la imagen aquí
Paso 2: Extraiga las etiquetas, el texto y los enlaces de artículos en el archivo json respectivamente

import json#调用json库
with open('sarcasm.json','r') as f:#用json库加载讽刺标题json文件
    datastors= json.load(f)

sentences=[]#为标题、标签、文章链接创建列表
labels=[]
urls=[]

for item in datastore:#将json文件中对应的所需值加载到python列表中
    sentences.append(item['headline'])
    labels.append(item['is_sarcastic'])
    urls.append(item['article_link'])

Paso 3: Procesamiento previo del texto
1. Extraiga todas las palabras de la etiqueta y corresponda con sus identificadores

from tensorflow.keras.preprocessing.test import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
tokenizer=Tokenizer(ovv_token="<OVV>")
tokenizer.fit_on_texts(sentences)
word_index= tokenizer.word_index
print(word_index)

Genere una lista de todas las palabras y sus identificadores
Inserte la descripción de la imagen aquí
2. Convierta las oraciones en las etiquetas en secuencias de identificación y complete 0 desde el reverso

sequences=tokenizer.texts_to_sequences(sentences)
padded= pad_sequences(sequences,padding='post')
print(padded[0])#打印第一个句子对应的标识列表
print(padded.shape)#显示整个语料库的详情

Resultado: El
Inserte la descripción de la imagen aquí
corpus completo tiene un total de 26709 oraciones = 26709 secuencias, y cada secuencia se llena con 40 palabras.

Paso 4: Mejore el procesamiento previo del texto y divídalo en un conjunto de entrenamiento y un conjunto de prueba para asegurarse de que la red neuronal solo haya visto los datos de entrenamiento y que el tokenizador solo se use para los datos de entrenamiento.

training_sentences=sentences[0:training_size]#设置training_size为20000,则前20000个句子用于训练集
testing_sentences=sentences[training_size:]#20000至后面的句子用于测试集
training_labels=labels[0:training_size]
testing_labels=labels[training_size:]

tokenizer=Tokenizer(num_words=vocab_size,ovv_token="oov_tok")#实例化分词器
tokenizer.fit_on_texts(training_sentences)#让分词器只训练分出来的训练集
word_index= tokenizer.word_index

training_sentences=tokenizer.texts_to_sequences(training_sentences)#创建训练序列
training_padded= pad_sequences(training_sentences,maxlen=max_length,padding=padding_type,truncating=trunc_type)
testing_sentences=tokenizer.texts_to_sequences(testing_sentences)#创建测试序列
testing_padded= pad_sequences(testing_sentences,maxlen=max_length,padding=padding_type,truncating=trunc_type)

Paso 5: Construya un modelo de red y use la capa de incrustación (Incrustación)

Capa de incrustación (Incrustación) Función: las palabras que aparecen en oraciones satíricas tendrán una fuerte inclinación en la dirección de 'sarcástico', apareciendo en oraciones no sarcásticas Vocabulario, no será una fuerte inclinación en la dirección de "no sarcástico". Cuando la red neuronal está cargada y se entrenan más y más oraciones, si ingresamos una oración en la red neuronal entrenada, la red neuronal cambiará Cada palabra en la oración es emocional se juzga y se da el vector de coordenadas de cada palabra, y luego se suman los vectores de cada palabra como el juicio emocional de la oración.Este proceso es incrustado.

#vocab_size:字典大小
#embedding_dim:本层的输出大小,也就是生成的embedding的维数
#input_length:输入数据的维数,因为输入数据会做padding处理,所以一般是定义的max_length
model=tf.kr=eras.Sequential([
    tf.keras.layers.Embedding(vocab_size,embedding_dim,inout_length=max_length),#每个单词的情感方向都会在这里面被一次又一次的学习,#定义矩阵(vocab_size * embedding_dim), 输出(batch_size, max_length, embedding_dim), 将词表表示的句子转化为embedding
    tf.keras.layers.GlobalAvgPool1D(),#将每个单词的向量相加
    tf.keras.layers.Dense(24,activation='relu'),#放入一个普通的深度神经网络中
    tf.keras.layers.Dense(1,activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adma',metrics=['accuracy'])
num_epoch=30
history=model.fit(training_padding,training_labels,epochs=num_epoch,validation_data=(testing_padded,testing_labels),verbose=2)

Resultados del entrenamiento:
Inserte la descripción de la imagen aquí
Paso 6: Pruebe el modelo para determinar el color emocional de la nueva oración

sentence=['geanny starting to fear spiders in the garden might be real',
          'the weather today is bright']
sequences=tokenizer.texts_to_sequences(sentence)
padded= pad_sequences(sentences,maxlen=max_length,padding=padding_type,truncating=trunc_type)
print(model.predict(padded))

resultado del pronóstico:
Inserte la descripción de la imagen aquí

Pregunta: ¿Cuál es el papel de tf.keras.layers.GlobalAvgPool1D () ??? ¿Cómo agregar los vectores ???
Respuesta: Utilice los pesos entrenados para realizar la agrupación promedio global en los vectores

Supongo que te gusta

Origin blog.csdn.net/qq_45234219/article/details/114494467
Recomendado
Clasificación