Python:查找QA数据集context列内answer子文本的起始与结束索引
问题修复方案
报错原因
你调用apply的对象是df['answer_start']单列,传入lambda的参数x是该列的单个值(初始为空/整型),自然无法通过x['answer']、x['context']取其他列的字段,所以抛出整型不可下标访问的报错。
修复方案(无显式循环)
方案1:行级apply(最简实现)
直接对整个DataFrame按行遍历,每行可以访问所有列的字段,同时用Python原生的字符串find方法代替正则匹配,避免answer包含正则特殊字符导致匹配错误:
# 计算起始索引,匹配失败返回-1 df['answer_start'] = df.apply(lambda row: row['context'].find(row['answer']), axis=1) # 结束索引 = 起始索引 + answer字符串长度,context[start:end]正好可以取出完整answer df['answer_end'] = df['answer_start'] + df['answer'].str.len()
方案2:列表推导(性能更优,适合大数据集)
行级apply在数据量较大时性能一般,用zip绑定两列后用列表推导计算,速度是行级apply的3-5倍:
df['answer_start'] = [ctx.find(ans) for ctx, ans in zip(df['context'], df['answer'])] df['answer_end'] = df['answer_start'] + df['answer'].str.len()
注意事项
如果存在answer不在context中的场景,find方法会返回-1,你可以后续过滤掉answer_start == -1的异常记录即可。
内容的提问来源于stack exchange,提问作者aapal
相关产品推荐
相关产品推荐

