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")
请注意,在示例中,完全相同的跨度有两个注释。如果删除其中一个注释,则不会出现错误


您可能会遇到错误,因为您的批注重叠且不可用。

问题已在此处解决:。尽管如此,它仍然需要一些改进。