引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)( 七 )


这个和CBOW是一样的 。
构建skip-gram[(target, context), relevancy]生成器
现在开始构建我们的skip-gram生成器了 , 它将像我们前面讨论的那样给我们一对单词和它们的相关性 。 幸运的是 , keras有一个漂亮的skipgrams函数 , 我们不需要像在CBOW中那样手动实现这个生成器 。
注意:函数skipgrams(…)出现在keras.preprocessing.sequence中 。
该函数将一个单词索引序列(整数列表)转换为以下形式的单词元组:
- (word, 在同一个窗口中的word) , 标签1(正样本) 。
- (word , 词汇表中的random word) , 标签0(负样本) 。
from keras.preprocessing.sequence import skipgrams# generate skip-grams skip_grams = [skipgrams(wid, vocabulary_size=vocab_size, window_size=10) for wid in wids]# view sample skip-grams pairs, labels = skip_grams[0][0], skip_grams[0][1] for i in range(10): print("({:s} ({:d}), {:s} ({:d})) -> {:d}".format( id2word[pairs[i][0]], pairs[i][0], id2word[pairs[i][1]], pairs[i][1], labels[i]))(james (1154), king (13)) -> 1 (king (13), james (1154)) -> 1 (james (1154), perform (1249)) -> 0 (bible (5766), dismissed (6274)) -> 0 (king (13), alter (5275)) -> 0 (james (1154), bible (5766)) -> 1 (king (13), bible (5766)) -> 1 (bible (5766), king (13)) -> 1 (king (13), compassion (1279)) -> 0 (james (1154), foreskins (4844)) -> 0可以看到我们已经成功地生成了所需的skip-grams , 还可以根据标签(0或1)清楚地看到哪些是相关的 , 哪些是不相关的 。
构建skip-gram模型结构
现在 , 我们在利用keras来为skip-gram模型构建我们的深度学习架构 。 为此 , 我们的输入将是我们的目标单词和上下文或随机单词对 。 然后传递到一个嵌入层(用随机权重初始化) 。 一旦我们获得了目标词和上下文词的词嵌入 , 我们将它传递到一个合并层 , 在那里我们计算这两个向量的点积 。 然后我们将这个点积值传递给一个dense的sigmoid层 , 该层根据这对单词是上下文相关的还是随机的单词(Y)来预测是1还是0 。 我们将其与实际的关联标签(Y)匹配 , 通过mean_squared_error计算损失 , 并对每个epoch反向传播来更新嵌入层 。 下面的代码向我们展示了我们的模型架构 。
from keras.layers import Merge from keras.layers.core import Dense, Reshape from keras.layers.embeddings import Embedding from keras.models import Sequential# build skip-gram architecture word_model = Sequential() word_model.add(Embedding(vocab_size, embed_size, embeddings_initializer="glorot_uniform", input_length=1)) word_model.add(Reshape((embed_size, )))context_model = Sequential() context_model.add(Embedding(vocab_size, embed_size, embeddings_initializer="glorot_uniform", input_length=1)) context_model.add(Reshape((embed_size,)))model = Sequential() model.add(Merge([word_model, context_model], mode="dot")) model.add(Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid")) model.compile(loss="mean_squared_error", optimizer="rmsprop")# view model summary print(model.summary())# visualize model structure from IPython.display import SVG from keras.utils.vis_utils import model_to_dotSVG(model_to_dot(model, show_shapes=True, show_layer_names=False, rankdir='TB').create(prog='dot', format='svg'))
引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)skip-gram模型的可视化:


推荐阅读