R-通过元数据(id)匹配部分字符串来子集语料库

时间:2016-03-22 09:26:48

标签: regex r tm

我正在使用R(3.2.3)tm-package(0.6-2),并希望根据metadatum“id”包含的部分字符串匹配来对我的语料库进行子集化。 例如,我想过滤“id”列中包含字符串“US”的所有文档。字符串“US”前面和后面跟着各种字符和数字。

我找到了一个类似的例子here。建议下载quanteda包,但我认为tm包也应该可以。

找到类似问题的另一个更相关的答案here。我试图将该示例代码调整到我的上下文中。但是,我没有设法合并部分字符串匹配。

我想到目前为止我的代码可能存在多处问题。 到目前为止我看到的是这样的:

US <- tm_filter(corpus, FUN = function(corpus, filter) any(meta(corpus)["id"] == filter), grep(".*US.*", corpus))

我收到以下错误消息:

Error in structure(as.character(x), names = names(x)) : 
'names' attribute [3811] must be the same length as the vector [3] 

我也不确定如何为这篇文章提出一个可重现的例子来模拟我的问题。

1 个答案:

答案 0 :(得分:0)

它可以像这样工作:

library(tm)
reut21578 <- system.file("texts", "crude", package = "tm")
(corp <- VCorpus(DirSource(reut21578), list(reader = readReut21578XMLasPlain)))
# <<VCorpus>>
# Metadata:  corpus specific: 0, document level (indexed): 0
# Content:  documents: 20
(idx <- grep("0", sapply(meta(corp, "id"), paste0), value=TRUE))
#   502   704   708 
# "502" "704" "708" 
(corpsubset <- corp[idx] )
# <<VCorpus>>
# Metadata:  corpus specific: 0, document level (indexed): 0
# Content:  documents: 3

您正在寻找"US"而不是"0"。有关详细信息,请查看?grep(例如fixed=TRUE)。