如何保存Spacy NER的ent.label与ent.text?多实体值存储问题
解决Spacy NER多实体标签的字典存储问题
首先明确:Python的字典不允许存在重复键,你期望的输出格式在语法上是无效的——如果强行写重复键,最终字典只会保留最后一个键对应的值。正确的实现方式是让每个标签对应一个列表,用来存储同标签下的所有实体值。
修改后的代码
d = [] # 直接遍历DataFrame的行,无需先转存到列表c for idx, row in article.iterrows(): e = {'Urls': row[0]} # 初始化字典,先存入Url a = str(row[2]) doc = ner(a) for ent in doc.ents: label = ent.label_ # 如果标签不在字典里,先创建空列表 if label not in e: e[label] = [] # 将实体文本追加到对应标签的列表中 e[label].append(ent.text) d.append(e)
正确的输出示例
处理后每个标签会对应一个包含所有实体值的列表,格式如下:
[ { 'Urls': 'https://somewebsite.com', 'Fruit': ['Apple', 'orange', 'watermelon'], 'Fruit_colour': ['Red', 'orange', 'Green'] }, { 'Urls': 'https://some_other_website.com/', 'Fruit': ['Papaya', 'Peach', 'Mango'], 'Fruit_colour': ['Yellow', 'Yellow', 'Green'] } ]
代码优化说明
- 去掉了冗余的列表
c,直接遍历article.iterrows()的结果,提升代码简洁性 - 对每个实体标签,先判断是否已存在于字典中,不存在则初始化空列表,再追加实体值,避免覆盖
- 保持了原逻辑的核心功能,同时解决了多实体标签的存储问题
内容的提问来源于stack exchange,提问作者Arun Vijay
相关产品推荐
相关产品推荐

