如何在百万文档的文档分类中发现异常值?

2024-09-29 19:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

1亿个文档属于不同的类。我想在每个类(不属于该类但被错误分类)中查找异常文档并过滤它们。通过比较每个文档的标记,我可以使用余弦相似性来做文档相似性。 我不能应用这个来过滤给定类的错误分类文档。 示例:为了简单起见,考虑3个类及其下的文档。在

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

我怎样才能有效和高效地找出doc4(以及其他类似的文档)被错误地分类在ClassA中,从而使我的培训数据不包含离群值?在


Tags: 文档标记示例错误doc1分类相似性个类
3条回答

在这个问题中,你可以尝试类似Mahalanobis distance的方法。在

我不能在这里添加公式作为图像,因为我没有足够的声誉-请检查等式-我将尝试解释下面的想法

从本质上讲,Mahalanobis距离试图从分布D找到一个点P的距离。在

所以在你的情况下:

  1. 获取类的分布D

    首先,我们需要类中每个文档的向量表示。现在可以用各种方法来实现这一点——最基本的方法是,我们可以根据每个doc的tf-idf得到一个向量表示。然后我们可以使用这些向量计算类的mean和协方差S。在

    更复杂的方法是通过一些文档表示模型(如Doc2Vec)来获得每个文档的向量表示—请阅读有关它的更多信息here

  2. 计算类中每个doc的Mahalanobis距离

    取每个doc的向量表示,并使用公式计算它与D之间的距离。你必须设置一些阈值,这个阈值可以通过检查几个例子来决定,你很确定自己是一个离群值。在

    甚至可以在某种程度上实现自动化——您可以计算每个doc的距离并从这些距离中得到一个分布(比如Weibull distribution)。

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

由于您有100个类的标签,这在原则上是一个相当标准的outlier detection问题,您需要找到与大多数带有相同标签的文档不相似的文档。在

正如您所建议的那样,您可以使用余弦相似度(我假设在字数方面)来对文档对的相似性进行评分。余弦相似度涉及到许多实际问题,例如重要单词的选择,stemming,停止词等等,您也可以通过soft cosine similarity来考虑单词的相似性。在

计算这么大的语料库的所有余弦相似度是不切实际的,因此您需要以某种方式总结每个类。一个简单的方法是平均每个文档类型的字数,并测量此模型文档与类中每个成员之间的相似度,因此,要对每个文档评分,只需计算一个余弦相似度。您应该拒绝某些选定的百分位文档作为潜在的错误分类,阈值与您期望的错误分类文档的百分比相当。显然,更高的阈值将消除更多错误,但也更正确地分类文档。在

一个更好的实现可能是对100种文档分别应用fast clustering algorithm。每个集群中的平均字数将为每个标签提供一些模型文档,您应该使用最高的相似度作为每个文档的分数。在

这是无监督学习中的一个难题。它通常被称为主题建模。可以从运行LDA(潜在Dirichlet分配)算法开始。我建议使用gensim包来实现这一点。不要对所有的数据都运行它,一开始就取2-5万个文档。在您有了初始分类器之后,在数百万个文档中,您只选择了那些被分类为属于某个类且概率高于某个阈值的文档。再训练一下LDA。这会给你更好的分离类。重新分类你的数据。在

LDA算法以“软”的方式对文档进行分类,因此每个文档都有一定的概率属于您的100个类中的每一个。但通常,那些同时属于多个类的概率很高的类被严重分类。在

你可以做到这一切,而不涉及人类的标签。在

相关问题 更多 >

    热门问题