自然语言处理(NLP)入门(二)

接上一个博客

五.打造一个识别文本情感的模型

使用kaggle用户发布的标题数据集,标题已被分成’sarcastic‘和’not sarcastic‘,’sarcastic‘用1表示,’not sarcastic‘用0表示
目的:训练一个文本分类器,测试一句话是否具有讽刺意味
第一步: 数据集内部数据是用json储存的,我们要先转换成python格式
在这里插入图片描述
——————>
在这里插入图片描述
第二步: 将json文件中的标签、文本、文章链接分别提取出来

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'])

第三步: 对文本进行预处理
1.将标签中的所有单词提取出来并对应其标识符

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)

输出所有单词列表及其标识符
在这里插入图片描述
2.把标签中的句子转换成标识序列,并从后面填充0

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

输出:
在这里插入图片描述
整个语料库共26709句话=26709个序列,每个序列填充后有40个单词

第四步: 改进对文本的预处理,分成训练集和测试集,确保神经网络只见过训练数据,确保分词器仅用于训练数据

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)

第五步: 搭建网络模型,并使用嵌入层(Embedding)

嵌入层(Embedding)作用: 出现在讽刺句中的词汇,在‘sarcastic’方向上会有很强的倾斜,出现在非讽刺句中的词汇,在‘not sarcastic’方向上会有很强的倾斜,当加载都神经网络中,训练的句子越来越多时,如果我们把一个句子输入到已经训练好的神经网络时,神经网络会对句子中的每个单词进行情感判断并给出每个单词的坐标向量,再将每个单词的向量相加,作为这句话的情感判断,这过程就是嵌入(Embedding)

#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)

训练结果:
在这里插入图片描述
第六步: 测试模型,判断新句子的情感色彩

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))

预测结果:
在这里插入图片描述

问题:tf.keras.layers.GlobalAvgPool1D()的作用是啥???如何将向量相加???
答:用训练出来的权重对向量进行全局平均池化

猜你喜欢

转载自blog.csdn.net/qq_45234219/article/details/114494467
今日推荐