背景:
在使用别人已经训练好的word2vec模型时,如Chinese Word Vectors 中文词向量,https://link.zhihu.com/?target=https%3A//github.com/Embedding/Chinese-Word-Vectors
常常这种模型很大(上述链接中的Skip-Gram with Negative Sampling (SGNS)中,Mixed-large 综合行、Word + Ngram列下载解压后的文件为3.43G),将他们加载到内存中再求词向量显然会很费时,求model.most_similar时同样需要搜索整个内存空间.
在stackoverflow中,关于训练好的的word2vec模型加速加载、使用回答链接如下:https://link.zhihu.com/?target=https%3A//stackoverflow.com/questions/42986405/how-to-speed-up-gensim-word2vec-model-load-time

本文尝试解决的问题是:
如何使用已训练的word2vec模型,快速求有限词汇表的词向量。
2. 方法:
构建有限词汇表,转存模型中的词向量为csv或其他格式,使用时载入为字典实现快速读取。
3. 代码:

import numpy as np
import pandas as pd

# 用于过滤在word2vec中的词
def get_vocabulary_vector():
    # 载入已下载的word2vec解压后的模型
    print("start word2vec load ......")
    from gensim.models import KeyedVectors
    wv_from_text = KeyedVectors.load_word2vec_format(Config().model_path+'sgns.merge.bigram',
                                                     binary=False, encoding="utf8",  unicode_errors='ignore')  # C text format
    print("word2vec load succeed")

    # 所有文本构建词汇表,words_cut 为分词后的list,每个元素为以空格分隔的str.
    vocabulary = list(set([word for item in words_cut for word in item.split()]))

    # 构建词汇-向量字典
    vocabulary_vector = {}
    for word in vocabulary:
       if word in wv_from_text:
          vocabulary_vector[word] = wv_from_text[word]
    # 储存词汇-向量字典,由于json文件不能很好的保存numpy词向量,故使用csv保存
    pd.DataFrame(vocabulary_vector).to_csv(config.model_path+"vocabulary_vector.csv")

if __name__=="__main__":
    # 读取词汇-向量字典,csv转字典
    vocabulary_vector = dict(pd.read_csv(Config().model_path+"vocabulary_vector.csv"))
    # 此时需要将字典中的词向量np.array型数据还原为原始类型,方便以后使用
    for key,value in vocabulary_vector.items():
       vocabulary_vector[key] = np.array(value)
    print("vocabulary vector load succeed")

    # 至此可以使用字典方式快速读取词向量,第一次构建耗时,之后只需读取该csv,速度提升很多啦..