引领先锋|基于深度学习的文本数据特征提取方法之Word2Vec(一)( 八 )
训练模型
在我们的完整语料库上运行模型需要相当多的时间 , 但比CBOW模型要少 。 所以我只运行了5个epochs 。 你可以利用以下代码 , 并在必要时训练更长的时间 。
for epoch in range(1, 6): loss = 0 for i, elem in enumerate(skip_grams): pair_first_elem = np.array(list(zip(*elem[0]))[0], dtype='int32') pair_second_elem = np.array(list(zip(*elem[0]))[1], dtype='int32') labels = np.array(elem[1], dtype='int32') X = [pair_first_elem, pair_second_elem] Y = labels if i % 10000 == 0: print('Processed {} (skip_first, skip_second, relevance) pairs'.format(i)) loss += model.train_on_batch(X,Y)print('Epoch:', epoch, 'Loss:', loss)Epoch: 1 Loss: 4529.63803683 Epoch: 2 Loss: 3750.71884749 Epoch: 3 Loss: 3752.47489296 Epoch: 4 Loss: 3793.9177565 Epoch: 5 Loss: 3716.07605051模型训练好之后 , 相似的单词应该有相似的基于嵌入的权重 。
得到词嵌入
要为整个词汇表获取单词嵌入 , 可以利用下面的代码从嵌入层提取相同的单词 。 请注意 , 我们只对目标单词嵌入感兴趣 , 因此我们将从 word_model嵌入层提取嵌入 。 我们没有在位置0处进行嵌入 , 因为词汇表中没有一个单词的数字标识符为0 , 我们忽略了它 。
merge_layer = model.layers[0] word_model = merge_layer.layers[0] word_embed_layer = word_model.layers[0] weights = word_embed_layer.get_weights()[0][1:]print(weights.shape) pd.DataFrame(weights, index=id2word.values()).head()可以清楚地看到 , 正如前面的输出所描述的 , 每个单词都有一个dense的大小为(1x100)的嵌入 , 类似于我们从CBOW模型中得到的结果 。 现在让我们对这些dense的嵌入向量使用欧氏距离度量来为词汇表中的每个单词生成成对的距离度量 。 然后 , 我们可以根据最短的欧氏距离找到感兴趣的每个单词的n个最近邻 , 这与我们在CBOW模型的嵌入中所做的类似 。
from sklearn.metrics.pairwise import euclidean_distancesdistance_matrix = euclidean_distances(weights) print(distance_matrix.shape)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(12424, 12424) {'egypt': ['pharaoh', 'mighty', 'houses', 'kept', 'possess'], 'famine': ['rivers', 'foot', 'pestilence', 'wash', 'sabbaths'], 'god': ['evil', 'iniquity', 'none', 'mighty', 'mercy'], 'gospel': ['grace', 'shame', 'believed', 'verily', 'everlasting'], 'jesus': ['christ', 'faith', 'disciples', 'dead', 'say'], 'john': ['ghost', 'knew', 'peter', 'alone', 'master'], 'moses': ['commanded', 'offerings', 'kept', 'presence', 'lamb'], 'noah': ['flood', 'shem', 'peleg', 'abram', 'chose']}从结果中可以清楚地看到 , 对于感兴趣的每个单词 , 许多相似的单词都是有意义的 , 并且与我们的CBOW模型相比 , 我们获得了更好的结果 。 现在我们用t-SNE来可视化一下 。
from sklearn.manifold import TSNEwords = sum([[k] + v for k, v in similar_words.items()], []) words_ids = [word2id[w] for w in words] word_vectors = np.array([weights[idx] for idx in words_ids]) print('Total words:', len(words), '\tWord Embedding shapes:', word_vectors.shape)tsne = TSNE(n_components=2, random_state=0, n_iter=10000, perplexity=3) np.set_printoptions(suppress=True) T = tsne.fit_transform(word_vectors) labels = wordsplt.figure(figsize=(14, 8)) plt.scatter(T[:, 0], T[:, 1], c='steelblue', edgecolors='k') for label, x, y in zip(labels, T[:, 0], T[:, 1]): plt.annotate(label, xy=(x+1, y+1), xytext=(0, 0), textcoords='offset points')
推荐阅读
- 引领时尚新时代|她是饶雪漫书中的模特,和鹿晗在一起被赞般配,笑起来碾压林允!
- 引领时尚新时代|传闻她被渣男骗钱骗大肚子,无奈生下孩子给母亲抚养,气质美上天
- 引领时尚新时代|她是典型中国好媳妇,却嫁给相识不到20天的男友,穿搭霸气侧漏
- 引领时尚新时代|她从小就被亲爸说是捡来的,出道10年没谈过恋爱,美得让人着迷
- 「宁静」宁静不管穿了个啥都能引领时髦,嫌T恤配牛仔裤不够炫,再加薄纱
- 引领先锋|扔员工证的工厂到底啥来头?营收超三千亿,与富士康、伟创力齐名
- 指数债券|美债收益率曲线的陡平之辨:基于供需视角的分析
- 新京报|摩登日记|引领潮流的时尚偶像麦当娜
- 山东沂水提倡彩礼费1万以内|临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
- 【山东沂水提倡彩礼费1万以内】临沂沂水倡导婚俗简约 举办集体婚礼引领风尚
