在python中读取word2vec txt的更快方法

时间:2019-01-17 18:54:58

标签: text binary word2vec

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

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

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

1 个答案:

答案 0 :(得分:1)

“超级慢”是什么意思?比起什么?

因为它是给定的文本格式,所以无法逐行读取文件,解析浮点数并将它们分配为可用结构。但是您的工作效率可能很低-看不到代码,很难说。

Python中的gensim库包含用于处理这种格式的字向量的类。并且,其例程包括一个可选的limit参数,用于仅从文件的开头读取一定数量的向量。例如,这将从名为vectors.txt的文件中读取第1个1000:

word_vecs = KeyedVectors.load_word2vec_format('word-vectors.txt', 
                                              binary=False,
                                              limit=1000)

即使加载Google发行的3GB以上的字向量集,我也从未注意到它是一个特别慢的操作。 (如果它看起来确实很慢,则可能是您的RAM不足,并且尝试的加载依赖于虚拟内存分页,而您永远不会想像这样的随机访问数据结构。)

如果您随后通过gensim.save()的本机格式保存矢量,并且如果组成的numpy数组足够大以可以另存为单独的文件,则可以选择将gensim的本机.load()与可选的mmap='r'参数一起使用的说明。这将完全跳过对磁盘上的原始numpy数组的任何分析,只需将它们映射到可寻址的空间即可,从而使.load()很快完成。然后,当访问数组的范围时,会将它们分页到RAM中。您仍然要支付从磁盘读取所有数据的成本,但是需要按需递增,而不是提前大量进行。

例如...

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

...然后再...

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

(原生.load()没有'limit'选项。)