我正在为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?
我认为目前最有用的软件包是tm软件包。这是一个非常复杂但彻底的包,即使它仍处于版本.7.1的实验状态。如果没有更多细节,我无法向您提供更准确的使用信息,因为这完全取决于您的来源,您希望如何处理语料库以及其他因素。您需要做的就是首先根据源材料创建一个reader对象。它可以处理Web输入,纯文本,pdf等。然后你可以使用一个语料库创建函数,这取决于你是否要将整个事物保存在内存等中。然后你可以使用各种“整理”函数来操作整个语料库,就像每个文档都是向量中的元素一样。你可以用标记化做同样的事情。通过一些更具体的细节,我们可以为您提供更具体的答案。
由于这个问题没有得到直接回答,我将重新发布我在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()
)加载到存储器中,得到的对象大小如下。
这些文件必须连接到一个对象并转换为语料库。它们共同消耗大约800 Mb的RAM。
当使用quanteda::corpus()
转换为语料库时,生成的文件大小为1.1 Gb。
为了最大化可用于n-gram处理的RAM量,一旦生成语料库,就必须从存储器中除去用作tokens_ngrams()
输入的标记化语料库之外的所有对象。各种n-gram的物体尺寸如下。
我能够在具有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()
函数实现。