为什么要增量训练:
相信大家遇到像我一样的问题,当训练完一个word2vec词向量模型之后,又新来了一批语料,怎么实现在不改变原有模型的基础上,将新来的一批语料中新产生的词语训练成向量添加进去呢?由于原来的训练完的模型是经过几个小时甚至更长的时间才训练好的,不想重新进行训练,浪费时间,这时候增量训练就可以发挥其作用,
下面将介绍增量训练的实现过程:
具体代码实现如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:Administrator
@file:增量训练测试.py
@time:2019/08/05
"""
from gensim.models.word2vec import Word2Vec
class TrainWord2Vec:
def __init__(self, num_features=50, min_word_count=1, context=5, incremental=True,old_path='./model1/news.word2vec'):
"""
定义变量
:param data: 用于训练胡语料
:param stopword: 停用词表
:param num_features: 返回的向量长度
:param min_word_count: 最低词频
:param context: 滑动窗口大小
:param incremental: 是否进行增量训练
:param old_path: 若进行增量训练,原始模型路径
"""
# self.data = data
# self.stopword = stopword
self.num_features = num_features
self.min_word_count = min_word_count
self.context = context
self.incremental = incremental
self.old_path = old_path
def get_text(self):
corpus = []
#打开分词后的文本
for line in open('./data/P2_keywords.txt', 'r', encoding='utf-8'):
text = line.strip().split(' ')
corpus.append(text)
print(corpus)
return corpus
def get_model(self, text):
"""
从头训练word2vec模型
:param text: 经过清洗之后的语料数据
:return: word2vec模型
"""
model = Word2Vec(sentences = text, size=self.num_features, min_count=self.min_word_count, window=self.context)
return model
def update_model(self, text):
"""
增量训练word2vec模型
:param text: 经过清洗之后的新的语料数据
:return: word2vec模型
"""
model = Word2Vec.load(self.old_path) # 加载旧模型
model.build_vocab(text, update=True) # 更新词汇表
model.train(sentences = text, total_examples=model.corpus_count, epochs=model.iter) # epoch=iter语料库的迭代次数;(默认为5) total_examples:句子数。
return model
def main(self):
"""
主函数,保存模型
"""
# 加入自定义分词词表
# jieba.load_userdict("add_word.txt")
text = self.get_text()
if self.incremental:
model = self.update_model(text)
else:
model = self.get_model(text)
# 保存模型
model.save("./model1/word2vec_new.model")
model.wv.save_word2vec_format('./model1/word2vec_format_new1.txt')
if __name__ == '__main__':
trainmodel = TrainWord2Vec()
trainmodel.main()
参考:https://blog.csdn.net/qq_43404784/article/details/83794296