doc2vec 是否适用于每个 class 只有 1 个样本的多 class 问题?

Does doc2vec work with multi-class problem with only 1 sample per class?

我有一个测试句子(定义了一项技能,例如 "Perform equipment maintenance")和一组文凭(10000 个不同的文凭),其中描述了所需的技能(=每个文凭 1 段)。我的问题在于找到在语义相似度方面最接近测试句子的文凭。

我考虑创建一个doc2vec模型(multi-class,每个文凭1 class)以便将每个文凭转换为特征向量,然后推断测试句子的向量并计算余弦与每个特征向量的相似性。然而,我每个文凭只有一个样本。它还会工作吗? 或者我是否必须拆分每个文凭文本的句子以获得文凭的多个样本?

请注意,您的 "one descriptive paragraph per diploma-type" 数据集通常不会被描述为 "multi-class" 问题。术语 "multi-class" 通常描述的是每个项目本身应用了多个 class/label 的情况。

但是,您所描述的方法可能会很有成效,要知道哪种方法更适合您的数据和目标,唯一的方法就是相互评估它们(和其他变体)。

具体来说:

正如您所描述的,您可以在 10,000 个简短文档上训练一个 Doc2Vec 模型,每个文档都描述了不同的文凭。 (这对于 Doc2Vec 训练数据来说有点小,但也许足够了。使用较小的文档向量大小——比如 100 维或更少——and/or 更多训练 epochs 有时可以帮助压缩从较小的数据集中获得更好的结果。)您现在将拥有 10,000 个文档向量,每个 document/diploma.

然后对于任何新的测试文档——你的技能句子——你会计算另一个文档向量。您可以使用 gensim Doc2Vec infer_vector() 方法来执行此操作。 (请注意,特别是对于短文本,您可能希望使用远远超过此计算的默认数量 epochs。)

然后,您将在模型中搜索前 10,000 个文档向量中最接近您的新向量的模型 - 您可能会发现最接近的匹配项或前 N 个最接近的匹配项之一是一个很好的适合你的需要。

但是,还有一些其他变体需要考虑:

  • 如果实际上你的diploma-description都是多句——说几十甚至几百个词——而你的skill-sentences比较短——说几到十几两个词——那么也许与您的测试句子的最佳匹配将只是较长段落的 子集 。在这种情况下,可能 最初在较小的文本片段上训练模型会有所帮助。例如,如果 diploma-docs 每个都是 5 个句子,也许您训练模型以了解 50,000 个单独的 doc-vectors。测试一个技能句子将同时找到前 N 个最接近的匹配项, 然后 查找附近的描述句子是关于哪个文凭的。

  • 如果你的技能语句很多,而且在训练时也可用,你也可以将它们也包含在模型训练中。例如,也许除了您的 10,000 个文凭描述之外,您还有 20,000 个技能语句。您可以让初始模型学习 30,000 个文档向量。然后,您可以在根本不使用 infer_vector() 的情况下查找最接近技能文档向量的文凭文档向量——只需使用在模型训练期间学习的技能文档向量——但你有从 most_similar() 列表中过滤掉其他 skill-doc-vector 结果。 (您仍然可以选择对出现的任何新文本使用 infer_vector(),但在初始训练中包含更多文本 可能 使整体模型更具表现力。)

  • 而不是简单地将任何探测技能句子映射到最接近 Doc2Vec 坐标 space 的单个文凭段落,如果您已经有许多经过人工审查的示例of which-skill-sentences should be associate with which-diploma-paragraphs,您可以使用第二步监督分类器算法。也就是说,您只会使用 Doc2Vec 为文本创建特征向量,但通过另一个训练过程为文本学习 "labels"(文凭类型)。有许多潜在的分类器算法,它们需要大量数据,但如果有足够的数据,一些算法可能有更好的机会学习基础数据中的不规则形状,例如,当某个文凭标签应该根据历史示例覆盖时"more" 的技能-space 比简单的文本向量距离表示的要多。