处理conll2003数据集时pandas删除全大写tokens行报错如何解决
错误原因
- 类型不匹配:你加载的conll2003数据集中token存在bytes类型取值,你编写的正则规则仅支持匹配字符串,直接对bytes类型做匹配就会触发该类型错误。
- 逻辑错误:你写的
all(map(all_caps_regex.search, df_train['tokens']))是对整个tokens列的所有值做全局判断,而非逐行判断单个句子的所有token是否全大写,完全不符合需求逻辑。
修复后的实现代码
import re df_train = conll2003dataset['train'].to_pandas() df_test = conll2003dataset['test'].to_pandas() # 单条句子全大写判断函数 def is_all_caps(tokens): # 统一转字符串,解决bytes类型报错 str_tokens = [t.decode('utf-8') if isinstance(t, bytes) else t for t in tokens] # 校验当前句子所有token都不含小写字母 return all(re.fullmatch(r'^[^a-z]*$', t) for t in str_tokens) # 过滤保留不全是全大写的行,重置索引避免后续处理异常 df_train = df_train[~df_train['tokens'].apply(is_all_caps)].reset_index(drop=True) df_test = df_test[~df_test['tokens'].apply(is_all_caps)].reset_index(drop=True)
代码说明
- 内置了bytes转字符串的逻辑,彻底解决类型不匹配的报错问题
- 用
apply逐行处理每个句子的token列表,精准判断单句是否满足全大写条件 - 用
~对判断结果取反,筛选出需要保留的非全大写句子行,最后重置索引避免后续操作出现索引混乱
内容的提问来源于stack exchange,提问作者Rnj
相关产品推荐
相关产品推荐

