自然言語処理(NLP)の概要(2)

ブログに接続する

V.テキストの感情を認識するモデルを構築する

kaggleユーザーが公開したタイトルデータセットを使用して、タイトルは「皮肉」と「皮肉ではない」に分けられました。「皮肉」は1で表され、「皮肉ではない」は0で表され
ます。目的:テキスト分類子をトレーニングし、文が皮肉かどうかをテストする
最初のステップを意味します。データセットの内部データはjsonに保存され、最初にpython形式に変換する必要があります
ここに画像の説明を挿入します
——————>
ここに画像の説明を挿入します
ステップ2:タグ、テキスト、記事のリンクを抽出しますそれぞれ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'])

ステップ3:テキストの前処理
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語で埋められます

ステップ4:テキストの前処理を改善し、それをトレーニングセットとテストセットに分割して、ニューラルネットワークがトレーニングデータのみを認識し、トークナイザーがトレーニングデータにのみ使用されるようにします。

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)

ステップ5:ネットワークモデルを構築し、埋め込みレイヤー(埋め込み)を使用する

埋め込みレイヤー(埋め込み)役割:風刺文に表示される単語は、「皮肉」の方向に強く傾いて、非皮肉文に表示されます。 「皮肉ではない」方向に強く傾くでしょう。神経ネットワークがロードされ、ますます多くの文が訓練されるとき、訓練された神経ネットワークに文を入力すると、神経ネットワークは感情的になります。判断され、各単語の座標ベクトルが与えられ、次に各単語のベクトルが文の感情的な判断として加算されます。このプロセスは埋め込みです。

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

トレーニング結果:
ここに画像の説明を挿入します
ステップ6:モデルをテストして、新しい文の感情的な色を決定します

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