在 python 中更快地阅读 word2vec txt 的方法

faster way of reading word2vec txt in python

我有一个标准的 word2vec 输出,它是一个格式如下的 .txt 文件:

[number of words] [dimension (300)]
word1 [300 float numbers separated by spaces]
word2 ...

现在我最多想从该文件中读取 M 个单词表示。一种简单的方法是循环文件中的前 M+1 行,并将 M 向量存储到一个 numpy 数组中。但是这样超级慢,有没有更快的方法?

你是什么意思,"is super slow"?比什么?

因为它是给定的文本格式,所以无法逐行读取文件、解析浮点数并将它们分配到可用结构中。但是您做事的效率可能非常低——如果没有看到您的代码,就很难判断。

Python 中的 gensim 库包括 类 用于处理这种格式的词向量。而且,它的例程包括一个可选的 limit 参数,用于从文件的前面读取一定数量的向量。例如,这将从名为 vectors.txt:

的文件中读取第一个 1000
word_vecs = KeyedVectors.load_word2vec_format('word-vectors.txt', 
                                              binary=False,
                                              limit=1000)

我从来没有注意到它是一个特别慢的操作,即使在加载像 3GB+ 的词向量集 Google 发布的东西时也是如此。 (如果它确实看起来超级慢,可能是你的 RAM 不足,并且尝试加载依赖于虚拟内存分页 - 你永远不想遇到这样的随机访问数据结构。)

如果您随后通过 .save()gensim 的本机格式保存向量,并且如果组成的 numpy 数组足够大可以保存为单独的文件,那么您将拥有使用 gensim 的原生 .load() 和可选的 mmap='r' 参数的选项。这将完全跳过对原始磁盘上 numpy 数组的任何解析,只是将它们内存映射到可寻址的 space——使 .load() 非常快速地完成。然后,当访问数组的范围时,它们将被分页到 RAM 中。您仍然需要支付从磁盘读取所有数据的费用——但会根据需要逐步增加,而不是预先大批量读取。

例如...

word_vecs.save('word-vectors.gensim')

...然后稍后...

word_vecs2 = KeyedVectors.load('word_vectors.gensim', mmap='r')

(本机 .load() 没有 'limit' 选项。)