基于Gensim实现word2vec词向量增量训练

为什么要增量训练:

相信大家遇到像我一样的问题,当训练完一个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

你可能感兴趣的:(NLP,AI与NLP)