Kedro - Получение пути к элементу в каталоге данных

Я тренирую модель 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")

Но я понятия не имею, как получить информацию о пути к файлу из элементов моего каталога данных. Есть ли способ передать эту информацию моим узлам при создании конвейера?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Переменные, которые вы используете в качестве входных данных, являются строками. Пока каталог данных другой. Переменные каталога данных — набор данных Kedro.

Оба разные. Сохраните путь как часть конфигурации, и вы начнете свой проект.

Мне дан код только как пример поведения, которого я ожидаю, код не высечен на камне. Я действительно хочу избежать сохранения пути как в конфигурации, так и в каталоге данных, так как это было бы анти-шаблоном, если бы они были в обоих местах, и мне нужны файлы в каталоге для предыдущих шагов предварительной обработки.

João Areias 11.11.2022 10:31

Есть ли способ заставить их делиться этой информацией из одного источника?

João Areias 11.11.2022 10:32

Я знаю, что он хранится в атрибуте _filepath для набора данных, но если бы я мог получить доступ к этому атрибуту в конвейере, было бы здорово

João Areias 11.11.2022 10:59
Ответ принят как подходящий

Это, вероятно, не самое элегантное решение, но оно работает для меня, поэтому я буду использовать его, пока не получу лучшее решение. Решение состояло в том, чтобы вернуть путь с объектом в моей реализации 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()

Другие вопросы по теме