使用tm包创建的自定义语料库无法编辑元数据,求原因解析
问题
我通过以下代码创建语料库:
library(jsonlite) library(tm) query = "https://www.ebi.ac.uk/ebisearch/ws/rest/pride?query=submitter_country:Norway&size=1000&fields=submitter_keywords&format=json" datasets.raw <- fromJSON(query, flatten = TRUE, simplifyDataFrame = TRUE) datasets.df <- datasets.raw$entries keywords.corp <- Corpus(VectorSource(datasets.df$fields.submitter_keywords))
尝试为语料库添加自定义元数据时,赋值操作没有生效:
meta(keywords.corp[[1]], "description") <- "hello" meta(keywords.corp[[1]], "description") # 输出:character(0)
但使用内置的crude示例数据时,自定义元数据可以正常设置:
data("crude") meta(crude[[1]], "description") <- "hello" meta(crude[[1]], "description") # 输出:[1] "hello"
这是什么原因?
原因
核心差异在于语料库的文档类型和元数据初始化方式:
- 用
VectorSource创建的语料库,每个文档是**PlainTextDocument对象**,默认只包含author、datetimestamp、language等基础元数据字段,没有预定义自定义字段的存储结构。直接赋值自定义元数据时,系统无法识别该字段,导致赋值失败。 - 内置的
crude语料库属于**VCorpus类型**,其文档对象在创建时已经初始化了完整的元数据框架,支持动态添加自定义字段。
解决办法
你可以通过两种方式解决这个问题:
方式1:提前初始化自定义元数据字段
遍历语料库中的每个文档,先为自定义字段分配初始值,之后就能正常赋值:
# 遍历所有文档,初始化description字段 for (i in seq_along(keywords.corp)) { meta(keywords.corp[[i]], "description") <- "" } # 现在可以正常设置元数据 meta(keywords.corp[[1]], "description") <- "hello" meta(keywords.corp[[1]], "description") # 输出:[1] "hello"
方式2:手动构建带元数据的文档后创建语料库
在创建文档时就初始化自定义元数据字段,再构建VCorpus:
# 将每个关键词文本转换为带初始化元数据的PlainTextDocument doc_list <- lapply(datasets.df$fields.submitter_keywords, function(txt) { doc <- PlainTextDocument(txt) meta(doc, "description") <- "" # 提前初始化自定义字段 doc }) # 基于文档列表创建VCorpus keywords.corp <- VCorpus(VectorSource(doc_list)) # 测试赋值 meta(keywords.corp[[1]], "description") <- "hello" meta(keywords.corp[[1]], "description") # 输出:[1] "hello"
内容的提问来源于stack exchange,提问作者Illimar Rekand
相关产品推荐
相关产品推荐

