【问题标题】:How to find outliers in document classification with million documents?如何在百万文档的文档分类中找到异常值?
【发布时间】:2020-04-11 21:39:39
【问题描述】:

我有一百万个属于不同类(100 个类)的文档。我想找到每个类中的异常文档(不属于该类但被错误分类)并过滤它们。我可以通过比较每个文档的标记来使用余弦相似度来做文档相似度。 我无法应用它来过滤给定类的错误分类文档。 示例:为简单起见,考虑 3 个类及其下的文档。

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

我如何才能有效且高效地确定 doc4(和其他类似文档)被错误地归类到 ClassA 中,以使我的训练数据不包含异常值?

【问题讨论】:

  • 类有标注吗?每个类有什么正式的定义吗?
  • 没什么。阅读每个班级的文档并了解班级将是一项人力密集型任务。我尝试使用 wordcloud,但不是很清楚。

标签: python machine-learning text-classification outliers cosine-similarity


【解决方案1】:

首先,您所描述的常用术语是“分类”。聚类是一种无监督建模形式,其中不知道类标签。因此,您的任务是将未标记的文档分类为一组已知类别中的一个,或分类为异常值的“未知”类别。

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

最佳方法和阈值的选择在很大程度上取决于数据的详细信息,因此您需要尝试几种方法,看看哪种方法最有效。

【讨论】:

    【解决方案2】:

    在这个问题中,你可以尝试Mahalanobis distance

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

    本质上,马氏距离试图从分布D 中找到点P 的距离。

    所以在你的情况下:

    1. 获取某个类的分布D

      首先,我们需要类中每个文档的向量表示。现在这可以通过多种方式来完成——在最基本的方式中,我们可以基于它的tf-idf 获得每个文档的矢量表示。然后我们可以使用这些向量计算类的mean 和协方差S

      更复杂的方法将通过一些文档表示模型(如Doc2Vec)来获取每个文档的矢量表示 - 阅读更多关于它的信息here

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

      获取每个文档的向量表示并使用公式计算它与D 的距离。您必须设置一些阈值,该阈值可以通过检查一些您非常确定自己是异常值的示例来确定。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        这是无监督学习中的一个难题。它通常被称为主题建模。您可以从运行 LDA(潜在狄利克雷分配)算法开始。我建议为此使用gensim 包。不要在所有数据上运行它,一开始需要 20-5 万个文档。在您拥有初始分类器之后,在数百万个文档中,您只选择那些被分类为属于某个类别且概率高于某个阈值的文档。再次训练LDA。这应该为您提供更好分离的课程。重新分类您的数据。

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

        您可以在不涉及人工贴标签的情况下完成所有这些工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-01
          • 1970-01-01
          • 2014-02-04
          • 2020-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多