如何在pandas DataFrame中实现基于词位置的自定义NER实体标注
自定义NER标注实现方案
实现思路
- 首先确认位置索引规则:题目给出的
in、tar列存储的是1-based的单词位置,即第一个单词对应位置1,处理时需要转换为Python列表兼容的0-based索引(位置值减1) - 逐行处理文本:先按空格拆分文本为单词列表,再根据标注位置给对应单词包裹标签,最后重新拼接为标注后的文本
- 避免位置冲突:默认同一单词不会同时属于
in和tar实体,若存在冲突可自行调整优先级规则
完整实现代码
import pandas as pd # 构造样例DataFrame,可替换为你自己的数据集 df = pd.DataFrame({ 'text': [ 'This is an example text that I use in order to demonstrate', 'Discussion: We are examining the possibility of the project' ], 'in': [[2], [3]], 'tar': [[6], [6,7]] }) # 定义标注处理函数 def annotate_text(row): # 拆分文本为单词列表,自动合并连续空白符,保留原单词附带的标点 words = row['text'].split() # 处理IN类实体标注 for pos in row['in']: idx = pos - 1 words[idx] = f'<IN>{words[idx]}</IN>' # 处理TAR类实体标注 for pos in row['tar']: idx = pos - 1 words[idx] = f'<TAR>{words[idx]}</TAR>' # 拼接回完整字符串 return ' '.join(words) # 应用函数生成标注结果列 df['annotated_text'] = df.apply(annotate_text, axis=1) # 查看输出结果 print(df['annotated_text'].tolist())
结果验证
运行代码后,第二行文本的标注结果和题目要求完全一致:
Discussion: We <IN>are</IN> examining the <TAR>possibility</TAR> <TAR>of</TAR> the project
注意事项
- 如果需要把连续位置的同类型实体包裹在同一个标签内,可修改标注逻辑,对连续的位置值做合并处理
- 若存在实体位置重叠的场景,可根据业务需求调整标签优先级,比如优先保留
in标签或者tar标签 - 如果文本中存在换行、制表符等特殊空白符,可先使用正则替换为普通空格后再拆分处理
内容的提问来源于stack exchange,提问作者joasa
相关产品推荐
相关产品推荐

