概述
一、RNN模型 与 NLP应用 —— 数据预处理
- 前言
- 数据处理简介:
- 文本处理的步骤(1.-5.):
- 使用逻辑回归(LR)训练情感分类: - 效果不好
- Simple RNN
前言
本文为 王树森教授的《RNN模型与NLP应用》授课学习笔记
数据处理简介:
主要为文本数据的处理过程. 文本数据包含数值化描述(Numeric Features), 和类别化描述(Categorical Features).
数值化描述如年龄, 数值之间是有大小关系的, 比如50岁比30岁大.
类别化描述如性别、国籍, 需要转化为数值化描述, 才能被计算机处理.
类别化描述使用one-hot编码方式, 可以避免大小之分, 其中0作为保留编码, 用于表示缺失的或者未知的数据. one-hot向量的长度由类别数量决定, 且one-hot编码形成的输入矩阵非常稀疏, 因此存储和计算效率低.
文本处理的步骤(1.-5.):
-
Tokenization(Text to Words) - 单词分割
词分割, 将文本分割成单独的序列词汇 Token.
要注意: 大写是否要转为小写(Apple or apple);移除断句符, the、a、of等;错误拼写修正(goood or good).
-
Build Dictionary – 统计频率
即计算每个单词出现的频率. 然后按照词频由高到低进行排序. 排序后, 每个单词的索引, 可以用于表示该单词. 文本中单词的集合, 被称为词汇表, vocabulary.保留词汇表中的高频词, 删除低频词, 因为低频词有可能是名字、错误拼写. 另一方面, 去掉低频词, 可以有效降低词汇表one-hot编码的维度, 减小overfiting的可能. 由于去掉了低频词, 文本词分割后, 进行one-hot编码时, 会出现词汇表中没有的词(如被去掉的低频词), 可以忽略或者用0编码.
-
One-Hot Encoding
将文本, 转为用词汇表索引表示的sequence, 如有必要, 将索引进一步转为one-hot 编码, 编码后每个单词都是vocabulary个维度.
-
Align Sequences – 对齐 Sequences
由于不同的训练样本(文本)有长有短, 它们转为sequence后也有长有短. 为了把所有的文本存储在tensor中, 必须要求所有文本都一样长.
设置一个固定长度, 如果长于这个长度的文本, 截取开头或者末尾; 如果短于这个长度的文本, 用0补齐.
-
Word Embedding: word to vector
one-hot 编码: 稀疏且太长
由于one-hot的编码方式, 具有稀疏、效率低的特点, 所以进一步进行转化word embedding:
其中, e i e_i ei为第 i i i个单词的one-hot编码, d d d为设置的词向量维度(为超参数), v v v为词汇表的长度, P P P是可学习的参数矩阵, x i x_i xi为词向量.
如果 e i e_i ei中第3个元素为1, 则x_i就是 P T P^T PT中的第3列(即P^T的每一列都是词向量). 所以 P P P的每一行为一个词向量 x i x_i xi. 用 P P P对 e i e_i ei进行二次编码, 大大降低了 e i e_i ei的维度.
参数矩阵
P
P
P是从训练文本中学习出来的, 所以
P
P
P是带有感情色彩的特征提取矩阵. 如果正面词的one-hot经过矩阵映P射得到的词向量
x
i
x_i
xi为二维向量, 则词性相同的词都分布在一起, 并且词性相反的词距离很远, 中性词分布在中间且远离褒义词和负面词.
使用逻辑回归(LR)训练情感分类: - 效果不好
from keras.models import Sequential # Sequential 为将神经网络的层按顺序搭起来
from keras.layers import Flatten, Dense, Embedding
embedding_dim = 8
word_num = 20
model = Sequential()
model.add(Embedding(vocabulary, embedding_dim, input_length=word_num))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid')) # 输出0表示负面评价, 1表示正面评价
model.summary()
# word_num 表示截取每段评论的最后20个单词
# vocabulary表示单词表,所有评论中共出现了10000个单词,也是one-hot的维度
# embedding_dim表示词向量的大小=8, 为超参数
# 映射矩阵P的参数量 = v * embedding_dim = 10000 * 8
# 至此, 这20个单词中的每个单词从10000维的ont-hot, 变成了8维的词向量
# 即维数通过矩阵P的映射, 从20*10000 变成了 20*8
from keras import optimizers
epochs = 50
model.compile(optimizer=optimizers.RMSprop(lr=0.0001),
loss='binary_crossentropy', metrics=['acc'])
history = model.fit(x_train, y_train, epochs=epochs,
batch_size=32, validation_data=(x_vaild, y_vaild))
# 让 x_train 去拟合 x_vaild
# x_train: 共抽样20000条电影评论, 每条评论20个单词, 所以size=20000*20
# x_vaild: 共抽样5000条电影评论, 每条评论20个单词, 所以size=5000*20
loss_and_acc = model.evaluate(x_test, labels_test)
Simple RNN
FCN和ConvNet的限制: one-to-one模型, 一个输入对一个输出
- 一次性输入的是整个样本数据
- 固定输入和输出
RNN为 many-to-one 或者 many-to-many 输入和输出的长度不固定. RNN适合小规模问题可以, 大规模问题需要用Transformer. Simple RNN的详情见: 二、RNN模型 与 NLP应用 —— Simple RNN.
最后
以上就是认真未来为你收集整理的一、RNN模型 与 NLP应用 —— 数据预处理前言数据处理简介:的全部内容,希望文章能够帮你解决一、RNN模型 与 NLP应用 —— 数据预处理前言数据处理简介:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复