我下载了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.npy和vectors_ngrams.npy,然而,vectors.npy在gensim.models.keyedvectors.FastTextKeyedVectors内部是用来做什么的呢?如果我查看查找字向量的源代码,我就看不到属性vectors是如何在任何地方使用的。我看到了vectors_vocab和vectors_ngrams bing使用的属性。但是,如果删除vectors.npy文件,则无法使用gensim.models.keyedvectors.FastTextKeyedVectors.load方法加载模型。
有人能解释一下这个变量在哪里使用吗?如果我感兴趣的是寻找单词向量(以减少内存占用),我可以删除它吗?
谢谢。
发布于 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。)
https://stackoverflow.com/questions/59570511
复制相似问题