复现论文时规避quanteda已弃用texts()函数的问题求助
问题:语料库清洗时出现'names'属性长度不匹配错误
我正尝试复现一篇学术论文的语料处理流程,在tokens.R脚本中使用以下正则替换命令清洗语料库:
texts(corp) <- stri_replace_all_regex(texts(corp), "^[\\p{Lu}\\p{Z}]+(.{0,30}?)(\\(.{0,50}?\\))?(--)", "")
执行后触发错误及警告:
Error in attributes(.Data) <- c(attributes(.Data), attrib) : 'names' attribute [387896] must be the same length as the vector [4] In addition: Warning message: 'texts.corpus' ist veraltet. Benutzen Sie stattdessen 'as.character' Siehe help("Deprecated")
按照提示改用as.character()后,代码如下:
as.character(corp) <- stri_replace_all_regex(as.character(corp), "^[\\p{Lu}\\p{Z}]+(.{0,30}?)(\\(.{0,50}?\\))?(--)", "")
但仍出现完全相同的错误。我还尝试过直接访问语料库的$documents字段、将语料库转为向量等方法,均无法解决问题,求可行的解决方案。
解决方案
这个错误的核心原因是正则替换后的结果与原语料库的文档数量不匹配,或替换过程中意外改变了返回结果的结构。可通过以下步骤修复:
1. 拆分提取与赋值步骤,确保向量长度一致
不要直接在赋值语句中嵌套处理逻辑,先将语料文本提取为独立向量,处理后验证长度,再赋值回语料库:
# 提取语库文本为独立向量 corp_texts <- as.character(corp) # 执行正则替换 cleaned_texts <- stri_replace_all_regex(corp_texts, "^[\\p{Lu}\\p{Z}]+(.{0,30}?)(\\(.{0,50}?\\))?(--)", "") # 强制检查长度匹配(避免出现长度不匹配的情况) stopifnot(length(cleaned_texts) == length(corp_texts)) # 赋值回语料库(若texts()提示过时,可根据包结构改用直接字段赋值) texts(corp) <- cleaned_texts
若使用quanteda包,也可直接操作内部字段赋值:
corp$documents$texts <- cleaned_texts
2. 测试正则表达式的小样本表现
正则可能在部分文档中触发异常匹配,导致返回结果结构异常。先在小样本上验证:
# 取前5个文档测试正则逻辑 test_texts <- corp_texts[1:5] test_cleaned <- stri_replace_all_regex(test_texts, "^[\\p{Lu}\\p{Z}]+(.{0,30}?)(\\(.{0,50}?\\))?(--)", "") # 打印结果确认每个输入对应一个输出 print(test_cleaned) stopifnot(length(test_cleaned) == length(test_texts))
若测试中出现问题,可调整正则规则:比如将末尾的(--)改为(--)?使其变为可选,或优化贪婪模式避免过度匹配。
3. 根据语料库包类型调整处理方式
不同R语料库包的结构差异较大:
- 若使用
tm包,推荐用tm_map结合content_transformer处理:library(tm) corp <- tm_map(corp, content_transformer(function(x) { stri_replace_all_regex(x, "^[\\p{Lu}\\p{Z}]+(.{0,30}?)(\\(.{0,50}?\\))?(--)", "") })) - 若使用
quanteda包,建议更新到最新版本,可消除texts.corpus过时的警告。
内容的提问来源于stack exchange,提问作者user23354536
相关产品推荐
相关产品推荐

