词向量(三)

本文做者:在线实验室javascript

文章结构:java

词向量git

  1. 背景介绍
  2. 效果展现
  3. 模型概览
  4. 数据准备
  5. 编程实现
  6. 模型应用
  7. 总结
  8. 参考文献

 

模型应用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

 

参考文献

 

  1. Bengio Y, Ducharme R, Vincent P, et al. A neural probabilistic language model[J]. journal of machine learning research, 2003, 3(Feb): 1137-1155.
  2. Mikolov T, Kombrink S, Deoras A, et al. Rnnlm-recurrent neural network language modeling toolkit[C]//Proc. of the 2011 ASRU Workshop. 2011: 196-201.
  3. Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprint arXiv:1301.3781, 2013.
  4. Maaten L, Hinton G. Visualizing data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(Nov): 2579-2605.
  5. https://en.wikipedia.org/wiki/Singular_value_decomposition


知识共享许可协议
本教程 由 PaddlePaddle 创做,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。

原文连接地址:https://developer.baidu.com/topic/show/290070

相关文章
相关标签/搜索