大规模文本分类


18

我想对我的文本数据进行分类。我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包(预处理,稀疏矩阵,分类器等),因此包之间的互操作性可能会成为问题,并且在将数据从一种格式转换为另一种格式时,可能会产生额外的开销。例如,如果我使用tm(或外部工具,例如WEKA)进行预处理,则需要找出一种方法来将该数据转换为R中的HPC库可以读取的形式。同样,对我来说还不清楚分类程序包是否将直接获取HPC库提供的数据。

我在正确的轨道上吗?更重要的是,我有道理吗?


R可以处理远远大于此的数据集,您只需要充分利用可用的工具即可。在任何主要语言或环境下可以完成的工作之间没有区别,尽管Weka和Mahout在可用的方面落后。FWIW,这是一个相当小的样本量,1M的尺寸也不算大,但从统计学上讲,这也太过分了。我的建议是R或Python,因为它们对于初学者都是免费且容易的。Matlab不是免费的,但还不错。当您使用大量计算机时,它还会产生高额税款。
Iterator

1
更为明显的一点是,每个类中的类比示例数多,并且将其嵌入到非常高的维数空间中。我不确定您在这里是否会获得很好的班级分离。您的班级有一些结构性关系吗?如果是这样,那么在没有这种洞察力的情况下,其中某些方法可能效果不佳。
Iterator

1
您可以使用该foreach库在R中编写并行代码。这与随机森林固有的并行化特别容易结合使用。
扎克(Zach)

2
几个问题:1)您是否有兴趣比较您提到的所有不同类型的学习方法,还是只需要一项就可以完成工作?2)每个文档是否属于1个,1个或多个或0个或多个类别?3)您是否出于某些原因特别想要使用功能选择,还是只是认为有必要?我同意其他评论意见,即按照今天的标准,这是一个中等规模的问题,因此不必缩减尺寸。
DavidDLewis

1
我正在从事涉及近10,000个主题的文本分类(例如,类或类别或您喜欢的任何术语)。我目前正在以这种规模调整此文本分类系统。我不能分享我自己的技术,因为它们是专有技术,但是我有一点建议:在假设某些建议的技术可以扩展之前,请务必谨慎,除非已经证明可以这样做。以我的经验,很少有人这样做。

Answers:


13

只要数据表示为稀疏数据结构(scipy.sparse.csr_matrix例如Python中的实例),就应该有可能使其工作。我写了一个处理文本数据的教程。通过利用散列技巧,还可以进一步减少内存使用:使其适应使用HashingVectorizer而不是CountingVectorizerTfidfVectorizer。文档部分的文本特征提取中对此进行了说明。

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

如果scikit-learn最终无法解决您的问题,那么Vowpal Wabbit会(尽管可能不会实现您正在谈论的所有模型)做到这一点(并且可能比sklearn更快)。

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


使用任何“非标准”尺寸缩减技术的问题是,当您尝试发布作品时,您可能会遇到麻烦。至少在文本分类领域,我知道一个事实,即审阅者喜欢看到常用的技术(也使得与现有分类技术的比较更加容易)。
user721975 2011年

不用担心-@ogrisel并没有提到任何非标准的东西,至少没有涉及到最先进的文本分类,尽管我尚未阅读他的教程。
Iterator

+1我认为Python可能是一种令人愉快的方式。R中有一些用于文本挖掘的最新软件包,但是如果其中一个具有比统计专业知识和兴趣更大的计算能力,Python是我的推荐。
Iterator

@ogrisel:感谢您和其他人对sklearn所做的贡献。我已经向许多使用Python的人推荐了它-整个设计是典范。
Iterator

至于“非标准” 维(使用随机投影)和特征哈希,请检查John Langford 的哈希技巧以及有关metaoptimize的讨论
ogrisel

10

Gensim for Python是神奇的。而且由于它是Python语言,因此可以将其与@ogrisel的建议结合使用。


1

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

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

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

Logistic回归将在许多方面造成窒息。朴素贝叶斯(Naive Bayes)假定尺寸独立,所以您会没事的。SVM并不取决于维度的数量(而是取决于支持向量的数量),因此也可以。

300是很多课程。我将只从几个开始,然后逐步发展。


很好的指导和建议。谢谢。您能否详细说明“仅从几个开始然后逐步提高”的意思?
2011年

好吧,您可以将它们重新分类为较小的数字,例如“琴弦,黄铜”,而不是300类(例如“小提琴,中提琴,大提琴,小号...”)。
尼尔·麦圭根

好,我明白了。
user721975 2011年

1

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

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

包括WEKAKNIME在内的几个开源机器学习套件包括SVM和逻辑回归。支持向量机的独立实现包括LIBSVMSVMlight。对于逻辑回归,我将插入由Madigan,Genkin等开发的BXRtrain和BXRclassify。BXRclassify可以建立成千上万的逻辑回归模型的内存索引,并同时应用它们。

至于将文本转换为属性矢量形式,我总会以某种方式最终编写一些Perl从头开始。:-)但是我认为我提到的机器学习套件包括令牌化和矢量化代码。另一种方法是使用更多的自然语言工具包,例如LingPipe,尽管这可能对您来说过分了。


+1好评论。如果我要进行300次是/否分类,我该如何选择某班的负面训练数据?肯定数据显然是属于该类的文档。
user721975 2011年

另一条评论。SVM /物流规则肯定可以处理一百万个维度,但是如何运行实验为这些分类器选择参数呢?例如,在一个较小的数据集上,您可以运行10倍交叉验证来确定参数,但是对于如此大的数据,采用哪种方法才能使算法在合理的时间内完成运行?
user721975 2011年

@ user721975:对于特定的歧视,正面文件是带有标签X的文件,而负面文件是所有其余文件。
DavidDLewis 2011年

@ user721975:很难给出有关运行时间的一般建议,因为算法和实现之间的细节差异很大。10倍交叉验证对于您的数据集可能不是不切实际的:60000个示例并不重要。
DavidDLewis 2011年

1
不平衡的训练集不一定是问题。但是实际上我意识到我有些困惑:由于文档可以属于0、1或几个班级,每班有200个培训文档意味着什么?您是否采取了某些措施来删除0级或2级以上的文档?通常,您是如何生成这组60000个文档的?
DavidDLewis 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.