请提供建议。我有一组文档,这些文档都有一个共同的属性(例如,包含“法语”这个词),其中一些文档被标记为与该集合无关(例如,包含“法式接吻”),但并不是所有文档都保证已被识别。哪种方法最适合找出其他不属于该集合的文档?
回答:
假设
根据你的例子“法语”,我将假设特征是文档中出现的一个词。此外,由于你提到“法式接吻”不相关,我进一步假设在你的案例中,特征是一个在特定意义上使用的词。例如,如果“泳池”是特征,你可能会说提到游泳池的文档是相关的,但提到台球(如斯诺克或台球运动)的文档则不相关。
- 注意:虽然词义消歧(WSD)方法可以使用,但它们需要太多的努力,对于这个目的来说过于复杂。
建议:局部化语言模型 + 引导学习
可以这样想:你不是有一个不完整的训练集,而是一个较小的训练集。想法是利用这个小训练数据来构建更大的训练数据。这就是引导学习。
对于训练数据中特征的每次出现,仅基于其周围的词构建一个语言模型。你不需要为整个文档构建模型。理想情况下,只需包含特征的句子就足够了。这就是我所说的局部化语言模型(LLM)。
从你的训练数据(我们称之为T_0)构建两个这样的LLM:一个用于相关文档,称为M1,另一个用于不相关文档,称为M0。现在,为了构建更大的训练数据,基于M1和M0对文档进行分类。对于每个新文档d,如果d不包含特征词,它将自动被添加为“坏”文档。如果d包含特征词,则考虑d中这个词周围的局部窗口(使用构建LLM时使用的相同窗口大小),并计算这个词序列在M0和M1下的困惑度。将文档分类到困惑度较低的类别中。
为了形式化,伪代码如下:
T_0 := 初始训练集(包含相关/不相关文档)D0 := 需要引导学习的额外数据N := 引导学习的迭代次数for i = 0 to N-1 T_i+1 := 空训练集 使用窗口大小w按上述方法构建M0和M1 for d in D0 if 特征词不在d中 then 将d添加到T_i+1的不相关文档中 else 使用d中特征词周围的窗口大小w计算对应于M0和M1的困惑度得分P0和P1。 if P0 < P1 - delta 将d添加到T_i+1的不相关文档中 else if P1 < P0 - delta 将d添加到T_i+1的相关文档中 else 在T_i+1中不使用d end end end 从T_i+1的相关和不相关文档中随机选择一个小样本,并在需要时手动重新分类。end
- T_N是你的最终训练集。在上述引导学习中,参数delta需要通过在一些保留数据(也称为开发数据)上的实验来确定。
- 对小样本进行手动重新分类是为了避免在整个N次迭代中累积噪音。