gensim word2vec词向量模型快速加载
背景:
在使用别人已经训练好的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,速度提升很多啦..