spaCy准备训练数据时doc.char_span标注MONEY实体返回None怎么解决
问题原因
doc.char_span返回None的核心逻辑是你标注的字符起止位置,和spaCy实际拿到的文本的字符位置不匹配。
你标注£100的偏移量(24,28)是对着原始JSON文件里的文本统计的,但因为加载文件时编码错误,文本里多出来了一个Â字符,相当于spaCy拿到的文本比你标注时的文本多了1个字符,原来的偏移量就完全错位了,甚至刚好切到了字符中间或者跨了分词边界,char_span就会返回None。
解决方法
你当前读取JSON文件时没有指定编码,在Windows环境下会默认用GBK/GB2312编码读取UTF-8格式的文件:£的UTF-8编码占2个字节,用非UTF-8编码读取时就会被拆成Â和£两个字符,就是你看到的多余字符。
只要修改文件加载代码,明确指定编码为utf-8即可:
with open('training_data.json', encoding='utf-8') as train_data: train_data_json = json.load(train_data)
修改后可以先做两步验证:
- 打印加载出来的对应文本,确认
Â字符已经消失 - 取
text[24:28]查看结果是否正好是£100,确认偏移量匹配后再调用char_span就能正常返回结果。
内容的提问来源于stack exchange,提问作者mess1n
相关产品推荐
相关产品推荐

