拆分用R和Quanteda标记语料库

时间:2017-05-25 02:54:55

标签: r nlp tokenize corpus quanteda

我正在为NLP开展一个项目。我需要在.txt文件中获取一些博客,新闻和推文(你可能已经听过这个顶点)并创建n-gram频率。

我对将txt文件转换为频率data frame以进行分析的步骤进行了实验:

Read > Conver to corpus > Clean corpus > Tokenize > Convert to dfm > Convert to df

过程中的瓶颈是标记化并转换为dfm步骤(超过5倍的时间)。

我有两个选择:

1. Split the cleaned corpus to tokenize by piece
2. Split-read the .txt files from the beginning

没有。 1似乎是最好的,但到目前为止我还没有找到一个功能或包 可以用我想要的方式做到这一点。因此,我将编写一个长代码,从20个块开始拆分读取(由于我的计算限制)。

有没有办法可以拆分用quanteda包裹创建的语料库("语料库""列表")(由我定义的行),这样我就可以在一个"流媒体"中标记并转向dfm有点儿?

2 个答案:

答案 0 :(得分:0)

我认为目前最有用的软件包是tm软件包。这是一个非常复杂但彻底的包,即使它仍处于版本.7.1的实验状态。如果没有更多细节,我无法为您提供更准确的使用信息,因为这完全取决于您的来源,您希望如何处理语料库以及其他因素。您需要做的就是首先根据源材料创建一个读取器对象。它可以处理Web输入,纯文本,pdf等。然后你可以使用其中一个语料库创建函数,这取决于你是否要将整个事物保存在内存中等等。然后你可以使用各种“整理”功能。功能对整个语料库进行操作,就好像每个文档都是向量中的元素一样。你可以用标记化做同样的事情。通过一些更具体的细节,我们可以为您提供更具体的答案。

答案 1 :(得分:0)

由于此问题尚未得到直接回答,我将重新发布2016年作为JHU Capstone的社区导师撰写的文章中的相关内容,Capstone n-grams: how much processing power is required?

概述

约翰霍普金斯大学数据科学专业化课程的学生通常会对课程项目感到困惑,因为分析文本所需的对象消耗了大量内存。该问题询问了处理原始数据文件中的400多万个文档的最佳方法。对这个问题的简短回答是它取决于一台机器上的RAM数量。由于R对象必须驻留在RAM中,因此必须了解正在处理的对象所消耗的RAM量。

需要具有16Gb RAM的机器来处理来自三个文件的所有数据,而无需在较小的块中处理它或处理随机的数据样本。我的测试表明处理文件所需的工作内存大约是quanteda::tokens_ngrams()版本0.99.22中quanteda函数输出对象大小的1.5到3倍,因此是1 Gb标记化语料库并消耗9 Gb的RAM来生成4 Gb的n-gram对象。请注意,如果您的计算机具有多个核心/线程,quanteda会自动使用多个线程。

为了帮助减少内存利用率的猜测,下面是分析Swift Key赞助的顶点文件所需的对象消耗RAM量的摘要:预测文本。

原始数据

Capstone项目中使用了三个原始数据文件。使用文本处理函数(例如readLines()readr::read_lines())加载到内存后,生成的对象大小如下所示。

  1. en_US.blogs.txt:249 Mb
  2. en_US.news.txt:250 Mb
  3. en_US.twitter.txt:301 Mb
  4. 这些文件必须连接到一个对象并转换为语料库。它们共同消耗大约800 Mb的RAM。

    转换为带quanteda::corpus()的语料库时,生成的文件大小为1.1 Gb。

    N-gram对象大小

    为了最大化可用于n-gram处理的RAM量,一旦生成了语料库,就必须从内存中删除除用作tokens_ngrams()输入的标记化语料库以外的所有对象。各种n-gram的物体尺寸如下。

    1. 2克:6.3 Gb
    2. 3克:6.5 Gb
    3. 4克:6.5 Gb
    4. 5克:6.3 Gb
    5. 6克:6.1 Gb
    6. 使用更少的内存

      我能够在具有8 Gb RAM的MacBook Pro上处理25%的顶点数据样本,在运行具有4 Gb RAM的Ubuntu Linux的HP Chromebook上处理5%的样本。添加Ken Benoit对原始问题的评论,可以指定一个数字组(例如重复1到20的ID以拆分为20个组),然后使用corpus_segment()功能在组ID上拆分语料库。然后可以通过apply()函数单独处理组以生成n-gram。生成所有所需n-gram的一般过程在下面的伪代码中表示。

       for each group in the corpus
           for each size n-gram 
                 1. generate n-grams
                 2. write to file
                 3. rm() n-gram object
      

      这个伪代码可以用几个apply()函数实现。

      对象大小:25%样本

      1. 2克:2.0 Gb
      2. 3克:2.9 Gb
      3. 4克:3.6 Gb
      4. 5克:3.9 Gb
      5. 6克:4.0 Gb
      6. 对象大小:5%样本

        1. 2克:492 Mb
        2. 3克:649 Mb
        3. 4克:740 Mb
        4. 5克:747 Gb
        5. 6克:733 Gb