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



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

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

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

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

Gensim提供了以下两个加载快速文本文件的选项:

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

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

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

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

由于我的笔记本电脑只有 8 GB RAM,因此我继续收到内存错误或加载需要很长时间(最多几分钟(。

是否有选项可以从磁盘加载这些大型模型,以提高内存效率?

由于矢量通常至少占用与其磁盘存储一样多的可寻址内存,因此将这些矢量的全功能版本加载到只有 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)

由于此类向量通常被排序为将更频繁出现的单词放在首位,因此通常丢弃低频单词的长尾并不是一个很大的损失。

最新更新