使用Pandas统计IOB语料标签、合并IOB前缀及过滤无效标签的方法
解决方法
你可以按以下步骤同时实现过滤无效标签和聚合同类型实体统计:
第一步:过滤不需要的标签
直接用布尔索引排除值为O和空字符串的标签,写法比mask/where更直观:
# 过滤掉O标签和空标签 valid_tags = data['Tag'][~data['Tag'].isin(['O', ''])]
第二步:提取实体类型、分组求和
IOB格式的标签均为前缀-实体类型结构,通过字符串切割提取实体类型后分组计数即可:
# 去掉B-、I-前缀,提取实体类型 entity_type = valid_tags.str.split('-').str[-1] # 统计各实体类型总数 result = entity_type.value_counts().reset_index() result.columns = ['Label', 'Total']
对应你的数据的输出结果示例:
| Label | Total |
|---|---|
| LOCATION | 637 |
| PERSON | 378 |
| INSTALLATION | 218 |
| ORGANISATION | 218 |
| TITLE | 183 |
| EVENT | 10 |
如果你需要在已经生成的df基础上修改,可直接使用以下代码:
# 过滤O和空标签 df_filtered = df[~df['Label'].isin(['O', ''])].copy() # 提取实体类型 df_filtered['Label'] = df_filtered['Label'].str.split('-').str[-1] # 同类型标签求和 result = df_filtered.groupby('Label', as_index=False)['Total'].sum()
问题单独说明
- 排除
O和空标签:用isin搭配取反符~做布尔索引是最简洁的实现方式,之前mask/where操作失败大概率是条件写反或者没有赋值生效。 - 合并IOB前缀:所有合法实体标签都符合
前缀-类型的格式,用split('-')取最后一段就能得到统一的实体类型,再分组求和即可完成聚合。
内容的提问来源于stack exchange,提问作者Lter
相关产品推荐
相关产品推荐

