2017-04-18 47 views
1

我正在处理非结构化文本(Facebook)数据,并对其进行了预处理(例如,剥离标点符号,删除停用词,词干)。我需要在预处理过程中保留记录(即Facebook邮政)ID。我有一个解决方案适用于数据的一个子集,但所有数据都失败(N = 127K个帖子)。我试过分块数据,但这也不起作用。我认为这与我使用解决方法有关,并依赖于行名。例如,它似乎与第一个〜15K的帖子一起工作,但是当我继续进行子集化时,它失败了。我意识到我的代码不够优雅,所以很高兴能够学习更好的/完全不同的解决方案 - 我关心的是在我去V Corpus时再保存ID,然后再返回。我是tm包和readTabular函数的新手。 (注意:我在创建VCorpus之前先跑下去并删除单词,因为我原先以为这是问题的一部分)。使用tm函数时保留唯一标识符(例如,记录标识符) - 不适用于批量数据?

工作代码如下:

的样本数据

fb = data.frame(RecordContent = c("I'm dating a celebrity! Skip to 2:02 if you, like me, don't care about the game.", 
           "Photo fails of this morning. Really Joe?", 
           "This piece has been almost two years in the making. Finally finished! I'm antsy for October to come around... >:)"), 
           FromRecordId = c(682245468452447, 737891849554475, 453178808037464), 
           stringsAsFactors = F) 

删除标点&使小写

fb$RC = tolower(gsub("[[:punct:]]", "", fb$RecordContent)) 
fb$RC2 = removeWords(fb$RC, stopwords("english")) 

第1步:创建专门的阅读器功能,保留记录ID

myReader = readTabular(mapping=list(content="RC2", id="FromRecordId")) 

第2步:制作我的语料库。阅读使用DataframeSource和定制阅读器的功能,其中每个FB帖子是一个“文件”

corpus.test = VCorpus(DataframeSource(fb),  readerControl=list(reader=myReader)) 

步骤3中的数据:清洁和干

corpus.test2 = corpus.test %>% 
tm_map(removeNumbers) %>% 
tm_map(stripWhitespace) %>% 
tm_map(stemDocument, language = "english") %>% 
as.VCorpus() 

步骤4:语料库回字符向量。该行的名称现在的ID

fb2 = data.frame(unlist(sapply(corpus.test2, `[`, "content")), stringsAsFactors = F) 

步骤5:对于合并为后来合并新的ID变量名乏,并准备返回到原始数据集

fb2$ID = row.names(fb2) 
fb2$RC.ID = gsub(".content", "", fb2$ID) 
colnames(fb2)[1] = "RC.stem" 
fb3 = select(fb2, RC.ID, RC.stem) 
row.names(fb3) = NULL 

回答

0

我认为IDS 默认情况下由tm模块进行存储和保留。你可以用

meta(corpus.test, "id")

$`682245468452447` 
[1] "682245468452447" 

$`737891849554475` 
[1] "737891849554475" 

$`453178808037464` 
[1] "453178808037464" 

获取它们的所有(在量化的方式)我建议你阅读的tm::meta()函数的文档,但它不是非常好。

您还可以任意元数据(作为键值对)添加到语料库中的每个集合项目以及集合级别元数据。

+0

谢谢!很高兴知道能够添加metadata = cool;) –