embedding(keras,word2vec)
一、keras中的Tokenizer
tf.keras.preprocessing.text.Tokenizer(
num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', lower=True,
split=' ', char_level=False, oov_token=None, document_count=0, **kwargs
)
1.参数
- num_words: 需要保留的最大词数,基于词频。只有最常出现的 num_words 词会被保留。
- filters: 一个字符串,其中每个元素是一个将从文本中过滤掉的字符。默认值是所有标点符号,加上制表符和换行符,减去
'
字符。 - lower: 布尔值。是否将文本转换为小写。
- split: 字符串。按该字符串切割文本。
- char_level: 如果为 True,则每个字符都将被视为标记。
- oov_token: 如果给出,它将被添加到 word_index 中,并用于在 text_to_sequence 调用期间替换词汇表外的单词。
默认情况下,删除所有标点符号,将文本转换为空格分隔的单词序列(单词可能包含 '
字符)。 这些序列然后被分割成标记列表。然后它们将被索引或向量化。
‘0’是不会被分配给任何单词的保留索引。
2.类方法
-
fit_on_texts(texts)
- texts:要用以训练的文本列表
-
texts_to_sequences(texts)
-
texts:待转为序列的文本列表
-
返回值:序列的列表,列表中每个序列对应于一段输入文本
-
-
texts_to_sequences_generator(texts)
-
本函数是texts_to_sequences的生成器函数版
-
texts:待转为序列的文本列表
-
返回值:每次调用返回对应于一段输入文本的序列
-
-
texts_to_matrix(texts, mode):
-
texts:待向量化的文本列表
-
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’
-
返回值:形如(len(texts), nb_words)的numpy array
-
-
fit_on_sequences(sequences):
- sequences:要用以训练的序列列表
-
sequences_to_matrix(sequences):
-
sequences:待向量化的序列列表
-
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’
-
返回值:形如(len(sequences), nb_words)的numpy array
-
3.属性
- word_counts:字典,将单词(字符串)映射为它们在训练期间出现的次数。仅在调用fit_on_texts之后设置。
- word_docs: 字典,将单词(字符串)映射为它们在训练期间所出现的文档或文本的数量。仅在调用fit_on_texts之后设置。
- word_index: 字典,将单词(字符串)映射为它们的排名或者索引。仅在调用fit_on_texts之后设置。
- document_count: 整数。分词器被训练的文档(文本或者序列)数量。仅在调用fit_on_texts或fit_on_sequences之后设置。
4.例子
from keras.preprocessing.text import Tokenizer
texts = ['今天天气真好!', '明天天气会更好。', '今天是程序员节~']
My_Tokenizer = Tokenizer(char_level=True, oov_token='UNK')
My_Tokenizer.fit_on_texts(texts)
print(My_Tokenizer.word_index)
print(My_Tokenizer.texts_to_sequences(texts[2]))
# 输出
# {'UNK': 1, '天': 2, '今': 3, '气': 4, '好': 5, '真': 6, '!': 7, '明': 8, '会': 9, '更': 10, '。': 11, '是': 12, '程': 13, '序': 14, '员': 15, '节': 16, '~': 17}
# [[3], [2], [12], [13], [14], [15], [16], [17]]
二、keras中的embedding层
keras.layers.embeddings.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
嵌入层将正整数(下标)转换为具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
Embedding层只能作为模型的第一层
1.embedding层介绍
参数
-
input_dim:大或等于0的整数,字典长度,即输入数据最大下标+1
-
output_dim:大于0的整数,代表全连接嵌入的维度
-
embeddings_initializer: 嵌入矩阵的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializer
-
embeddings_regularizer: 嵌入矩阵的正则项,为Regularizer对象
-
embeddings_constraint: 嵌入矩阵的约束项,为Constraints对象
-
mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用递归层处理变长输入时有用。设置为True的话,模型中后续的层必须都支持masking,否则会抛出异常。如果该值为True,则下标0在字典中不可用,input_dim应设置为|vocabulary| + 2。
-
input_length:当输入序列的长度固定时,该值为其长度。如果要在该层后接Flatten层,然后接Dense层,则必须指定该参数,否则Dense层的输出维度无法自动推断。
输入输出
- 输入:形如(batch_size,sequence_length)的2D张量
- 输出:形如(batch_sieze, sequence_length, output_dim)的3D张量
keras中的embedding层并不是进行矩阵相乘,而是进行类似于索引查找的操作来生成词向量。即生成一个(input_dim,output_dim)形状的矩阵,然后在此矩阵中按位置查找对应的词向量输出(sequence_length,output_dim)形状的矩阵。
2.word2vec词向量的出处
三层的word2vec模型中有输入层权重和输出层权重,词向量就是这两者的单一或组合的表现形式。即:
A. 只使用输入侧的权重
B. 只使用输出侧的权重
C. 同时使用两个权重
方案 A 和方案 B 只使用其中一个权重。而在采用方案 C 的情况下,根据如何组合这两个权重,存在多种方式,其中一个方式就是简单地将这两个权重相加。就 word2vec(特别是 skip-gram 模型)而言,最受欢迎的是方案 A。许多研究中也都仅使用输入侧的权重 Win 作为最终的单词的分布式表示。
3.使用word2ve初始权重
from keras.models import Sequential
from keras.layers import Embedding
import numpy as np
from gensim.models import word2vec
# 加载模型
model_name = 'Domain-Word2vec.model'
# 嵌入向量维度
Embedding_dim = 100
embedding_model = word2vec.Word2Vec.load(model_name)
word2idx = {'PAD': 0}
# 所有词对应的嵌入向量 [(word, vector)]
vocab_list = [(k, embedding_model.wv[k]) for k, v in embedding_model.wv.vocab.items()]
# [len(vocab)+1, embedding_dim] '+1'是增加了一个'PAD'
embeddings_matrix = np.zeros((len(embedding_model.wv.vocab.items()) + 1,\
embedding_model.vector_size))
# word2idx 字典
for i in range(len(vocab_list)):
word = vocab_list[i][0]
word2idx[word] = i + 1
embeddings_matrix[i + 1] = vocab_list[i][1]
# 初始化keras中的Embedding层权重
embedding = Embedding(input_dim=len(embeddings_matrix),
output_dim=Embedding_dim,
weights=[embeddings_matrix], # 预训练参数
trainable=False)
model = Sequential()
model.add(embedding)
参考:
https://wizardforcel.gitbooks.io/keras-cn/content/docs/layers/embedding_layer.html
https://blog.csdn.net/yyhhlancelot/article/details/86534793
https://blog.csdn.net/comeonfly666/article/details/115946469