我正在使用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]
我也不确定如何为这篇文章提出一个可重现的例子来模拟我的问题。
答案 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
)。