如何处理doccano-transformer输出的generator对象并转换为spaCy格式?
解决doccano-transformer返回generator而非spaCy对象的问题
dataset.to_spacy()方法返回生成器(generator)是设计使然——为了在处理大规模数据集时节省内存,它会逐个生成spaCy的Doc对象,而非一次性把所有数据加载到内存中。要转换成可用的spaCy格式,有以下几种方式:
1. 转换成spaCy Doc对象列表(小数据集适用)
如果你的数据集规模不大,可以直接用list()把生成器转换成包含spaCy Doc对象的列表:
spacy_docs = list(dataset.to_spacy(tokenizer=str.split))
此时spacy_docs中的每个元素都是标准的spaCy Doc对象,可直接用于后续的预处理、模型训练等操作。
2. 保存为spaCy二进制格式(推荐用于持久化)
如果需要把标注数据保存成spaCy官方支持的二进制格式,方便后续加载和使用,可以借助DocBin工具:
from spacy.tokens import DocBin # 初始化DocBin doc_bin = DocBin() # 遍历生成器,将每个Doc对象添加到DocBin中 for doc in dataset.to_spacy(tokenizer=str.split): doc_bin.add(doc) # 保存到磁盘 doc_bin.to_disk("./annotated_data.spacy")
之后要加载数据时,只需:
import spacy nlp = spacy.load("en_core_web_sm") # 加载对应语言的spaCy模型 docs = list(nlp.pipe(doc_bin.get_docs(nlp.vocab)))
3. 直接遍历生成器处理(大数据集适用)
如果数据集规模较大,不想占用过多内存,无需转换格式,直接遍历生成器逐个处理即可:
for doc in dataset.to_spacy(tokenizer=str.split): # 在这里对每个Doc对象执行操作,比如训练、分析等 process_doc(doc)
内容的提问来源于stack exchange,提问作者Pierre-Antoine Schnell
相关产品推荐
相关产品推荐

