如何在单次Spacy训练中使用多个.spacy训练文件?
解决spaCy多训练文件传入的报错问题
问题原因
当你用"${TRAIN_SPACY_FILES[@]}"展开数组时,第二个及以后的文件路径会被当成独立的命令行参数,spaCy会把这些未以--开头的参数误认为是无效的配置覆盖项,从而触发报错。
解决方法
spaCy支持通过逗号分隔多个文件路径或glob通配符来指定多份训练/开发文件,具体两种实现方式如下:
方式1:数组转逗号分隔字符串
修改脚本中参数传递部分,把数组元素拼接成逗号分隔的单个字符串,让spaCy识别为一个完整的路径参数:
# 将训练文件数组转为逗号分隔的字符串 TRAIN_PATHS=$(IFS=,; echo "${TRAIN_SPACY_FILES[*]}") # 将开发文件数组转为逗号分隔的字符串 DEV_PATHS=$(IFS=,; echo "${DEV_SPACY_FILES[*]}") # 执行训练命令 python -m spacy train "$FILLED_CONFIG" --output "$OUTPUT_DIR" --gpu-id 0 --verbose \ --paths.train "$TRAIN_PATHS" \ --paths.dev "$DEV_PATHS"
方式2:使用glob通配符(文件路径有规律时适用)
如果你的训练/开发文件都在同一目录,且命名有统一规律(比如都以de_*-ud-train.spacy结尾),可以直接用shell通配符匹配所有目标文件:
python -m spacy train "$FILLED_CONFIG" --output "$OUTPUT_DIR" --gpu-id 0 --verbose \ --paths.train "./training_data/de_*-ud-train.spacy" \ --paths.dev "./training_data/de_*-ud-dev.spacy"
核心逻辑说明
spaCy的--paths.train和--paths.dev参数仅接受单个字符串值,这个值可以是:
- 单个文件路径
- 逗号分隔的多个文件路径
- 符合shell glob规则的路径模式(会自动展开匹配到的所有文件)
通过以上方式传递参数,就能让spaCy正确识别所有训练/开发文件,避免参数解析错误。
内容的提问来源于stack exchange,提问作者lhk
相关产品推荐
相关产品推荐

