Я тренирую модель nlp, используя spacy. У меня есть все этапы предварительной обработки, написанные в виде конвейера, и теперь мне нужно провести обучение. Согласно документации spacy мне нужно выполнить следующую команду:
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.
Оба разные. Сохраните путь как часть конфигурации, и вы начнете свой проект.
Есть ли способ заставить их делиться этой информацией из одного источника?
Я знаю, что он хранится в атрибуте _filepath для набора данных, но если бы я мог получить доступ к этому атрибуту в конвейере, было бы здорово
Это, вероятно, не самое элегантное решение, но оно работает для меня, поэтому я буду использовать его, пока не получу лучшее решение. Решение состояло в том, чтобы вернуть путь с объектом в моей реализации 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()
Мне дан код только как пример поведения, которого я ожидаю, код не высечен на камне. Я действительно хочу избежать сохранения пути как в конфигурации, так и в каталоге данных, так как это было бы анти-шаблоном, если бы они были в обоих местах, и мне нужны файлы в каталоге для предыдущих шагов предварительной обработки.