我正在尝试使用 doc2vec 根据文档主题进行文本分类,例如,我想将所有有关体育的文档分类为 1,将所有其他文档分类为 0。我想通过首先使用训练数据训练 doc2vec 模型,然后使用逻辑回归等分类模型将文本分类为正或负来做到这一点。
我在网上看到了各种例子来做到这一点[1,2],它们采用了不同的方法,我不清楚他们为什么使用某些方法的一些细节,以及哪种方法最适合文本分类。
首先,使用上面的例子,是否最好只使用与体育相关的文档或所有主题的文档来训练模型。我的想法是,通过只对体育文档进行训练,你可以根据文档相似性对文档进行分类(尽管这不会为非体育文档生成用于训练下一个模型的向量)。此外,我觉得如果在所有文档上训练模型,您将需要大量文档来表示运动以外的所有内容才能获得良好的分类。
其次,哪些特征实际用于训练逻辑回归模型。如果在所有文档上训练模型,我假设您将使用某种索引跟踪文档,然后使用带有类标签的向量训练逻辑回归模型,这是正确的吗?
第三,我看到了 TaggedDocument 的各种用途,其中为每个文档放置一个唯一的 id,并且使用共享 id 来表示同一类,例如,1 = 体育 0 = 非体育。从我所读到的内容来看,共享 id 意味着模型有一个代表每个类的向量,而使用唯一 id 为每个文档提供唯一的向量,这是正确的吗?如果是这样,假设我需要唯一的标记向量来训练逻辑回归模型,使用共享 id 有什么意义?这不会提供可怕的分类结果吗?
如果有人可以帮助我解决上述问题,以及通常使用 doc2vec 向量进行文本分类的最佳方法是什么,我们将不胜感激。
gensim
中包含一个使用Doc2Vec
进行情绪分类的示例,非常接近您的需求。看:
https://github.com/RaRe-Technologies/gensim/blob/bcee414663bdcbdf6a58684531ee69c6949550bf/docs/src/gallery/howtos/run_doc2vec_imdb.py
(它可能比您链接的其他教程更好。特别是,您链接的第二个教程当前在其误导的循环调用中多次train()
alpha
管理不善。
特别是关于您的问题:
(1)在所需类内外使用尽可能多的数据进行训练。一个只看到"正面"示例的模型不太可能从与它所训练的文档完全不同的文档中生成有意义的向量。(特别是,对于像Doc2Vec
这样的模型,它只知道在训练期间看到的单词,如果你稍后尝试推断具有未知单词的新文档的向量,这些单词将被完全忽略。
(2)是的,(任何算法的)分类器被馈送特征和已知标签。然后,它学习从这些特征中推断出这些标签。
(3) 传统上,Doc2Vec
每个文档使用一个唯一的 ID "标签"进行训练,并且没有已知标签信息。因此,每个文档都有自己的向量,并且该过程完全"无监督"。可以改为为文档提供多个标签,或在多个文档上使用相同的标签。而且,您可以使这些标签与已知标签匹配 - 这样所有"体育"文档都共享'sports'
标签(除了它们的唯一 ID 之外,或者代替它)。但是,与简单的每个文档一个 ID 标签的情况相比,这样做会增加许多其他复杂性。所以我不建议在这个方向上尝试任何事情,直到你得到更简单的案例工作。(我见过一些情况,将已知标签混合为额外的标签会有所帮助,特别是在多类分类问题中,其中此类额外标签仅适用于所有文档的一小部分。但这并不能保证 - 因此只有在您有一个工作简单的基线和可重复的方式来评估替代模型之后,才有意义地对其进行修补。