如何通过预处理语料库加快gensim word2vec的初始化?

时间:2019-04-16 10:07:28

标签: gensim word2vec

我正在同一语料库上训练多个word2vec模型。 (我这样做是为了研究学习的单词向量的变化)

我正在使用本教程作为参考:https://rare-technologies.com/word2vec-tutorial/

建议默认情况下gensim.models.word2vec将对语料库进行至少两次迭代。一次进行初始化,然后再次进行训练(重复指定的时期数)

由于我一直使用相同的语料库,因此我想通过仅初始化一次并为所有后续模型提供相同的初始化作为输入来节省时间。

这怎么办?

这是我当前的设置:

subdirectory = 'corpus_directory'
for i in range(10):
    sentences = MySentences(subdirectory) # a memory-friendly iterator
    model = gensim.models.Word2Vec(sentences, min_count=20, size=100, workers=4)
    model.train(sentences, total_examples=model.corpus_count, epochs=1)
    word_vectors = model.wv
    fname = 'WV{}.kv'
    word_vectors.save(fname.format(i))

其中MySentences的定义与本教程类似: (我做了些微的更改,因此每次初始化时语料库句子的顺序都会改变)

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname
        self.file_list = [fname for fname in os.listdir(dirname) if fname.endswith('.txt')]
        random.shuffle(self.file_list)

    def __iter__(self):
        for article in self.file_list:
            for line in open(os.path.join(self.dirname, article)):
                yield line.split()

1 个答案:

答案 0 :(得分:1)

如果您为类实例提供sentences的语料库(如代码所示),则无需调用train()。它将已经自动完成,并且您的第二个train()是多余的。 (我建议在INFO级别启用日志记录的情况下执行所有此类操作,并在每次运行后检查lgo以了解正在发生的事情-诸如两次完整的从头到尾的培训之类的事情应记录在日志中。)

如果您想对过渡步骤进行更多控制,则可以显式调用train()。您将sentences留在了类说明之外,但随后您需要执行两个明确的步骤:一次调用build_vocab()(用于初始词汇扫描),然后一次调用{{ 1}}(用于实际的多时期训练)。

在这种情况下,您可以使用gensim的本机train()在词汇发现后保存 模型,以使其具有可以重新训练的模型,而无需重新训练报告该步骤。

因此,您可以多次将词汇构建的模型重新加载到不同的变量中,以不同的方式进行训练。对于某些模型的元参数(例如.save()甚至是window模式),您甚至可以在建立词汇表后尝试在模型上篡改它们的值以尝试不同的变体。

但是,如果语料库的单词/单词频率或其他影响dm期间初始化的参数(如向量build_vocab())发生任何变化,则初始化为与您尝试的配置不同步,您可能会遇到奇怪的错误。

在这种情况下,最好的方法是完全重复执行size步骤。 (您也可以查看源代码,以查看build_vocab()执行的各个步骤,只需修补/重复所需的初始化步骤,但这需要对代码非常熟悉。)