我正在测试用相同的整体词汇量喂养 gensim 的 Word2Vec 不同句子,看看是否有些句子比其他句子携带“更好”的信息。我训练 Word2Vec 的方法是这样的
def encode_sentences(self, w2v_params, sentences):
model = Word2Vec(sentences, **w2v_params)
idx_order = torch.tensor([int(i) for i in model.wv.index2entity], dtype=torch.long)
X = torch.zeros((idx_order.max()+1, w2v_params['size']), dtype=torch.float)
# Put embeddings back in order
X[idx_order] = torch.tensor(model.wv.vectors)
return X, y
我在这里希望的是,每次运行 w2v 时,它都会从一个新模型开始并从头开始训练。但是,我正在测试 3 种句子,所以我的测试代码如下所示:
def test(sentence):
w2v = {'size': 128, 'sg': 1}
X = encode_sentences(w2v, sentence)
evaluate(X) # Basic cluster analysis stuff here
# s1, s2 and s3 are the 3 sets of sentences with the same vocabulary in different order/frequency
[print(test(s) for s in [s1, s2, s3]]
但是,我注意到如果我删除其中一个测试集,并且只测试s1和s2(或三者中的两组的任意组合),则聚类的整体质量会下降。如果我在调用之前返回encode_sentences并添加,整体集群质量也会下降,但无论测试多少数据集都保持一致。del modelreturn
是什么赋予了?构造函数实际上不是每次都使用新权重构建新模型吗?文档和源代码没有说明这一点。我很确定这不是我的评估方法,因为del model添加后一切都已修复。我在这里不知所措......这些运行实际上是独立的,还是每次调用都Word2Vec(foo, ...)相当于用新数据重新训练以前的模型foo?
在你问之前,nomodel不在变量范围之外encode_sentence;那是整个程序中唯一一次使用变量名。很奇怪。
UYOU
相关分类