使用gensim从快速文本库中高效地存储预训练单词嵌入的内存

问题描述 投票:0回答:1

我想用gensim从快速文本库中加载经过预训练的多语言单词嵌入;这里是嵌入链接:

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的本机fasttext .bin格式保存的模型中加载单词嵌入。
    • load_facebook_vectors()仅加载单词嵌入。它的速度更快,但不能使您继续训练。

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

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

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

python nlp gensim word-embedding fasttext
1个回答
0
投票

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

因为通常对此类向量进行排序,以将出现频率较高的词排在首位,所以经常丢弃低频词的长尾巴并不是很大的损失。

© www.soinside.com 2019 - 2024. All rights reserved.