我有一个标准的word2vec输出,它是一个.txt文件,格式如下:
[number of words] [dimension (300)]
word1 [300 float numbers separated by spaces]
word2 ...
现在,我想从该文件中最多读取M
个单词表示形式。一种简单的方法是循环文件中的前M+1
行,并将M
向量存储到numpy数组中。但这太慢了,有没有更快的方法?
答案 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'选项。)