如何在自训练的word2vec模型中删除单词

时间:2019-11-22 03:21:48

标签: python word2vec

我有一个自我训练的word2vec模型(2G,以“ .model”结尾)。我将模型转换为文本文件(超过50G,以“ .txt”结尾),因为我必须在其他python代码中使用文本文件。我试图通过删除不需要的单词来减小文本文件的大小。我用我需要的所有单词建立了词汇表。如何过滤模型中不必要的单词?

我试图为文本文件建立字典,但我的内存不足。

A.a

我在考虑是否可以删除“ .model”文件中的单词。我该怎么做?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果没有更精确的代码,很难进一步回答,但是您可以批量分析文本文件

lines_to_keep = []
new_file = "some_path.txt"
words_to_keep = set(some_words)
with open(emb_path, "r", encoding="utf-8") as f:
    for l in f:
        word, embedding = l.strip().split(' ',1)
        if word in words_to_keep:
            lines_to_keep.append(l.strip())
        if lines_to_keep and len(lines_to_keep) % 1000 == 0:
            with open(new_file, "a") as f:
                f.write("\n".join(lines_to_keep)
            lines_to_keep = []

答案 1 :(得分:1)

通常,减小word2vec模型的大小的最佳方法是丢弃更多出现在原始训练语料库中的频率较低的单词。

仅提及很少的单词往往都不会获得很好的单词向量,并且抛出很多很少出现的单词通常具有使其余单词向量更好的有益副作用。

如果您使用的是gensim Word2Vec类,则可以通过以下两种替代方法进行预训练:

  • 使用更大的min_count值。
  • 指定一个max_final_vocab计数-不超过该模型将保留的字数。

训练后,使用.save_word2vec_format()已保存的一组向量,您可以使用limit参数重新加载它们(仅加载最常见的前导单词),然后重新保存。例如:

from gensim.models import KeyedVectors
w2v_model = KeyedVectors.load_word2vec_format(allvecs_filename, binary=False, limit=500000)
w2v_model.save_word2vec_format(somevecs_filename, binary=False)

或者,如果您有一个list_of_words_to_keep,则可以加载完整文件(假设您有足够的RAM,则不加载limit),然后将模型的.vocab字典精简重新保存之前。例如:

from gensim.models import KeyedVectors
w2v_model = KeyedVectors.load_word2vec_format(allvecs_filename, binary=False)
vocab_set = set(w2v_model.vocab.keys())
keep_set = set(list_of_words_to_keep)
drop_set = vocab_set - keep_set
for word in drop_set:
    del w2v_model.vocab[word]
w2v_model.save_word2vec_format(somevecs_filename, binary=False)
相关问题