【问题标题】:FastTextKeyedVectors difference between vectors, vectors_vocab and vectors_ngrams instance variablesFastTextKeyedVectorsvectors、vectors_vocab和vectors_ngrams实例变量的区别
【发布时间】:2020-01-02 21:54:47
【问题描述】:

我下载了wiki-news-300d-1M-subword.bin.zip,加载如下:

import gensim
print(gensim.__version__)
model = gensim.models.fasttext.load_facebook_model('./wiki-news-300d-1M-subword.bin')
print(type(model))
model_keyedvectors = model.wv
print(type(model_keyedvectors))
model_keyedvectors.save('./wiki-news-300d-1M-subword.keyedvectors')

正如预期的那样,我看到了以下输出:

3.8.1
<class 'gensim.models.fasttext.FastText'>
<class 'gensim.models.keyedvectors.FastTextKeyedVectors'>

我还看到以下三个 numpy 数组序列化到磁盘:

$ du -h wiki-news-300d-1M-subword.keyedvectors*
127M    wiki-news-300d-1M-subword.keyedvectors
2.3G    wiki-news-300d-1M-subword.keyedvectors.vectors_ngrams.npy
2.3G    wiki-news-300d-1M-subword.keyedvectors.vectors.npy
2.3G    wiki-news-300d-1M-subword.keyedvectors.vectors_vocab.npy

我了解vectors_vocab.npyvectors_ngrams.npy,但是,vectors.npygensim.models.keyedvectors.FastTextKeyedVectors 内部用于什么?如果我查看源代码以找出word vector,我看不出vectors 属性是如何在任何地方使用的。我看到使用的属性vectors_vocabvectors_ngrams bing。但是,如果我删除 vectors.npy 文件,我将无法使用 gensim.models.keyedvectors.FastTextKeyedVectors.load 方法加载模型。

有人能解释一下这个变量在哪里使用吗?如果我只对查找词向量感兴趣(以减少内存占用),我可以删除它吗?

谢谢。

【问题讨论】:

    标签: gensim fasttext


    【解决方案1】:

    vectors_ngrams 是存储从词片段(character-n-grams)中学习到的向量的桶。无论遇到多少个 n-gram,它的大小都是固定的——因为多个 n-gram 可以“碰撞”到同一个槽中。

    vectors_vocab 是由 FastText 算法训练的 full-word-token 向量,用于感兴趣的全词。但是,请注意,由 FastText 为词汇表中的单词返回的实际单词向量被定义为该向量加上所有子词向量。

    vectors 存储词汇表中单词的实际、可返回的全词向量。也就是说:它是 vectors_vocab 值加上所有单词的 n-gram 向量的预先计算的组合。

    因此,vectors 永远不会被直接训练,并且总是可以从其他数组中重新计算。它可能不应该存储为已保存模型的一部分(因为它是可以按需重建的冗余信息)。

    (对于 FastText 的特定情况,它甚至可以作为一个可选的优化 - 对于愿意节省内存但每个单词查找速度较慢的用户,将其丢弃。然而,这会使非常常见的和重要的most_similar()-like 操作,如果它们有一个完整的、准备好的所有潜在答案词向量数组,那么效率会更高。)

    如果您没有看到vectors 被直接访问,那么您可能没有考虑从超类继承的方法。

    虽然使用vectors 保存的任何模型在以后.load()ed 时都需要该文件,但您可以通过丢弃model.wv.vectors 属性在保存之前 来节省磁盘存储空间,然后在加载后强制其重建。加载模型时,您仍需支付 RAM 成本。

    在计算出vectors 之后,如果你完全完成了训练,你可以想象放弃vectors_vocab 属性以节省内存。 (对于任何已知词,可直接咨询vectors即时查找,vectors_vocab仅在进一步训练或需要重新生成vectors的情况下才需要。)

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多