R对文本分类任务的缩放程度如何?[关闭]


30

我试图与R同步。最终我想使用R库进行文本分类。我只是想知道人们在进行文本分类时对R的可伸缩性有何经验。

我可能会遇到高维数据(约30万维)。我正在研究使用SVM和随机森林作为分类算法。

R库会扩展到我的问题规模吗?

谢谢。

编辑1:只是为了澄清,我的数据集可能有1000-3000行(也许更多)和10个类。

编辑2:由于我是R的新手,因此我将要求海报在可能的情况下更加具体。例如,如果您建议一个工作流程/管道,请确保尽可能提及每个步骤中涉及的R库。一些额外的指针(例如示例,示例代码等)将锦上添花。

编辑3:首先,谢谢大家的评论。其次,我很抱歉,也许我应该为这个问题提供更多的背景信息。我是R的新手,但对文本分类却不太了解。我已经使用tm包对我的数据的某些部分进行了预处理(删除,删除停用词,tf-idf转换等),以使您对事物有所了解。即使只有大约200个文档,tm也是如此缓慢,以至于我担心可伸缩性。然后我开始玩FSelector,即使那真的很慢。这就是我进行操作的关键所在。

编辑4:我刚想到我有10个班级,每个班级大约有300份培训文档,实际上我是在整个培训集中构建termXdoc矩阵,从而产生了很高的维度。但是,如何将每个千分之一分类问题简化为一系列二进制分类问题呢?这将大大减少k-1步骤每一步的培训文档的数量(并因此减少维度),不是吗?那么这是一种好方法吗?与普通的多类实现相比,它的准确性如何?


1
300k尺寸,有多少行?不幸的是,R对象必须在内存中(至少除非您考虑进行重大调整,否则基本上需要您自己重写这些算法)。这意味着,例如,有8个演出的RAM,我认为您不能存储超过300行的几百行。
crayola 2011年

@crayola:行数可以在1000-3000之间变化。
安迪(Andy)

2
R对象不需要在内存中。内存映射非常简单。300k尺寸不是问题。我还假定您的数据稀疏,因为几乎所有文本问题都是这种情况。
Iterator

我刚刚注意到上面的评论:只有1000-3000行?那很小。您能解释一下您的语料库吗?一批电子邮件?在CRAN中的软件包描述?P >> N的统计问题可能要多于任何存储问题。
Iterator

1
@Iterator:我们要分类一些教育资源(学期论文,论文等)。
安迪

Answers:


17

根据评论的要求,以下是一些处理步骤的指针。在自然语言处理CRAN任务视图中可以找到许多工具。您可能还想看看有关R tm(文本挖掘)包的本文

  1. 在处理之前,请考虑单词令牌的标准化。 openNLP(有一个R包)是一条路线。
  2. 对于文本处理,通常的预处理步骤是通过tf.idf-词频*反向文档频率- 标准化数据- 有关更多详细信息,请参见Wikipedia条目。还有其他最近的标准化方法,但这是一种面包和黄油方法,因此了解它很重要。您可以在R中轻松实现它:只需存储(docID,wordID,freq1,freq2),其中freq1是由wordID索引的单词出现在给定文档中的次数,而freq2是出现在其中的文档数量。无需为未出现在给定文档中的单词存储此向量。然后,只要取freq1 / freq2,就可以得到tf.idf值。
  3. 计算tf.idf值后,您可以使用数据的完整维度,或过滤掉那些本质上无用的单词。例如,仅出现在1个文档中的任何单词都不会提供太多洞察力。这可能会大大降低尺寸。考虑到要检查的文档数量很少,您可能会发现缩小到1K尺寸是合适的。
  4. 我不会同时更新数据(例如,对于PCA),但是您可以使用Matrix软件包支持的稀疏矩阵轻松地将数据现在存储在术语矩阵(条目现在为tf.idf值)中。

至此,您已经有了一个很好的预处理数据集。我建议继续使用CRAN任务视图或文本挖掘程序包中引用的工具。绘制数据时,例如通过投影到前4个或6个主成分上来对数据进行聚类可能对您的团队非常有趣。

另一件事:使用各种分类方法时,您可能会发现沿PCA(*)的降维可能会有所帮助,因为您实际上是在汇总相关的单词。给定样本量,前10-50个主要成分可能是文档分类所需的全部。

