Gensim Doc2Vec most_similar() 方法未按预期工作
Gensim Doc2Vec most_similar() method not working as expected
我正在与 Doc2Vec 作斗争,我看不出我做错了什么。
我有一个带有句子的文本文件。我想知道,对于给定的句子,我们可以在该文件中找到的最接近的句子是什么。
下面是创建模型的代码:
sentences = LabeledLineSentence(filename)
model = models.Doc2Vec(size=300, min_count=1, workers=4, window=5, alpha=0.025, min_alpha=0.025)
model.build_vocab(sentences)
model.train(sentences, epochs=50, total_examples=model.corpus_count)
model.save(modelName)
出于测试目的,这是我的文件:
uduidhud duidihdd
dsfsdf sdf sddfv
dcv dfv dfvdf g fgbfgbfdgnb
i like dogs
sgfggggggggggggggggg ggfggg
这是我的测试:
test = "i love dogs".split()
print(model.docvecs.most_similar([model.infer_vector(test)]))
无论训练什么参数,这显然应该告诉我最相似的句子是第 4 个(SENT_3 或 SENT_4,我不知道他们的索引是如何工作的,但是句子标签是这种形式)。但这是结果:
[('SENT_0', 0.15669342875480652),
('SENT_2', 0.0008485736325383186),
('SENT_4', -0.009077289141714573)]
我错过了什么?如果我尝试使用相同的句子(我喜欢狗),我有 SENT_2,然后 1 然后 4...我真的不明白。为什么数字这么低?当我连续 运行 几次加载时,我也没有得到相同的结果。
感谢您的帮助
Doc2Vec
在 toy-sized 示例上效果不佳。 (已发表的作品对数百万文本使用 tens-of-thousands,甚至 gensim
中的微小单元测试也使用 hundreds-of-texts,结合 much-smaller 矢量 size
等等 iter
个纪元,得到 just-barely 可靠的结果。)
因此,我不希望您的代码具有一致或有意义的结果。在以下情况下尤其如此:
- 用小数据维护一个大向量
size
(允许严重的模型过度拟合)
- 使用
min_count=1
(因为没有很多不同用法示例的词无法获得好的向量)
- 将
min_alpha
更改为与较大的起始 alpha 保持相同(因为随机梯度下降学习算法的 usually-beneficial 行为依赖于此 update-rate 的逐渐衰减)
- 使用只有几个词的文档(因为 doc-vectors 的训练与它们包含的词数成比例)
最后,即使其他一切正常,infer_vector()
通常受益于比默认 5(数十或数百)更多的 steps
,有时 alpha
不太像它的推理默认值 (0.1),更像训练值 (0.025)。
所以:
- 不要更改
min_count
或 min_alpha
- 获取更多数据
- 如果不是 tens-of-thousands 文本,请使用更小的向量
size
和更多 epochs
(但意识到小数据集的结果可能仍然很弱)
- 如果每个文本都很小,使用更多
epochs
(但意识到结果可能仍然比较长的文本弱)
- 尝试其他
infer_vector()
参数,例如 steps=50
(或更多,尤其是小文本)和 alpha=0.025
我正在与 Doc2Vec 作斗争,我看不出我做错了什么。 我有一个带有句子的文本文件。我想知道,对于给定的句子,我们可以在该文件中找到的最接近的句子是什么。
下面是创建模型的代码:
sentences = LabeledLineSentence(filename)
model = models.Doc2Vec(size=300, min_count=1, workers=4, window=5, alpha=0.025, min_alpha=0.025)
model.build_vocab(sentences)
model.train(sentences, epochs=50, total_examples=model.corpus_count)
model.save(modelName)
出于测试目的,这是我的文件:
uduidhud duidihdd
dsfsdf sdf sddfv
dcv dfv dfvdf g fgbfgbfdgnb
i like dogs
sgfggggggggggggggggg ggfggg
这是我的测试:
test = "i love dogs".split()
print(model.docvecs.most_similar([model.infer_vector(test)]))
无论训练什么参数,这显然应该告诉我最相似的句子是第 4 个(SENT_3 或 SENT_4,我不知道他们的索引是如何工作的,但是句子标签是这种形式)。但这是结果:
[('SENT_0', 0.15669342875480652),
('SENT_2', 0.0008485736325383186),
('SENT_4', -0.009077289141714573)]
我错过了什么?如果我尝试使用相同的句子(我喜欢狗),我有 SENT_2,然后 1 然后 4...我真的不明白。为什么数字这么低?当我连续 运行 几次加载时,我也没有得到相同的结果。
感谢您的帮助
Doc2Vec
在 toy-sized 示例上效果不佳。 (已发表的作品对数百万文本使用 tens-of-thousands,甚至 gensim
中的微小单元测试也使用 hundreds-of-texts,结合 much-smaller 矢量 size
等等 iter
个纪元,得到 just-barely 可靠的结果。)
因此,我不希望您的代码具有一致或有意义的结果。在以下情况下尤其如此:
- 用小数据维护一个大向量
size
(允许严重的模型过度拟合) - 使用
min_count=1
(因为没有很多不同用法示例的词无法获得好的向量) - 将
min_alpha
更改为与较大的起始 alpha 保持相同(因为随机梯度下降学习算法的 usually-beneficial 行为依赖于此 update-rate 的逐渐衰减) - 使用只有几个词的文档(因为 doc-vectors 的训练与它们包含的词数成比例)
最后,即使其他一切正常,infer_vector()
通常受益于比默认 5(数十或数百)更多的 steps
,有时 alpha
不太像它的推理默认值 (0.1),更像训练值 (0.025)。
所以:
- 不要更改
min_count
或min_alpha
- 获取更多数据
- 如果不是 tens-of-thousands 文本,请使用更小的向量
size
和更多epochs
(但意识到小数据集的结果可能仍然很弱) - 如果每个文本都很小,使用更多
epochs
(但意识到结果可能仍然比较长的文本弱) - 尝试其他
infer_vector()
参数,例如steps=50
(或更多,尤其是小文本)和alpha=0.025