利用神经网络解决NLP问题【enumerate&one-hot + RNN】_完整项目_CodingPark编程公园

文章介绍

本文讲述
X数据 => enumerate() 利用Key Value 字变数|数变字 ( 🎆这里很耐人寻味)
Y数据 => one-hot
随后分别利用RNN进行学习与测试
本文主要实现 char_rnn 主攻字符级别预测

项目流程

  1. 文本读入
    因为神经网络输入时需要向量形式,但最后呈现还需文字形式,所以这里用一步操作
    👨🏻‍🔬char_to_int = dict((c, i) for i, c in enumerate(chars))          # 字变数
    👩🏻‍🔬int_to_char = dict((i, c) for i, c in enumerate(chars))          # 数变字
  2. 构造训练测试集
    output变成one-hot
    👨🏽‍🔬y = np_utils.to_categorical(y)
  3. 模型建造
  4. 测试
    看看预测效果给了前置的字母以后,预测下一个字母是谁
    ⚠️神经网络X | Y的选定十分重要
    ⚠️铭记一点:本文用100个字符作为X -> 第101个字符为Y(lable)

完整代码

import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.callbacks import ModelCheckpoint
from keras.utils import np_utils


'''




文本读入





'''
raw_text = open('Winston_churchil.txt', encoding='UTF-8-sig').read()            # encoding='UTF-8-sig'去除 \ufeff
# print('raw_text -> ', raw_text)
raw_text = raw_text.lower()

# ------做一些数据调整------
chars = sorted(list(set(raw_text)))
char_to_int = dict((c, i) for i, c in enumerate(chars))     # 字变数   🎆这里很耐人寻味
int_to_char = dict((i, c) for i, c in enumerate(chars))     # 数变字   🎆这里很耐人寻味
# stopword = ['']
print('chars -> ', chars)
print('len(chars) -> ', len(chars))
print('len(raw_text) -> ', len(raw_text))


'''




构造训练测试集





'''
seq_length = 100
x = []
y = []
for i in range(0, len(raw_text)-seq_length):
    given = raw_text[i:i + seq_length]
    predict = raw_text[i+seq_length]
    x.append([char_to_int[char] for char in given])
    y.append(char_to_int[predict])

# 我们可以看看我们做好的数据集的长相
print('x[:3]  ->  ', x[:3])
print('y[:3]  ->  ', y[:3])


# 接下来我们做两件事:
# 我们已经有了一个input的数字表达(index),我们要把它变成LSTM需要的数组格式: [样本数,时间步伐,特征]
# 第二,对于output,我们在Word2Vec里学过,用one-hot做output的预测可以给我们更好的效果,相对于直接预测一个准确的y数值的话

n_patterns = len(x)
n_vocab = len(chars)

# 把x变成LSTM需要的样子
x = numpy.reshape(x, (n_patterns, seq_length, 1))
# 简单normal 到0-1之间  因为这个区域对于函数比较敏感
x = x/float(n_vocab)
# output变成one-hot
y = np_utils.to_categorical(y)

# 预处理结束的结果
print('预处理结束的结果x[0] -> ', x[0])
print('预处理结束的结果y[0] -> ', y[0])



'''





模型建造






'''
model = Sequential()
model.add(LSTM(256, input_shape=(x.shape[1], x.shape[2])))
model.add(Dropout(0.2))
print('x.shape -> ', x.shape)
print('y.shape -> ', y.shape)
print('y.shape[0] -> ', y.shape[0])
print('y.shape[1] -> ', y.shape[1])
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
# 跑模型
model.fit(x, y, nb_epoch=10, batch_size=4056)


'''



测试 - 看看效果




'''
def string_to_index(raw_input):
    res = []
    for c in raw_input[(len(raw_input)-seq_length):]:           # 末尾100个 -> 100+1那个
        res.append(char_to_int[c])
    # print('res   ->    ', res)
    return res



def predict_next(input_array):
    x = numpy.reshape(input_array, (1, seq_length, 1))
    x = x/float(n_vocab)
    y = model.predict(x)
    largest_index = y.argmax()
    return largest_index


def y_to_char(largest_index):
    c = int_to_char[largest_index]
    return c




def generate_article(init, rounds=2):
    in_string = init.lower()
    for i in range(rounds):
        n = y_to_char(predict_next(string_to_index(in_string)))
        in_string = in_string + n
    return in_string



init = 'I am a boy from Beijing. my dream is to go to work in an internet company after graduation. I like pla'
article = generate_article(init)
print()
print()
print('-----------------------预测结果----------------------')
print(article)

结果展示
在这里插入图片描述

👨🏻‍🔬👩🏻‍🔬博士说
在这里插入图片描述

在这里插入图片描述

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 鲸 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值