引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)( 五 )
import keras.backend as K from keras.models import Sequential from keras.layers import Dense, Embedding, Lambda# build CBOW architecture cbow = Sequential() cbow.add(Embedding(input_dim=vocab_size, output_dim=embed_size, input_length=window_size*2)) cbow.add(Lambda(lambda x: K.mean(x, axis=1), output_shape=(embed_size,))) cbow.add(Dense(vocab_size, activation='softmax')) cbow.compile(loss='categorical_crossentropy', optimizer='rmsprop')# view model summary print(cbow.summary())# visualize model structure from IPython.display import SVG from keras.utils.vis_utils import model_to_dotSVG(model_to_dot(cbow, show_shapes=True, show_layer_names=False, rankdir='TB').create(prog='dot', format='svg'))如果你对上述深度学习模型的形象化仍有困难 。 可以看看下图:
训练模型
在完整的语料库上运行这个模型需要相当多的时间 , 所以我只运行了5个epochs 。 你可以利用以下代码 , 并在必要时训练更多的时间 。
for epoch in range(1, 6): loss = 0. i = 0 for x, y in generate_context_word_pairs(corpus=wids, window_size=window_size, vocab_size=vocab_size): i += 1 loss += cbow.train_on_batch(x, y) if i % 100000 == 0: print('Processed {} (context, word) pairs'.format(i))print('Epoch:', epoch, '\tLoss:', loss) print()Epoch: 1 Loss: 4257900.60084 Epoch: 2 Loss: 4256209.59646 Epoch: 3 Loss: 4247990.90456 Epoch: 4 Loss: 4225663.18927 Epoch: 5 Loss: 4104501.48929注意:运行这个模型是计算量很大的 , 如果使用GPU训练 , 会好一点 。 我在AWS的**p2上训练过这个 。 用的是Tesla K80 GPU , 它花了我近1.5小时 , 只有5个epochs!
一旦这个模型被训练好 , 相似的单词应该就有相似的基于嵌入的权值 , 我们可以测试一下相似性 。
获取词嵌入
要为整个词汇表获取词嵌入 , 可以利用下面的代码从嵌入层提取 。 我们不接受位置为0的嵌入 , 因为它属于 (PAD), 这并不是一个真正的单词 。
weights = cbow.get_weights()[0] weights = weights[1:] print(weights.shape)pd.DataFrame(weights, index=list(id2word.values())[1:]).head()可以清楚地看到 , 正如前面的输出所描述的 , 每个单词都有一个dense的大小为“(1x100)”的嵌入 。 让我们尝试根据这些嵌入为感兴趣的特定单词找到一些上下文相似的单词 。 为此 , 我们基于dense的嵌入向量 , 在我们的词汇表中建立一个成对的距离矩阵 , 然后根据最短的欧氏距离找出感兴趣的每个单词的n个最近邻 。
from sklearn.metrics.pairwise import euclidean_distances# compute pairwise distance matrix distance_matrix = euclidean_distances(weights) print(distance_matrix.shape)# view contextually similar words similar_words = {search_term: [id2word[idx] for idx in distance_matrix[word2id[search_term]-1].argsort()[1:6]+1] for search_term in ['god', 'jesus', 'noah', 'egypt', 'john', 'gospel', 'moses','famine']}similar_words
推荐阅读
- 引领时尚新时代|她是饶雪漫书中的模特,和鹿晗在一起被赞般配,笑起来碾压林允!
- 引领时尚新时代|传闻她被渣男骗钱骗大肚子,无奈生下孩子给母亲抚养,气质美上天
- 引领时尚新时代|她是典型中国好媳妇,却嫁给相识不到20天的男友,穿搭霸气侧漏
- 引领时尚新时代|她从小就被亲爸说是捡来的,出道10年没谈过恋爱,美得让人着迷
- 「宁静」宁静不管穿了个啥都能引领时髦,嫌T恤配牛仔裤不够炫,再加薄纱
- 引领先锋|扔员工证的工厂到底啥来头?营收超三千亿,与富士康、伟创力齐名
- 指数债券|美债收益率曲线的陡平之辨:基于供需视角的分析
- 新京报|摩登日记|引领潮流的时尚偶像麦当娜
- 山东沂水提倡彩礼费1万以内|临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
- 【山东沂水提倡彩礼费1万以内】临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
