tm 0.7.3版本中如何合并已有的语料库?
解决tm 0.7.3版本中合并VCorpus的问题
我之前也踩过tm包版本升级的这个坑!在tm 0.7.x系列版本里,原本重载的c()函数行为发生了变化——合并两个VCorpus对象后返回的不再是预期的VCorpus,而是普通的list,这就导致inspect()找不到对应的方法,抛出no applicable method for 'inspect' applied to an object of class "list"的错误。
针对你需要合并已存在语料库的需求,这里有两个可靠的解决方案:
方案一:直接调用tm内部的语料库合并方法
tm包内部其实还保留着原来合并VCorpus的实现,只是没有通过c()暴露出来。你可以直接调用tm:::c.VCorpus来完成合并,这样得到的结果依然是标准的VCorpus对象,同时会自动保留原语料库的元数据:
library(tm) # 你的原有代码(创建corpus1和corpus2) a = "This is the first document." b = "This is the second document." c = "This is the third document." d = "This is the fourth document." docs1 = VectorSource(c(a,b)) docs2 = VectorSource(c(c,d)) corpus1 = Corpus(docs1) corpus2 = Corpus(docs2) # 使用内部方法合并 corpus3 = tm:::c.VCorpus(corpus1, corpus2) inspect(corpus3)
运行后会输出和旧版本一致的结果:
<
> Metadata: corpus specific: 0, document level (indexed): 0 Content: documents: 4
方案二:手动构造VCorpus(更稳定,不依赖内部方法)
如果你担心内部方法后续版本会被修改,可以手动将合并后的list重新构造成VCorpus,同时保留原语料库的元数据:
# 合并得到list corpus_list = c(corpus1, corpus2) # 从list中提取文本内容,重新创建VCorpus corpus3 = VCorpus(VectorSource(sapply(corpus_list, content))) # 合并并设置原语料库的文档级元数据 meta(corpus3) = do.call(rbind, lapply(corpus_list, meta))
这个方法更灵活,即使后续tm包有调整,也能保证合并逻辑的稳定性。
补充说明
tm 0.7.x版本对语料库的底层结构做了优化,可能是这个调整导致c()的重载逻辑出现了问题。官方文档里提到的c()合并语料库的方法,在新版本中确实没有正常工作,这属于版本兼容的小bug,上面的两种方法都能完美解决你的需求。
内容的提问来源于stack exchange,提问作者Marijn
相关产品推荐
相关产品推荐

