首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量、vectors_vocab和vectors_ngrams实例变量之间的vectors_vocab差异

向量、vectors_vocab和vectors_ngrams实例变量之间的vectors_vocab差异
EN

Stack Overflow用户
提问于 2020-01-02 21:54:47
回答 1查看 897关注 0票数 3

我下载了wiki-news-300d-1M-subword.bin.zip并按如下方式加载:

代码语言:javascript
复制
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')

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

代码语言:javascript
复制
3.8.1
<class 'gensim.models.fasttext.FastText'>
<class 'gensim.models.keyedvectors.FastTextKeyedVectors'>

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

代码语言:javascript
复制
$ 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内部是用来做什么的呢?如果我查看查找字向量的源代码,我就看不到属性vectors是如何在任何地方使用的。我看到了vectors_vocabvectors_ngrams bing使用的属性。但是,如果删除vectors.npy文件,则无法使用gensim.models.keyedvectors.FastTextKeyedVectors.load方法加载模型。

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 00:23:11

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

vectors_vocab是由FastText算法为感兴趣的全词训练的全词标记向量.但是,请注意,实际的单词向量(由FastText为词汇表中的单词返回)被定义为这个向量加上所有的子单词向量。

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

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

(对于FastText的具体情况,它甚至可能是一种可选的优化,用户愿意节省内存,但每字查找速度较慢,因此放弃它。然而,这将使非常常见和重要的most_similar()-like操作复杂化,如果它们有一个完整的、现成的所有潜在答案字向量数组,那么这些操作的效率要高得多。)

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

虽然在vectors存在下保存的任何模型在以后的.load()编辑时都需要该文件,但可以想象,在保存之前放弃model.wv.vectors属性,然后在加载后强制其重建,就可以将其保存在磁盘存储中。当模型加载时,您仍然需要支付RAM的费用。

在计算vectors之后,如果您完全完成了培训,那么可以考虑放弃vectors_vocab属性来保存内存。(对于任何已知的词,vectors都可以直接查询,只有在进一步培训或需要重新生成vectors的情况下才需要vectors_vocab。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59570511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档