使用tf.keras循环神经网络-实现航空评论数据的分类模型(tensorflow2.0)

RNN循环神经网络:

一个序列不仅与当前的输出有关,而且与面前的输出也有关。RNN主要是处理“序列数据”。

在传统的神经网络模型中,输入层->隐藏层->输出层,层与层之间是全连接的。

在RNN模型中:隐藏层之间的节点不再是无连接的而是有连接的,即:隐藏层的输入不仅包括输入层的输出,还包括上一刻隐藏层的输出。

具体表现形式为:RNN会对当前的信息进行记忆并应用于当前输出的计算中。
在这里插入图片描述

长短期记忆网络(LSTM,Long Short-Term Memory):

  1. LSTM 可以把几个时间之前的状态,直接传递到某一个状态中去
  2. LSTM通过“门”对通过的信息进行控制:“门”就是一种让信息选择通过的方法。
  3. LSTM可以通过门让信息完全通过、不通过、通过一部分。

GRU(门限循环单元)

  1. 与LSTM相比,GRU结构更简单,它有一个更新门——>决定了融合比例(内部状态,输入的state状态)
  2. GRU与LSTM相比,建构简单,计算少,效果相当。

Keras 支持RNN的各种变体,Layer.LSTM ,Layer.GRU.

要理解,RNN网络的输入是什么形式?是序列。
序列的输入是什么形式?有三层,第一层是batch,第二层是序列的长度,第三层是序列的维度。

import tensorflow as tf
from tensorflow import keras

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data=pd .read_csv('./dataset/Tweets.csv')#. means 当前目录下
#print(data.head())
data= data[['airline_sentiment','text']]#get 关注的两列
#print(data.head())
#print('评价的种类:\r\n',data.airline_sentiment.unique()) #康康有多少的评价
#print('各个评价种类的数量:\r\n',data.airline_sentiment.value_counts()) #康康有多少的评价

#wish Positive and Negative same number
data_p=data[data.airline_sentiment=='positive']
data_n=data[data.airline_sentiment=='negative']
data_n=data_n.iloc[:len(data_p)]

#print('positive enth: \r\n',len(data_p),'\r\n negative lenth: \r\n',len(data_n))

data=pd.concat([data_n,data_p])
#print('Train data: \r\n',data.head())
#print('Train data Lenth: \r\n',len(data))

#进行乱序
data=data.sample(len(data))
#print('乱序Train data: \r\n',data.head())
#-------------------------------------------------------------------------------#
data['review']=(data.airline_sentiment=='positive').astype('int')
del data['airline_sentiment']
#print('01_乱序_Train data: \r\n',data.head())
#--------------------------------------------------------------------------------#
#~~~~处理文本
'''
tf.keras.layers.Embedding #把文本向量化---文本规范化
把特殊字符去掉,只保留英文单词
'''
#--------------------------------------------------------------------------------#
import re
token= re.compile('[A-Za-z]+|[!?,.()]') #提取出 所有英文单词和标点符号
def reg_text(text):
    new_text= token.findall(text)
    new_text=[word.lower() for word in new_text]   #使用列表推导式 把所有的英文单词变成小写
    return new_text

data['text'] = data.text.apply(reg_text)
print('文本提取小写字母之后_01_乱序_Train data: \r\n',data.head())

#把英文单词对应成正数缩引 --->我们要知道这里面有多少个英文单词--->把重复值去掉 --->用Set
word_set = set()
for text in data.text:
    for word in text:
        word_set.add(word)
#print(word_set)
print(len(word_set))
word_list= list(word_set)
print('康康word_list是个啥\r\n',word_list)
print('随便取一个单词 --例如 spending的位置:\r\n',word_list.index('spending'))

#字典
word_index= dict((word,word_list.index(word)+1) for word in word_list)
print('康康word_index是个啥\r\n',word_index)

#把每一行文本变成 正数缩引
data_ok = data.text.apply(lambda x: [word_index.get(word,0) for word in x])
print('最终处理好的data: \r\n',data_ok.head())

print('最终处理好的data 的 第一条评论: \r\n',data_ok.iloc[0])

#填充评论 到相同的长度:
maxlen=max(len(x) for x in data_ok)
print('最终处理好的data 的 最长的评论的长度: \r\n', maxlen)

#计算 有多少个英文单词
max_word =len(word_set)+1
print('计算 有多少个英文单词: \r\n', max_word)

#使用keras填充
data_ok = keras.preprocessing.sequence.pad_sequences(data_ok.values,maxlen=maxlen)
print('data_ok的长度: \r\n',data_ok.shape)

#目标值:
print('目标值:评论: \r\n',data.review.values)

# -----------------------------------------------------------------------------------------
#初始化model
model = tf.keras.Sequential()

# Embedding编码 :把文本映射为一个密集向量
# 把 整数列表 -映射为- 长度为50的密集向量
model.add(tf.keras.layers.Embedding(max_word, 50, input_length=maxlen)) # # 映射成的密集向量的个数 # 输入文本的长度

# 添加LSTM层
#
model.add(tf.keras.layers.LSTM(64))

# 添加dense全连接层
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

model.summary()

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['acc']
              )

model.fit(data_ok, data.review.values, epochs=10, batch_size=128, validation_split=0.2) # 进行训练 # epochs means 对所有变量进行训练的次数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值