R 对文本分类任务的扩展性如何?

机器算法验证 r 机器学习 支持向量机 文本挖掘 随机森林
2022-02-13 04:14:48

我正在努力加快使用 R 的速度。我最终想使用 R 库进行文本分类。我只是想知道在进行文本分类时,人们对 R 的可扩展性有何经验。

我可能会遇到高维数据(约 300k 维)。我正在考虑使用 SVM 和随机森林作为分类算法。

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

谢谢。

编辑 1:澄清一下,我的数据集可能有 1000-3000 行(可能更多)和 10 个类。

编辑 2:由于我对 R 很陌生,我会要求海报尽可能具体。例如,如果您建议工作流/管道,请务必在可能的情况下提及每个步骤中涉及的 R 库。一些额外的指针(指向示例、示例代码等)将是锦上添花。

编辑3:首先,感谢大家的评论。其次,我很抱歉,也许我应该为这个问题提供更多背景信息。我是 R 新手,但对文本分类不太了解。我已经使用tm包对我的部分数据进行了预处理(词干提取、停用词删除、tf-idf 转换等),只是为了感受一下。即使在大约 200 个文档上,tm 也很慢,以至于我担心可伸缩性。然后我开始玩 FSelector,即使这样也很慢。这就是我制作OP的时候。

编辑 4:我刚想到我有 10 个班级,每个班级大约 300 个培训文档,实际上我正在从整个培训集中构建 termXdoc 矩阵,从而导致非常高的维度。但是如何将每个 k 中的 1 分类问题简化为一系列二元分类问题呢?这将大大减少每个 k-1 步骤中训练文档的数量(以及维度),不是吗?那么这种方法是一种好方法吗?它在准确性方面与通常的多类实现相比如何?

3个回答

根据评论中的要求,这里有一些处理步骤的指示。在自然语言处理的 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 的人来说,这可能非常有趣,但您最终可能会发现它对于稀疏数据集来说有点麻烦。但是,作为第一步,请看一下它,尤其是通过prcompandprincomp函数。

更新:我没有在这个答案中说明偏好 - 我推荐prcomp而不是princomp.

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

简短的回答:是的 - R 中的工具现在非常适合处理这种数据。事实上,R、C++、Groovy、Scala 或任何其他语言在 RAM 中的数据存储方面并没有什么特别之处:每种语言都存储一个 8 字节的双浮点数……等待它……等待它。 .. 8 个字节!

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

对于 R,您需要考虑:

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

最后一点真的在你的控制之下。

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

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

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

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