使用for循环遍历pandas DataFrame生成实体标注数据问题求解
问题描述
我是Python新手,目前使用for循环迭代读取CSV文件,CSV文件结构见上传的截图。
我的标注需求如下:
- 针对句子「Launch Flipkart https://www.flipkart.com」,提取(0,6)位置的实体Launch
- 针对句子「Enter Email xyz@gmail.com」,提取(0,5)位置的实体Enter
我目前使用的代码如下:
df=pd.read_csv("File_name.csv") l1=[] l2=[] for i in range(0,len(df['SENTENCE'])): l1.append(df['SENTENCE'][i]) l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Operation'][i])]}) l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Argument'][i])]}) TRAIN_DATA=list(zip(l1,l2)) TRAIN_DATA
我在第6行代码遇到了问题:
l2.append({"entities":[(0,len(df['SENTENCE'][i]),df['Operation'][i])]})
我知道应该将df['SENTENCE'][i]替换为变量,但不知道如何定义该变量才能得到最优结果。
解决方案
你当前的问题除了变量定义之外,还有两个逻辑问题:一是用整个句子的长度作为实体结束下标,不符合你提取句首第一个词的需求;二是重复给同一句子追加两个实体字典,不符合常规NER训练数据的格式要求(单句对应一个实体列表,所有实体放在同一列表内)。
优化后的代码如下:
import pandas as pd df = pd.read_csv("File_name.csv") TRAIN_DATA = [] # 用iterrows遍历DataFrame行,比按索引取值更稳妥 for _, row in df.iterrows(): # 定义sentence变量替换df['SENTENCE'][i],存储当前行的句子内容 sentence = row['SENTENCE'] # 自动计算句首第一个词的结束下标:取第一个空格的位置,无空格则取整个句子长度 first_word_end = sentence.find(' ') if ' ' in sentence else len(sentence) # 组装实体列表 entities = [] # 标注Operation实体(你需求里的Launch、Enter都属于这类) if pd.notna(row['Operation']): entities.append((0, first_word_end, row['Operation'])) # 如果需要标注Argument实体,补充对应下标逻辑后放开下面的注释即可 # if pd.notna(row['Argument']): # entities.append((start_idx, end_idx, row['Argument'])) # 组装为训练数据加入列表 TRAIN_DATA.append((sentence, {"entities": entities})) print(TRAIN_DATA)
代码说明
- 定义的
sentence变量就是你需要的替换df['SENTENCE'][i]的变量,后续所有需要用到当前句子内容的地方直接调用该变量即可,无需重复访问DataFrame取值,代码可读性和运行效率都更高 first_word_end会自动适配不同长度的句首词,不用手动写死下标数值,适配性更强- 单条训练数据对应一个句子+所有实体的结构,符合spaCy等主流NLP框架的训练数据格式要求
内容的提问来源于stack exchange,提问作者user16974519
相关产品推荐
相关产品推荐