(*)注意:PCA只是第一步。对于刚开始使用文本挖掘和PCA的人来说,这可能会非常有趣,但是您最终可能会发现,这对于稀疏数据集有点麻烦。不过,首先请看一下它,尤其是通过prcompprincomp函数。

更新:我没有在此答案中说明偏好-我建议prcomp而不是princomp


+1好答案;我只是很好奇,为什么您这么说码头数量少意味着重要变量的数量越少-看起来有点不合适吗?

我不确定我理解你的意思。当然,要使它们过拟合,可以在任何合理的正则化中消除这些变量。此外,词汇数(P)随文档或样本数(N)的增加而增加,因此,第一次出现术语并不表示太多。不断添加文档,然后在整个文档中重复出现术语将变得很有用。
Iterator

@Iterator:感谢您的回答。那么prcomp和/或princomp将扩展到您认为的此类数据?另外,我只是编辑了我的问题,并添加了一些其他信息。
安迪(Andy)

不,当您达到300K列时,这些可能不会缩放。:)(只需指出:在这种情况下,X'X将具有90B条目-一个存储问题。)相反,请先按tf.idf进行过滤。如果只有10个不同的类,则10的较小倍数对于较大的维度应该足够用于分离这些类。因此,1000个尺寸应该绰绰有余。两种PCA方法(顺便说一句,我建议prcomp)都可以。
Iterator

一旦将尺寸限制在1000个或更多(例如2K),并进行PCA,您就可以将投影投影到100个尺寸上(这可能会过大,但危害不大),然后进行分类。在这一点上,没有什么太令人兴奋的事情了。
Iterator

5

首先,欢迎您!文本处理非常有趣,而在R中进行文本处理一直变得越来越容易。

简短的答案:是的-R中的工具现在非常适合处理此类数据。实际上,在RAM中进行数据存储时,R,C ++,Groovy,Scala或任何其他语言都没有什么特别的:每种语言都在其中存储一个8字节的双精度浮点数……等待它……等待它。 .. 8个字节!

算法及其实现确实很重要,尤其是在数据结构和计算复杂性方面实现得很差的情况下。如果要实现自己的算法,请小心。如果使用其他代码,则在任何环境中都适用警告购买者。

对于R,您需要考虑:

  1. 您的数据表示形式(请查看稀疏矩阵,尤其是在Matrix包中)
  2. 数据存储(也许使用bigmemory或映射ff或使用Hadoop或分布式的内存)
  3. 数据分区(RAM中可容纳多少取决于您有多少RAM)

最后一点实际上在您的控制之下。

当涉及到这种尺寸时,它不再特别大。#观察值会产生更大的影响,但是您可以对数据进行分区以根据RAM使用情况进行调整,因此不必担心太多。


3

我同意Crayola的观点,这里的行数至关重要。对于RF,您将需要至少比数据集权重多3倍的RAM,并可能需要很多时间(这种数量的属性通常在林中需要很多树-并且请注意,R中没有RF的并行实现)。

关于SVM,我怀疑与300k尺寸抗衡是否是一个好主意,而您可能可以开发一个等效于文本描述符的内核函数。

编辑:3k x 30k(实际)矩阵将占用约7Gb的空间,因此您需要对此数据进行RF(使用randomForest)是一台具有16GB RAM,有些运气和相当长的时间的计算机,或者只是一台具有24GB内存的计算机RAM和相当多的时间。


好吧,我当然会进行特征选择(基于卡方,基于熵),但是同样,我也找不到任何可扩展至此任务的R库。考虑到所有这些,那么说我应该开始考虑非R解决方案是否正确?
安迪

1
“请注意,R中没有并行实现RF”。这只是部分正确,因为该foreach软件包可与该randomForest软件包很好地配合使用。我认为插图中有一个这样的例子foreach。(或者doMC。)
绘儿乐2011年

@Andy问题是,除了用低级编程语言重写算法之外,我不确定哪种软件可以将这些算法应用于您的数据。如果您randomForest遇到这种情况,我想我会坚持使用R并重写其中的一部分,以便在每次迭代时从例如SQL数据库中查询随机选择的列(这样,整个300k维就永远不会在公羊)。但这可能主要是因为我对R的了解比对其他可能选项的了解要多。
crayola 2011年

您声称找不到可扩展的库,这是什么意思?这样的过滤器是基本代数,它们应该可以正常工作(前提是您有足够的RAM)。

@crayola是的,但是合并部分很糟糕。此外,它不是共享内存并行性,因此在这种情况下可能会很痛苦(如果不是不可能的话)。
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.