1亿个文档属于不同的类。我想在每个类(不属于该类但被错误分类)中查找异常文档并过滤它们。通过比较每个文档的标记,我可以使用余弦相似性来做文档相似性。
我不能应用这个来过滤给定类的错误分类文档。
示例:为了简单起见,考虑3个类及其下的文档。在
ClassA ClassB ClassC ...
doc1 doc2 doc3
doc4 doc5 doc6
doc7 doc8 doc9
我怎样才能有效和高效地找出doc4(以及其他类似的文档)被错误地分类在ClassA中,从而使我的培训数据不包含离群值?在
Tags:
在这个问题中,你可以尝试类似Mahalanobis distance的方法。在
(我不能在这里添加公式作为图像,因为我没有足够的声誉-请检查等式-我将尝试解释下面的想法)
从本质上讲,Mahalanobis距离试图从分布
D
找到一个点P
的距离。在所以在你的情况下:
获取类的分布
D
首先,我们需要类中每个文档的向量表示。现在可以用各种方法来实现这一点——最基本的方法是,我们可以根据每个doc的tf-idf得到一个向量表示。然后我们可以使用这些向量计算类的
mean
和协方差S
。在更复杂的方法是通过一些文档表示模型(如Doc2Vec)来获得每个文档的向量表示—请阅读有关它的更多信息here。
计算类中每个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个类中的每一个。但通常,那些同时属于多个类的概率很高的类被严重分类。在
你可以做到这一切,而不涉及人类的标签。在
相关问题 更多 >
编程相关推荐