在 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' 选项。)
我有一个标准的 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
:
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' 选项。)