我正在使用空格训练一个nlp模型。我已经将预处理步骤全部写成了管道,现在我需要进行训练。根据space的文档,我需要运行以下命令:
python -m spacy train config.cfg --output ./output --paths.train ./train.spacy --paths.dev ./dev.spacy
文件config.cfg
,train.spacy
和dev.spacy
都注册在我的数据目录中。我想用类似于下面的代码来运行这个命令:
import subprocess
def train_spacy_nlp_model(
config_filepath: str,
train_filepath: str,
dev_filepath: str,
output_dir: str
):
cmd = [
"python -m", "spacy",
"train", config_filepath,
"--output", output_dir,
"--paths.train", train_filepath,
"--paths.dev", dev_filepath
]
result = subprocess.run(" ".join(cmd), shell=True)
if result.returncode != 0:
raise RuntimeError("Spacy training failed")
但是我不知道如何从数据目录中的项目检索文件路径信息,是否有一种方法在创建管道时将此信息传递给我的节点?
作为输入的变量是字符串。而数据编目则不同。数据目录变量为Kedro Dataset.
两者是不同的。将路径存储为配置文件的一部分,这样你就可以启动你的项目了。
这可能不是最优雅的解决方案,但它适用于我,所以我会使用它,直到我得到一个更好的解决方案。解决方案是在我的DataSet
实现上返回对象的路径,我怀疑这将适用于其他数据集,例如SQL查询,但是因为我知道我必须在这里处理一个文件,所以工作得很好。下面是我的实现:
from kedro.io import AbstractDataSet
from spacy.tokens import DocBin
from dataclasses import dataclass
from typing import Union
from pathlib import Path
@dataclass
class DocBinModel:
filepath: Path
docbin: DocBin
class SpacyDocBinDataSet(AbstractDataSet):
def __init__(self, filepath, save_args=None, load_args=None):
self._filepath = filepath
self._save_args = save_args or {}
self._load_args = load_args or {}
def _describe(self):
return dict(
filepath=self._filepath,
save_args=self._save_args,
load_args=self._load_args,
)
def _load(self):
with open(self._filepath, "rb") as f:
docbin = DocBin().from_bytes(f.read())
return DocBinModel(self._filepath, docbin)
def _save(self, data: Union[DocBin, DocBinModel]):
if isinstance(data, DocBinModel):
data = data.docbin
data.to_disk(self._filepath)
def _exists(self):
return Path(self._filepath).exists()
您可以使用_get_load_path()
catalog.datasets.mydataset._get_load_path()