Text 在python中读取word2vec txt的更快方法
我有一个标准word2vec输出,它是一个.txt文件,格式如下:Text 在python中读取word2vec txt的更快方法,text,binary,word2vec,Text,Binary,Word2vec,我有一个标准word2vec输出,它是一个.txt文件,格式如下: [number of words] [dimension (300)] word1 [300 float numbers separated by spaces] word2 ... 现在我想从这个文件中最多读取Mword表示。一种简单的方法是循环文件中的第一行M+1,并将M向量存储到numpy数组中。但是这太慢了,有没有更快的方法?你说的“太慢”是什么意思?和什么相比 因为它是给定的文本格式,所以无法逐行读取文件、解析浮动并
[number of words] [dimension (300)]
word1 [300 float numbers separated by spaces]
word2 ...
现在我想从这个文件中最多读取M
word表示。一种简单的方法是循环文件中的第一行M+1
,并将M
向量存储到numpy数组中。但是这太慢了,有没有更快的方法?你说的“太慢”是什么意思?和什么相比
因为它是给定的文本格式,所以无法逐行读取文件、解析浮动并将其分配到可用的结构中。但是你可能做的事情效率很低——如果没有看到你的代码,很难说
Python中的gensim
库包含用于处理这种格式的字向量的类。而且,它的例程包括一个可选的limit
参数,用于从文件前面读取一定数量的向量。例如,这将从名为vectors.txt的文件中读取前1000个:
word_vecs = KeyedVectors.load_word2vec_format('word-vectors.txt',
binary=False,
limit=1000)
我从来没有注意到它是一个特别慢的操作,即使在加载像谷歌发布的3GB+文字向量集这样的东西时也是如此。(如果它看起来确实非常慢,可能是因为RAM不足,而尝试的加载依赖于虚拟内存分页——这种情况在这样的随机访问数据结构中是绝对不会发生的。)
如果然后通过.save()
以gensim
的本机格式保存向量,并且如果组成的numpy数组足够大,可以保存为单独的文件,则可以选择使用gensim
的本机.load()
和可选的mmap='r'
参数。这将完全跳过对磁盘上原始numpy数组的任何解析,只需将它们映射到可寻址空间的内存即可–使.load()
非常快地完成。然后,当数组的范围被访问时,它们将被分页到RAM中。您仍然需要支付从磁盘读取所有数据的费用——但需要时,以增量的方式,而不是预先批量读取
例如
word_vecs.save('word-vectors.gensim')
……后来
word_vecs2 = KeyedVectors.load('word_vectors.gensim', mmap='r')
(本机.load()
没有“限制”选项)