利用gensim构建word2vec词向量模型并保存词向量

利用gensim包的word2vec模块构建CBOW或Skip-Gram模型来进行词向量化比较方便。

''' 根据训练语料库,自己训练语言模型得到词向量 '''
# 对分词后的文本训练Word2vec模型
from gensim.models import word2vec
import logging

def get_wordvec(corpus_path, model_name, vec_path):
    # 获取日志信息
    logging.basicConfig(foramt='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
    # 加载分词后的文本
    sentences = word2vec.Text8Corpus(corpus_path)
    # 训练模型
    model = word2vec.Word2Vec(sentences, size=300, hs=1, min_count=1, window=3)
    model.save(model_name)
    model.wv.save_word2vec_format(vec_path, binary=False)

model.save()不能利用文本编辑器查看但是保存了训练的全部信息,可以在读取后追加训练; model.wv.save_word2vec_format()保存为word2vec文本格式但是保存时丢失了词汇树等部分信息,不能追加训练。

模型构建很简便,但是遇到几个小问题:一个是词向量保存的格式有好几种,大小会不同嘛,哪个速度快,选哪个呢?另外保存时使用二进制和非二进制,在读取词向量时可能带来编码问题。
这里是针对中文的一个简单的分词后的语料数据。
我尝试了几种模型词向量的保存方法:

  1. 将词向量保存为txt格式,非二进制:
corpus_path = os.path.join(main, 'data\\corpus.txt')
w2v_model_name = os.path.join(main, 'model\\train_word2vec_model.model')
vec_path = os.path.join(main,'model\\token_vec_300.txt')
get_wordvec(corpus_path, model_name, vec_path)
f1 = open(vec_path,'r',encoding='utf-8')
vectors = f1.readlines()
f1.close()

词向量大小为19.7KB,保存比较快。

  1. 将词向量保存为bin格式,非二进制格式:
corpus_path = os.path.join(main, 'data\\corpus.txt')
w2v_model_name = os.path.join(main, 'model\\train_word2vec_model.model')
vec_path = os.path.join(main,'model\\token_vec_300.bin')
get_wordvec(corpus_path, model_name, vec_path)
f2 = open(vec_path,'r',encoding='utf-8')
vectors = f2.readlines()
f2.close()

词向量保存为bin格式,大小和txt格式一样,也能正常读取。

  1. 将词向量保存为bin.gz格式,非二进制:
corpus_path = os.path.join(main, 'data\\corpus.txt')
w2v_model_name = os.path.join(main, 'model\\train_word2vec_model.model')
vec_path = os.path.join(main,'model\\token_vec_300.bin.gz')
get_wordvec(corpus_path, model_name, vec_path)
# 模型载入
model = word2vec.Word2Vec.load(w2v_model_name)
# 词向量载入
vectors = model.wv
#vectors = gensim.models.KeyedVectors.load_word2vec_format(vec_path,binary=False)

使用load方式加载模型,可以进行再训练。
训练后的词向量可以使用model.wv保存在一个KeyedVectors实例中。

bin.gz格式是经过压缩的,大小变成8.06KB。使用gzipped / bz2输入也可以,不需要解压。

词向量保存和加载

保存训练好的词向量。

保存

  1. 使用mdoel.wv.save以KededVectors实例的形式保存词向量文件,以该方式保存的模型丢失了完整的模型状态,无法再训练,保存的对象更小更快。
model.wv.save("model.wv")
  1. 使用wv.save_word2vec_format保存词向量文件(之前是model.save_word2vec_format(),已弃用)。
model.wv.save_word2vec_format("model.bin", binary=True)

加载

  1. 使用KeyedVectors.load加载词向量文件,保存在KeyedVectors实例中(适用于不需要完整的模型状态,不再进行训练)。
from gensim.models import KeyedVectors
wv = KeyedVectors.load("model.wv", mmap='r')
vector = wv['computer'] # numpy vector of a word

  1. 以word2vec C format加载词向量,保存在KeyedVectors实例中
    使用KeyedVector.load_word2vec_format()可以加载两种格式的词向量文件:C 文本格式和C bin格式(二进制)
from gensim.models import KeyedVectors
wv_from_text = KeyedVectors.load_word2vec_format("model_kv_c", binary=False) # C text format
wv_from_bin = KeyedVectors.load_word2vec_format("model_kv.bin", binary=True) # C bin format

参考:
https://blog.csdn.net/ling620/article/details/99434061
https://www.jianshu.com/p/fbce9c8f5536
https://www.unclewang.info/learn/python/481/

你可能感兴趣的:(自然语言处理,Machine,Learning,python)