AttributeError: 'list'对象无'ents'属性,spaCy命名实体识别报错如何解决
问题解决说明
错误根因
- 属性调用逻辑错误:你定义的
doc是Python列表类型,列表内的每个元素才是spaCy处理后得到的Doc对象,ents是Doc类的专属属性,列表本身不具备该属性,因此触发AttributeError。 - 实体属性调用错误:你原有实体识别代码中调用的
entity.label也存在问题,spaCy中label属性返回的是实体类型的哈希值,要获取可读的实体类型字符串,需要调用entity.label_属性。 - 原始代码缩进不规范:你贴出的读取CSV的代码存在缩进错误,
with代码块、for循环下的代码需要统一缩进4个空格,否则运行时会触发缩进错误。
修复方案
方案一:逐段提取实体(保留原分段处理逻辑)
遍历列表中的每个Doc对象,再分别提取对应实体即可,修改后的实体识别代码如下:
for single_doc in doc: for entity in single_doc.ents: print(entity.text, entity.label_)
方案二:合并全量文本后统一识别(可选)
如果需要将CSV中所有字段内容作为整体做实体识别,可以调整读取逻辑拼接所有文本后统一处理,代码如下:
import csv import spacy # 初始化nlp模型,替换为你实际加载的对应语言模型即可 nlp = spacy.load("en_core_web_sm") all_content = "" with open(r'C:\Users\DELL\Desktop\Final project\Requirements1.csv', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file, delimiter=';') for row in csv_reader: for field in row: all_content += field + " " # 统一处理生成单个Doc对象 doc = nlp(all_content) # 提取实体 for entity in doc.ents: print(entity.text, entity.label_)
内容的提问来源于stack exchange,提问作者Nirmani Warakaulla
相关产品推荐
相关产品推荐

