您引用的文章对该Doc2Vec
算法进行了合理的阐述,但其示例代码包含一个非常有害的反模式:train()
在循环中多次调用,同时手动管理alpha
. 这几乎不是一个好主意,而且很容易出错。
相反,不要更改默认值,只需使用所需的min_alpha
调用一次,并让方法顺利管理自身。train()
epochs
alpha
您的一般方法是合理的:根据一些先前的想法开发一种可重复的模型评分方法,然后尝试各种模型参数并选择得分最高的参数。
当您说您自己的两种准确度计算方法不匹配时,这有点令人担忧,因为该most_similar()
方法实际上会根据所有已知的文档向量检查您的查询点,并返回具有最大余弦相似度的那些。这些应该与您计算出的具有最小余弦距离的那些相同。如果您在问题中添加了您的确切代码——如何计算余弦距离,以及如何调用most_similar()
——那么很可能会清楚哪些细微的差异或错误是导致差异的原因。(不应该有任何本质上的区别,但考虑到:你可能想要使用most_similar()
结果,因为它们被称为非错误,
请注意,您不必保留一组已知高度相似的文档对。由于Doc2Vec
是一种无监督算法,因此您不会在训练期间为其提供首选的“确保这些文档相似”的结果。在全套文档上进行训练是相当合理的,然后选择最能捕捉您想要的最相似关系的模型,并相信包含更多文档实际上可以帮助您找到最佳参数。
(但是,这样的过程可能会稍微高估未来未见文档或其他一些假设的“其他 20K”训练文档的预期准确性。但根据您的训练数据,它仍然可以合理地找到“可能的最佳”元参数。)
(如果您在训练期间没有将它们全部喂完,那么在测试期间您将需要使用infer_vector()
看不见的文档,而不仅仅是从训练中查找学习到的向量。您还没有显示用于此类评分/推理的代码, 但这是另一个可能做错的步骤。如果您只是将所有可用文档的向量一起训练,则消除了出错的可能性。)
检查所需文档是否在最相似的前 5(或前 N)中只是对模型进行评分的一种方法。另一种方法是在一些原始的“段落向量”(Doc2Vec
)论文中使用,对于每一对这样的对,还选择另一个随机文档。每次报告已知相似文档比第三个随机选择的文档彼此更接近时,都将模型计算为准确。在最初的“段落向量”论文中,现有的搜索排名系统(它报告某些文本片段以响应相同的探测查询)或手工策划的类别(如在 Wikipedia 或 Arxiv 中)被用来生成这样的评估对:检查相同的搜索结果页面或相同的类别,以查看它们在模型中是否比其他随机文档“更接近”。
如果您的问题被扩展为更多地描述您尝试过的一些初始参数(例如您提供给Doc2Vec
和的完整参数train()
),以及似乎有帮助或有伤害的内容,则可能会建议其他范围值得检查的参数。