本文做者:在线实验室javascript
文章结构:java
词向量git
模型应用github
在模型训练后,咱们能够用它作一些预测。预测下一个词:咱们能够用咱们训练过的模型,在得知以前的 N-gram 后,预测下一个词。编程
def infer(use_cuda, params_dirname=None): place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() exe = fluid.Executor(place) inference_scope = fluid.core.Scope() with fluid.scope_guard(inference_scope): # 使用fluid.io.load_inference_model获取inference program, # feed变量的名称feed_target_names和从scope中fetch的对象fetch_targets [inferencer, feed_target_names, fetch_targets] = fluid.io.load_inference_model(params_dirname, exe) # 设置输入,用四个LoDTensor来表示4个词语。这里每一个词都是一个id, # 用来查询embedding表获取对应的词向量,所以其形状大小是[1]。 # recursive_sequence_lengths设置的是基于长度的LoD,所以都应该设为[[1]] # 注意recursive_sequence_lengths是列表的列表 data1 = [[211]] # 'among' data2 = [[6]] # 'a' data3 = [[96]] # 'group' data4 = [[4]] # 'of' lod = [[1]] first_word = fluid.create_lod_tensor(data1, lod, place) second_word = fluid.create_lod_tensor(data2, lod, place) third_word = fluid.create_lod_tensor(data3, lod, place) fourth_word = fluid.create_lod_tensor(data4, lod, place) assert feed_target_names[0] == 'firstw' assert feed_target_names[1] == 'secondw' assert feed_target_names[2] == 'thirdw' assert feed_target_names[3] == 'fourthw' # 构造feed词典 {feed_target_name: feed_target_data} # 预测结果包含在results之中 results = exe.run( inferencer, feed={ feed_target_names[0]: first_word, feed_target_names[1]: second_word, feed_target_names[2]: third_word, feed_target_names[3]: fourth_word }, fetch_list=fetch_targets, return_numpy=False) print(numpy.array(results[0])) most_possible_word_index = numpy.argmax(results[0]) print(most_possible_word_index) print([ key for key, value in six.iteritems(word_dict) if value == most_possible_word_index ][0])
因为词向量矩阵自己比较稀疏,训练的过程若是要达到必定的精度耗时会比较长。为了能简单看到效果,教程只设置了通过不多的训练就结束并获得以下的预测。咱们的模型预测 among a group of
的下一个词是the
。这比较符合文法规律。若是咱们训练时间更长,好比几个小时,那么咱们会获得的下一个预测是 workers
。预测输出的格式以下所示:网络
[[0.03768077 0.03463154 0.00018074 ... 0.00022283 0.00029888 0.02967956]] 0 the
其中第一行表示预测词在词典上的几率分布,第二行表示几率最大的词对应的id,第三行表示几率最大的词。fetch
整个程序的入口很简单:ui
def main(use_cuda, is_sparse): if use_cuda and not fluid.core.is_compiled_with_cuda(): return params_dirname = "word2vec.inference.model" train( if_use_cuda=use_cuda, params_dirname=params_dirname, is_sparse=is_sparse) infer(use_cuda=use_cuda, params_dirname=params_dirname) main(use_cuda=use_cuda, is_sparse=True)
总结spa
本章中,咱们介绍了词向量、语言模型和词向量的关系、以及如何经过训练神经网络模型得到词向量。在信息检索中,咱们能够根据向量间的余弦夹角,来判断query和文档关键词这两者间的相关性。在句法分析和语义分析中,训练好的词向量能够用来初始化模型,以获得更好的效果。在文档分类中,有了词向量以后,能够用聚类的方法将文档中同义词进行分组,也能够用 N-gram 来预测下一个词。但愿你们在本章后可以自行运用词向量进行相关领域的研究。code
参考文献
本教程 由 PaddlePaddle 创做,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。