如何在自训练的word2vec模型中删除单词
How to delete words in self-trained word2vec model
我得到了一个自训练的word2vec模型(2G,以“.model”结尾)。我将模型转换成文本文件(超过50G,以“.txt”结尾),因为我必须在我的其他python代码中使用文本文件。我试图通过删除不需要的单词来减小文本文件的大小。我已经建立了一个词汇集,其中包含我需要的所有单词。如何过滤模型中不需要的词?
我已尝试为文本文件构建字典,但我的 RAM 不足。
emb_dict = dict()
with open(emb_path, "r", encoding="utf-8") as f:
lines = f.readlines()
for l in lines:
word, embedding = l.strip().split(' ',1)
emb_dict[word] = embedding
我在想是否可以删除“.model”文件中的单词。我该怎么做?如有任何帮助,我们将不胜感激!
如果没有更精确的代码,很难进一步回答,但您可以批量分析文本文件
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 = []
通常,减小 word2vec 模型大小的最佳方法是丢弃更多原始训练语料库中出现的频率较低的词。
只有很少提及的词无论如何都不会得到很好的词向量,并且扔掉很多很少出现的词通常会产生有益的副作用,使剩下的词向量更好。
如果您正在使用 gensim
Word2Vec
class,则有两种替代方法(预训练)是:
- 使用更大的
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
,您可以加载完整文件(没有 limit
,假设您有足够的 RAM),但随后会缩小模型的 .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)
我得到了一个自训练的word2vec模型(2G,以“.model”结尾)。我将模型转换成文本文件(超过50G,以“.txt”结尾),因为我必须在我的其他python代码中使用文本文件。我试图通过删除不需要的单词来减小文本文件的大小。我已经建立了一个词汇集,其中包含我需要的所有单词。如何过滤模型中不需要的词?
我已尝试为文本文件构建字典,但我的 RAM 不足。
emb_dict = dict()
with open(emb_path, "r", encoding="utf-8") as f:
lines = f.readlines()
for l in lines:
word, embedding = l.strip().split(' ',1)
emb_dict[word] = embedding
我在想是否可以删除“.model”文件中的单词。我该怎么做?如有任何帮助,我们将不胜感激!
如果没有更精确的代码,很难进一步回答,但您可以批量分析文本文件
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 = []
通常,减小 word2vec 模型大小的最佳方法是丢弃更多原始训练语料库中出现的频率较低的词。
只有很少提及的词无论如何都不会得到很好的词向量,并且扔掉很多很少出现的词通常会产生有益的副作用,使剩下的词向量更好。
如果您正在使用 gensim
Word2Vec
class,则有两种替代方法(预训练)是:
- 使用更大的
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
,您可以加载完整文件(没有 limit
,假设您有足够的 RAM),但随后会缩小模型的 .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)