如何在分类百万个文档时找到异常值?

4

我有一百个类别(100 classes)的上百万篇文档。我想要找出每个类别中的异常文档,也就是那些不属于该类别但被错误分类到该类别下的文档,并将其过滤掉。我可以使用余弦相似度(cosine similarity)来比较每篇文档中单词的相似性,以此来检测文档之间的相似性。 但是,我无法将其应用到过滤给定类别下被错误分类的文档上。 例如:为了简化问题,我们考虑只有三个类别以及它们所包含的文档。

ClassA  ClassB  ClassC ... 
doc1    doc2    doc3 
doc4    doc5    doc6 
doc7    doc8    doc9 

我该如何高效、有效地确定doc4(以及其他类似的文档)被错误地分类在ClassA中,以便我的训练数据不包含异常值?


这些类有标签吗?每个类都有正式的定义吗? - RobustPath004
没有什么特别的。阅读每个类的文档并了解该类将是一项人力密集型任务。我尝试使用词云,但没有太多的清晰度。 - Gaurav Chawla
4个回答

3
这是无监督学习中的难题,通常称为主题建模。您可以通过运行LDA(潜在狄利克雷分配)算法来开始。我建议使用gensim包。不要在所有数据上运行它,刚开始只选取20-50万篇文档。在您拥有初始分类器之后,从数百万份文件中仅选择那些被分类为属于某个类别且概率超过某个阈值的文件。再次对这些文件运行LDA进行训练。这应该会给您更好地区分的类别。重新对数据进行分类。
LDA算法以“软”方式对文档进行分类,因此每个文档都有一定的概率属于您的100个类别之一。但通常,那些同时具有高概率属于多个类别的文档会被错误地分类。
您可以在没有涉及人工标注者的情况下完成所有这些操作。

3
由于您有100个类别的标签,因此原则上这是一个相当标准的离群值检测问题,您需要找到不像大多数带有相同标签的文档的文档。
正如您所建议的那样,您可以使用余弦相似度(我假设是在单词计数上)来评分一对文档的相似性。余弦相似度涉及许多实际问题,例如选择重要单词、词干提取、停用词等,您还可以考虑通过软余弦相似度来考虑单词相似性。
对于如此大的语料库,计算所有余弦相似度是不切实际的,因此您需要以某种方式总结每个类别。一个简单的方法是对每个文档类型的单词计数进行平均,并测量该模型文档与类别中每个成员之间的相似性,因此要评分每个文档,您只需要计算一个余弦相似度。您应该拒绝一些被选择的文档百分位作为潜在的分类错误,阈值应与您预期的错误分类文档的百分比相当。显然,更高的阈值将消除更多的错误,但也会消除更多正确分类的文档。
更好的实现方法可能是将快速聚类算法分别应用于100种文档中的每一种。每个簇内的平均单词计数将为您提供每个标签的少量模型文档,并且您应该使用最高的相似性作为每个文档的分数。

1
在这个问题中,你可以尝试使用类似马哈拉诺比斯距离的方法。
我无法在这里添加图像方程,因为我没有足够的声望——请检查公式——我将尝试解释下面的想法
实质上,马哈拉诺比斯距离试图找到点P与分布D之间的距离。
所以在你的情况下:
  1. 获取一个类别的分布 D

    首先,我们需要每个文档的向量表示。这可以通过各种方式完成-在最基本的方式中,我们可以根据其tf-idf获取每个文档的向量表示。然后,我们可以使用这些向量计算类别的平均值和协方差S

    更复杂的方法是通过一些文档表示模型(如Doc2Vec)传递每个文档以获取其向量表示-在此处了解更多信息。

  2. 计算类别中每个文档的马氏距离

    获取每个文档的向量表示,并使用公式计算其与D之间的距离。您需要设置一些阈值,可以通过检查您非常确定是异常值的几个示例来决定。

    即使这也可以在某种程度上自动化-您可以为每个文档计算距离并从这些距离中获得分布(如Weibull distribution)。

我必须补充说明,这种方法的有效性取决于类中离群值的比例 - 离群值越多,它们对分布D的影响就越大。

0

首先,你所描述的通常术语是“分类”。聚类是一种无监督建模形式,其中没有已知的类标签。因此,你的任务是将未标记的文档分类为一组已知的类之一,或者对于异常值进行分类到一个“未知”类。

其次,你有许多“异常值检测”的选项!其中一个就是你所建议的:对文档进行分类,并将距离最近类别较远的任何内容定义为异常值(例如使用标准差)。或者,如果你使用概率分类器(如朴素贝叶斯),则可以将具有非常低最大似然度的文档定义为异常值。

最佳方法和阈值的选择非常取决于数据的细节,因此你需要尝试几种方法并查看哪种方法最有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接