python Deep learning 学习笔记(5)

本节讲深度学习用于文本和序列

用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet)
与其他所有神经网络一样,深度学习模型不会接收原始文本作为输入,它只能处理数值张量。文本向量化(vectorize)是指将文本转换为数值张量的过程。它有多种实现方法

将文本分割为单词,并将每个单词转换为一个向量

将文本分割为字符,并将每个字符转换为一个向量

提取单词或字符的 n-gram,并将每个 n-gram 转换为一个向量。n-gram 是多个连续单词或字符的集合(n-gram 之间可重叠)

将文本分解而成的单元(单词、字符或 n-gram)叫作标记(token),将文本分解成标记的过程叫作分词(tokenization)。所有文本向量化过程都是应用某种分词方案,然后将数值向量与生成的标记相关联。这些向量组合成序列张量,被输入到深度神经网络中

n-gram 是从一个句子中提取的 N 个(或更少)连续单词的集合。这一概念中的“单词”也可以替换为“字符”
The cat sat on the mat 分解为二元语法(2-gram)的集合
{"The", "The cat", "cat", "cat sat", "sat", "sat on", "on", "on the", "the", "the mat", "mat"}
分解为三元语法(3-gram)的集合
{"The", "The cat", "cat", "cat sat", "The cat sat",
"sat", "sat on", "on", "cat sat on", "on the", "the",
"sat on the", "the mat", "mat", "on the mat"}
这样的集合分别叫作二元语法袋(bag-of-2-grams)三元语法袋(bag-of-3-grams)。这里(bag)这一术语指的是,我们处理的是标记组成的集合。这一系列分词方法叫作词袋(bag-of-words)。词袋是一种不保存顺序的分词方法,因此它往往被用于浅层的语言处理模型,而不是深度学习模型

python Deep learning 学习笔记(5)

将向量与标记相关联的方法
对标记做 one-hot 编码(one-hot encoding)标记嵌入[token embedding,通常只用于单词,叫作词嵌入(word embedding)]

one-hot 编码是将标记转换为向量的最常用、最基本的方法

它将每个单词与一个唯一的整数索引相关联,然后将这个整数索引 i 转换为长度为 N 的二进制向量(N 是词表大小),这个向量只有第 i 个元素是 1,其余元素都为 0 (也可以进行字符级的 one-hot 编码)

Keras one-hot编码Demo

from keras.preprocessing.text import Tokenizer samples = ['The cat sat on the mat.', 'The dog ate my homework.'] # 只考虑前1000个最常见的单词 tokenizer = Tokenizer(num_words=1000) # 构建单词索引 tokenizer.fit_on_texts(samples) # 找回单词索引 word_index = tokenizer.word_index print(word_index) # 将字符串转换为整数索引组成的列表 sequences = tokenizer.texts_to_sequences(samples) print("转换成的索引序列 ", sequences) text = tokenizer.sequences_to_texts(sequences) print("转会的文本 ", text) # 得到 one-hot 二进制表示 one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary') one_num = 0 for items in one_hot_results: for item in items: if item == 1: one_num += 1 print("1的数量为 ", one_num) print(one_hot_results)

结果

python Deep learning 学习笔记(5)

one-hot 编码的一种变体是所谓的 one-hot 散列技巧(one-hot hashing trick),如果词表中唯
一标记的数量太大而无法直接处理,就可以使用这种技巧

将单词散列编码为固定长度的向量,通常用一个非常简单的散列函数来实现

这种方法的主要优点在于,它避免了维护一个显式的单词索引,从而节省内存并允许数据的在线编码,缺点就是可能会出现散列冲突

词嵌入
one-hot 编码得到的向量是二进制的、稀疏的、维度很高的(维度大小等于词表中的单词个数),而词嵌入是低维的浮点数向量。与 one-hot 编码得到的词向量不同,词嵌入是从数据中学习得到的。常见的词向量维度是 256、512 或 1024(处理非常大的词表时)。与此相对,onehot 编码的词向量维度通常为 20 000 或更高。因此,词向量可以将更多的信息塞入更低的维度中

python Deep learning 学习笔记(5)

获取词嵌入有两种方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxdfz.html