这里简单记录一下、
我学习NLP原理之后,对其用RNN模型进行一个简单的实现。
RNN模型基本结构:
1.导入训练数据库 , 得到其词语-id的映射表,然后将其转化为id-词语的映射表。
2.基于词频进行统计,构建语料表 ,并将在训练集中出现频率多的词语进行统计,构建新的词语-id的映射表。
3.根据预训练好的词向量库,根据上一步得到的词语-id的映射表构建 id-向量 的映射表。
4. 构建数据生成器,并对数据进行统一化(长的截断,短的补充)
5. 构建RNN模型,类似于CNN模型
6. 设置损失函数,优化器,然后进行训练~
这里直接贴上我关于RNN模型实现的代码:
import os
import warnings
warnings.filterwarnings("ignore")
import tensorflow as tf
import numpy as np
import pandas as pd
import zipfile
import collections
from tensorflow import keras
import matplotlib as mpl
import random
import time
import logging
from pathlib import Path
import matplotlib.pyplot as plt
%matplotlib inline
#载入数据
(train_data,train_labels),(test_data,test_labels) = tf.keras.datasets.imdb.load_data()
# 此时,读进来的数据已经是 id 映射的结果
train_data[0]
#载入词表: 词语 - id 的映射
_word_index = tf.keras.datasets.imdb.get_word_index()
word_index = {
k:(v+3) for k, v in _word_index.items()}#把所有的id往上偏移 3
#几个特殊字符 ,必须这么做,至于为什么 不清楚
word_index['<PAD>'] = 0
word_index['START'] = 1
word_index['UNK'] = 2
#word_index['END'] = 3
# 得到 id - 词语 的映射
index2word = dict([(value, key) for key, value in word_index.items()])
# 按文本长度大小 排序
def sort_by_len(x,y):
x, y = np.asarray(x), np.asarray(y)
idx = sorted(range(len(x)),key =lambda i : len(x[i]))
return x[idx],y[idx]
train_data,train_labels = sort_by_len(train_data,train_labels)
test_data,test_labels = sort_by_len(test_data,test_labels)
# 将 id 映射成 词语 ,构建新的 训练数据集
def write_file(f_path,xs,ys):
with open(f_path,'w',encoding='utf-8') as f:
for x,y in zip(xs,ys):
f.write(str(y)+ '\t'+ ' '.join([index2word[i] for i in x][1:])+'\n')
write_file('./dataset/imdb/train.txt',train_data,train_labels)
write_file('./dataset/imdb/test.txt',test_data,test_labels)
# 构建语料表 ,基于词频进行统计
counter = collections.Counter()
with open('./dataset/imdb/train.txt',encoding='utf-8') as f:
for line in f:
line =line.rstrip() # 去掉以' .'或者'!'的结尾
label,words = line.split('\t')
words =words.split(' ')
counter.update(words