使用 gensim 从快速文本库中有效地加载预训练词嵌入的内存

lux*_*ux7 2 python nlp gensim word-embedding fasttext

我想用 gensim 从 fasttext 库中加载预训练的多语言词嵌入;这里是嵌入的链接:

https://fasttext.cc/docs/en/crawl-vectors.html

特别是,我想加载以下词嵌入:

  • cc.de.300.vec (4.4 GB)
  • cc.de.300.bin (7 GB)

Gensim 提供了以下两种加载 fasttext 文件的选项:

  1. gensim.models.fasttext.load_facebook_model(path, encoding='utf-8')

    • 从 Facebook 的原生 fasttext .bin 输出文件加载输入隐藏权重矩阵。
    • load_facebook_model() 加载完整模型,而不仅仅是词嵌入,并使您能够继续模型训练。
  2. gensim.models.fasttext.load_facebook_vectors(path, encoding='utf-8')

    • 从以 Facebook 的原生 fasttext .bin 格式保存的模型加载词嵌入。
    • load_facebook_vectors() 仅加载词嵌入。它更快,但不能让您继续训练。

源 Gensim 文档:https ://radimrehurek.com/gensim/models/fasttext.html#gensim.models.fasttext.load_facebook_model

由于我的笔记本电脑只有 8 GB RAM,我继续出现 MemoryErrors 或加载需要很长时间(最多几分钟)。

是否可以选择从磁盘加载这些大型模型的内存效率更高?

goj*_*omo 5

由于向量通常至少需要与其磁盘存储一样多的可寻址内存,因此将这些向量的全功能版本加载到只有 8GB RAM 的机器中将具有挑战性。特别是:

  • 一旦您开始对此类向量进行最常见的操作——查找most_similar()目标词/向量的词列表——gensim 实现还将想要缓存一组已标准化为单位长度的词向量——这几乎翻了一番所需的内存

  • 当前版本的 gensim 的 FastText 支持(至少到 3.8.1)也会在一些不必要的分配上浪费一些内存(尤其是在完整模型的情况下)

如果您只使用向量而不进行进一步的培训,那么您肯定只想使用该load_facebook_vectors()选项。

如果您愿意放弃模型为在训练期间未看到的词汇外单词合成新向量的能力,那么您可以选择仅从纯文本.vec文件中加载完整词向量的一个子集。例如,只加载第一个 500K 向量:

from gensim.models.keyedvectors import KeyedVectors
KeyedVectors.load_word2vec_format('cc.de.300.vec', limit=500000)
Run Code Online (Sandbox Code Playgroud)

因为这样的向量通常被排序以将更频繁出现的词放在最前面,所以经常丢弃低频词的长尾并不是一个很大的损失。