【问题标题】:Load Pretrained Word2Vec Embedding in Tensorflow在 TensorFlow 中加载预训练的 Word2Vec 嵌入
【发布时间】:2017-04-27 12:49:31
【问题描述】:

我正在尝试在我的 Tensorflow 代码中加载嵌入的预训练 Word2Vec(或 Glove),但是我在理解它时遇到了一些问题,因为我找不到很多示例。问题不是关于获取和加载我理解的嵌入矩阵,而是关于查找单词 id。 目前我正在使用来自https://ireneli.eu/2017/01/17/tensorflow-07-word-embeddings-2-loading-pre-trained-vectors/ 的代码。 在那里,首先加载(理解)嵌入矩阵。 然后,使用词汇处理器将句子 x 转换为单词 ID 列表:

vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length)
#fit the vocab from glove
pretrain = vocab_processor.fit(vocab)
#transform inputs
x = np.array(list(vocab_processor.transform(your_raw_input)))

这可行,并给了我一个单词 ID 列表,但我不知道这是否正确。最困扰我的是词汇处理器如何从我刚刚阅读的嵌入中获取正确的单词 id 的问题(因为否则嵌入的结果将是错误的)。 合身步骤会这样做吗?

或者还有其他方法,你是怎么做这个查找的?

谢谢! 奥利弗

【问题讨论】:

    标签: tensorflow lstm embedding word2vec


    【解决方案1】:

    是的,fit 步骤告诉vocab_processor vocab 数组中每个单词(从 1 开始)的索引transform 只是反转此查找并从单词中生成索引并使用 0 将输出填充到 max_document_size

    你可以在这里看到一个简短的例子:

    vocab_processor = learn.preprocessing.VocabularyProcessor(5)
    vocab = ['a', 'b', 'c', 'd', 'e']
    pretrain = vocab_processor.fit(vocab)
    
    pretrain == vocab_processor
    # True
    
    np.array(list(pretrain.transform(['a b c', 'b c d', 'a e', 'a b c d e'])))
    
    # array([[1, 2, 3, 0, 0],
    #        [2, 3, 4, 0, 0],
    #        [1, 5, 0, 0, 0],
    #        [1, 2, 3, 4, 5]])
    # 
    

    【讨论】:

    • 好的,看了你的帖子两次,我明白了。当从 w2v 或 grove 读取嵌入矩阵时,将有一个数据矩阵和一个单词列表(在本例中为 vocab),只需使用 vocab_processor 来适应这个 vocab 就可以了。
    最近更新 更多