使用spaCy与Transformers做NER时循环内外运行结果不一致如何解决
spaCy NER直接输入文本与文件读取文本识别结果不一致的解决思路
核心根因
你代码中最直接的问题是错误使用csv.reader读取文本后,将整行返回的列表直接做了字符串转换:csv.reader逐行读取返回的row是列表类型(比如单字段行返回格式为['你的文本内容']),直接用str(row)转换后得到的字符串会额外带上方括号、单引号等字符,和你手动输入的原始文本完全不同,自然会导致NER识别结果出现差异。
可落地解决步骤
- 第一步:修正文件读取逻辑
如果你的Synth_dataset_raw.txt是普通纯文本文件,每行存储一条待识别文本,直接迭代文件对象即可,不需要调用csv.reader,参考修改代码:
如果你的文件确实是csv格式,仅需要取对应列的文本内容,不要转换整行列表:with open('Synth_dataset_raw.txt', 'r', encoding='utf-8') as fd: for line in fd: # 清除首尾换行、多余空白 clean_text = line.strip() # 跳过空行 if not clean_text: continue sent = nlp(clean_text) displacy.render(sent, style = 'ent')with open('Synth_dataset_raw.txt', 'r', encoding='utf-8') as fd: reader = csv.reader(fd) # 若存在表头可先执行 next(reader) 跳过表头 for row in reader: # 此处示例取第一列的文本,可根据实际列数调整索引 clean_text = row[0].strip() if not clean_text: continue sent = nlp(clean_text) displacy.render(sent, style = 'ent') - 第二步:校验文本一致性
完成读取逻辑修改后,用repr()函数分别打印手动输入的文本、文件读取的文本,对比是否存在隐形字符、大小写差异、拼写偏差、编码异常等肉眼难以识别的区别:# 对比两个文本是否完全一致 manual_text = 'Yesterday I went out with Andrew, johanna and Jonathan Sparow.' print(repr(manual_text)) print(repr(clean_text)) - 第三步:排除模型干扰
若文本完全一致结果仍有差异,可升级spaCy和en_core_web_trf到最新稳定版,排除版本bug导致的识别波动。
内容的提问来源于stack exchange,提问作者albusdemens
相关产品推荐
相关产品推荐

