大规模文本分类

机器算法验证 机器学习 分类 文本挖掘
2022-02-06 15:51:23

我正在寻找对我的文本数据进行分类。300 classes每个班级有 200 个训练文档(所以60000 documents in total),这可能会产生非常高维的数据(我们可能会查看超过100 万维)。

我想在管道中执行以下步骤(只是为了让您了解我的要求是什么):

  1. 将每个文档转换为特征向量(tf-idfvector space model
  2. Feature selectionMutual Information基于优选,或任何其他标准)
  3. 训练分类器SVMNaive BayesLogistic RegressionRandom Forest
  4. 根据训练的分类器模型预测看不见的数据。

所以问题是我使用什么工具/框架来处理这样的高维数据?我知道通常的嫌疑人(R,WEKA ...),但据我所知(我可能错了)可能没有一个人可以处理这么大的数据。还有其他我可以查看的现成工具吗?

如果我必须并行化它,我应该看看Apache Mahout吗?看起来它可能还没有提供我需要的功能。

提前感谢大家。


更新:我浏览了这个网站、R 邮件列表和整个互联网。在我看来,我的情况可能会出现以下问题:

(1) 使用 R(特别是tm包)对我的数据进行预处理可能是不切实际的,因为tm速度会非常慢。

(2) 由于我需要使用一组 R 包(预处理、稀疏矩阵、分类器等),因此包之间的互操作性可能会成为问题,并且在将数据从一种格式转换为另一种格式时可能会产生额外的开销. 例如,如果我使用(或像 WEKA 之类的外部工具)进行预处理,tm我将需要找到一种方法将这些数据转换为 R 中的 HPC 库可以读取的形式。我也不清楚分类器包是否会直接接收 HPC 库提供的数据。

我在正确的轨道上吗?更重要的是,我说得通吗?

4个回答

只要将数据表示为稀疏数据结构(scipy.sparse.csr_matrix例如 Python 中的实例),这应该可以使其工作。我写了一个处理文本数据的教程通过利用散列技巧可以进一步减少内存使用量:调整它以使用 theHashingVectorizer而不是 theCountingVectorizer或 the TfidfVectorizer这在文档部分文本特征提取中进行了解释。

随机森林通常比线性模型(例如线性支持向量机和逻辑回归)和多项式或伯努利朴素贝叶斯要昂贵得多,并且对于大多数文本分类问题而言,它们并没有比简单模型带来明显更好的预测精度。

如果 scikit-learn 最终无法扩展到您的问题,Vowpal Wabbit会做(并且可能比 sklearn 更快),尽管它没有实现您正在谈论的所有模型。

2015 年 4 月编辑以反映 scikit-learn 库的当前状态并修复损坏的链接。

Python 的Gensim很神奇。由于它是在 Python 中的,因此您可以将它与 @ogrisel 的建议结合使用。

不要自吹自擂,但我用 Rapidminer 制作了一个非常受欢迎的关于文本分析的视频系列。你可以在这里看到它:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

您可以避免进行特征选择,只需使用不会在内存中创建百万 * 百万矩阵的分类器 :)

逻辑回归会在这么多维度上窒息。朴素贝叶斯假设独立维度,所以你会没事的。SVM 不依赖于维数(但依赖于支持向量的数量),所以它也可以。

虽然300是很多课程。我会从几个开始,然后逐步上升。

首先,根据您的评论,我会将其视为 300 个二进制(是/否)分类问题。有许多易于使用的开源二进制分类器学习器,这让您可以用时间换取内存。

SVM 和逻辑回归可能是最流行的文本分类方法。两者都可以轻松处理 1000000 维,因为现代实现使用稀疏数据结构,并包括避免过度拟合的正则化设置。

包括WEKAKNIME在内的几个开源机器学习套件包括SVM 和逻辑回归。SVM 的独立实现包括libSVMSVMlight对于逻辑回归,我将插入我与 Madigan、Genkin 和其他人一起开发的BXRtrain 和 BXRclassify 。BXRclassify 可以构建数千个逻辑回归模型的内存索引并同时应用它们。

至于将文本转换为属性向量形式,我总是以某种方式最终编写一点 Perl 来从头开始。:-) 但我认为我提到的机器学习套件包括标记化和矢量化代码。另一种方法是使用更多像LingPipe这样的自然语言工具包,尽管这对你来说可能是矫枉过正。