预训练词嵌入导入文本分类任务——GLOVE模型
在深度学习中,词嵌入是文本模型中强大的组成部分。在应用中十分常见的做法是,先使用例如word2vec模型在大量无标记问版中训练出的词向量,然后在后续的任务(例如有监督的文件分类任务)中使用这些词向量。
使用无监督方法从头训练词向量通常需要极大的语料库。在实践中,我们使用预训练的词嵌入,这些词嵌入是从巨大语料库上训练的,可以通过网络获取。
在本文中,我们将展示如何将TensorFlow预训练的词嵌入应用在一个简单的文本分类任务中。并借此机会使用在深度学习应用中强大的组件,这些组件在自然语言理解中更加强大且不可或缺:双向RNN层和门限递归单元。
本项目需要下载Common Crawl向量(840B个符号),进而推进本次示例。预训练向量的信息请参考网页项目网页(http://nlp.stanford.edu/projects/glove/)
具体解释见代码注释
代码如下:
import zipfile
import numpy as np
import tensorflow as tf
path_to_glove = "glove/glove.840B.300d.zip"
PRE_TRAINED = True
GLOVE_SIZE = 300
batch_size = 128
embedding_dimension = 64
num_classes = 2
hidden_layer_size = 32
times_steps = 6
# 创建模拟数据
digit_to_word_map = {
0: "PAD_TOKEN", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"}
even_sentences = []
odd_sentences = []
seqlens = []
for i in range(10000):
rand_seq_len = np.random.choice(range(3, 7)) # 在3-6范围内抽取一个随机数,作为生成句子的长度
seqlens.append(rand_seq_len) # 将抽取的随机数添加至末尾
rand_odd_ints = np.random.choice(range(1, 10, 2), rand_seq_len) # 在1-9之间获取数量为rand_seq_len的奇数
rand_even_ints = np.random.choice(range(2, 10, 2), rand_seq_len) # 在2-9之间获取数量为rand_seq_len的偶数
# (个人认为应该改为range(0, 10, 2),但问题不大)
if rand_seq_len < 6: # 若长度不足6位,为了统一长度至6位,在末尾补0
rand_odd_ints = np.append(rand_odd_ints, [0] * (6 - rand_seq_len))
rand_even_ints = np.append(rand_even_ints, [0] * (6 - rand_seq_len))
# 原文中even_sentences与rand_even_ints的对应关系是反的,此处为调整后的结果
even_sentences.append(" ".join([digit_to_word_map[r] for r in rand_even_ints]))
odd_sentences.append(" ".join([digit_to_word_map[r] for r

在深度学习中,词嵌入是文本模型的强大组成部分。实践中常使用预训练词嵌入。本文展示如何将TensorFlow预训练的词嵌入应用于简单文本分类任务,还会用到双向RNN层和门限递归单元,项目需下载Common Crawl向量,示例参考相关书籍。
最低0.47元/天 解锁文章
6100

被折叠的 条评论
为什么被折叠?



