Python ValueError:无法为令牌27设置实体,该令牌包含在实体中的多个跨度中
我正在尝试将Python ValueError:无法为令牌27设置实体,该令牌包含在实体中的多个跨度中,python,nlp,spacy,spacy-3,Python,Nlp,Spacy,Spacy 3,我正在尝试将数据集转换为.spacy,方法是先在doc中将其转换为DocBin。整个数据集文件可通过访问 我运行以下函数: def转换器(数据,输出文件): nlp=spacy.blank(“en”)#加载新的spacy模型 doc_bin=DocBin()#创建一个DocBin对象 对于文本,不在TQM(数据)中注释:#以前格式的数据 doc=nlp.make_doc(text)#从文本创建doc对象 ents=[] 对于开始、结束,在注释[“实体”]中添加标签:#添加字符索引 #支持的模式:
数据集
转换为.spacy
,方法是先在doc
中将其转换为DocBin
。整个数据集
文件可通过访问
我运行以下函数:
def转换器(数据,输出文件):
nlp=spacy.blank(“en”)#加载新的spacy模型
doc_bin=DocBin()#创建一个DocBin对象
对于文本,不在TQM(数据)中注释:#以前格式的数据
doc=nlp.make_doc(text)#从文本创建doc对象
ents=[]
对于开始、结束,在注释[“实体”]中添加标签:#添加字符索引
#支持的模式:严格、契约、扩展
span=doc.char\u span(开始、结束、标签=标签、对齐方式=“严格”)
#避免追溯;
#TypeError:类型为“NoneType”的对象没有len()
如果span为无:
通过
其他:
ents.append(span)
doc.ents=ents#用ents标记文本
单据添加(单据)
doc_bin.to_disk(f“/{outputFile}.spacy”)#保存docbin对象
返回f“已处理{len(doc_bin)}”
在数据集上运行函数后,我得到了回溯:
ValueError:[E1010]无法为令牌27设置实体信息,该令牌包含在实体中的多个跨距中、被阻止、丢失或在外部。
在仔细查看数据集
文件以查找此回溯所引发的文本后,我发现以下内容:
[('HereLongText..(摘要)],
{'entities':[('0','27','SpecificDisease'),
(‘80’、‘93’、‘特殊疾病’),
(‘260’、‘278’、‘特殊疾病’),
(‘615’、‘628’、‘特殊疾病’),
(‘673’、‘691’、‘特殊疾病’),
('754','772','SpecificDisease')]]
我不知道如何解决这个问题。我认为这应该让你的问题清楚。下面是一个稍微修改过的代码版本,它有相同的错误
import spacy
from spacy.tokens import DocBin
from tqdm import tqdm
def converter(data, outputFile):
nlp = spacy.blank("en") # load a new spacy model
doc_bin = DocBin() # create a DocBin object
for text, annot in tqdm(data): # data in previous format
doc = nlp.make_doc(text) # create doc object from text
ents = []
for start, end, label in annot["entities"]: # add character indexes
# supported modes: strict, contract, expand
span = doc.char_span(start, end, label=label, alignment_mode="strict")
# to avoid having the traceback;
# TypeError: object of type 'NoneType' has no len()
if span is None:
pass
else:
ents.append(span)
doc.ents = ents # label the text with the ents
doc_bin.add(doc)
doc_bin.to_disk(f"./{outputFile}.spacy") # save the docbin object
return f"Processed {len(doc_bin)}"
data = [("I like cheese",
{"entities": [
(0, 1, "Sample"),
(0, 1, "Sample"), # Same thing twice
]})]
converter(data, "out.txt")
请注意,在示例中,完全相同的跨度有两个注释。如果删除其中一个注释,则不会出现错误
您可能会遇到错误,因为您的批注重叠且不可用。问题已在此处解决:。尽管如此,它仍然需要一些改进。