FastTextKeyedVectors向量,vectors_vocab和vectors_ngrams实例变量之间的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastTextKeyedVectors向量,vectors_vocab和vectors_ngrams实例变量之间的差异相关的知识,希望对你有一定的参考价值。

我下载了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.npy内部使用的是gensim.models.keyedvectors.FastTextKeyedVectors?如果查看用于查找word vector的源代码,则看不到如何在任何地方使用属性vectors。我看到使用了vectors_vocabvectors_ngrams Bing属性。但是,如果删除vectors.npy文件,则无法使用gensim.models.keyedvectors.FastTextKeyedVectors.load方法加载模型。

有人可以解释使用此变量的位置吗?如果我感兴趣的只是查找字向量(以减少内存占用),可以删除它吗?

谢谢。

答案

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

对于感兴趣的完整单词,

vectors_vocab是通过FastText算法训练的完整单词令牌向量。但是,请注意,FastText为词汇中的单词返回的实际单词向量被定义为该向量vectors存储词汇中单词的实际,可返回的全单词向量。也就是说:它是vectors_vocab值加上所有单词的n-gram向量的预先计算的组合。

因此,vectors从不直接训练,并且始终可以从其他数组重新计算。它可能

不应

作为已保存模型的一部分存储(因为它是多余的信息,可以根据需要进行重构)。 ((对于FastText的特定情况,甚至可以将其作为可选的优化方式-愿意节省内存,但每字查找速度较慢的用户,将其丢弃。但是,这会使非常普通且重要的操作变得复杂类似于most_similar()的操作,如果它们具有所有潜在答案词向量的完整且就绪的数组,则效率会更高。)

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

尽管使用vectors保存的任何模型在以后.load()出现时都需要该文件,但可以想象通过放弃model.wv.vectors属性

之前

保存,然后强制对其进行重构,从而节省磁盘存储空间加载后。加载模型后,您仍然需要支付RAM成本。 计算出vectors之后,并且如果您完全完成了培训,则可以想象会放弃vectors_vocab属性以节省RAM。 (对于任何已知的单词,可以直接查询vectors以进行即时查找,并且仅在进行进一步培训或需要重新生成vectors_vocab的情况下才需要vectors。)

以上是关于FastTextKeyedVectors向量,vectors_vocab和vectors_ngrams实例变量之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

二维向量下标超出范围

带有向量向量的段错误

在 C++ 崩溃中使用向量向量进行基数排序

为啥字符串不是向量的(子类)?

将数据从数组切换到向量

在向量 C++ 中处理指针