This commit is contained in:
2026-02-01 22:02:49 +03:00
parent 65d7be8795
commit 2d4eff6c3f
18 changed files with 1321 additions and 419 deletions

View File

@@ -14,16 +14,37 @@
Один JSON: все поля анализа + `tags`, `removed`. Если задан `--input-chapter`, в выход добавляются метаданные главы/книги (book_id, chapter_id, chapter_number, chapter_title, book_title, author). Этот документ передаётся в шаг 6 (генерация эмбеддингов) и в шаг 7 (payload Qdrant).
## Использование
## Скрипт с путями по умолчанию
`run_merge_analysis_tags.py` — мерж с путями по умолчанию (как в остальных этапах). Без вызова LLM.
**Вход (по умолчанию):**
- `../1_анализ_главы/merge.json` — полный анализ (framework, insights, application, limitations)
- `../4_валидация_тегов/validated_tags.json` — результат шага 4 (tags, removed)
- `../1_анализ_главы/вход_главы.json` — метаданные главы/книги (book_id, chapter_id и т.д.; подставляются в выход для шагов 68)
**Выход:** `merged_with_tags.json` в каталоге скрипта (или путь через `-o`).
**Запуск:**
```bash
python3 merge_analysis_tags.py <merge.json> <выход_valid_tag.json> [--input-chapter вход_главы.json] [-o выход.json]
cd 5_мерж_анализа_и_тегов
python3 run_merge_analysis_tags.py
# с указанием путей:
python3 run_merge_analysis_tags.py --merge /path/to/merge.json --tags /path/to/validated_tags.json --input-chapter /path/to/вход_главы.json -o merged_with_tags.json
# без метаданных главы:
python3 run_merge_analysis_tags.py --no-chapter
```
Пример (с метаданными для шага 7):
## Универсальный скрипт (позиционные аргументы)
```bash
python3 merge_analysis_tags.py ../2b_финальная_валидация_согласованности/merge.json ../4_валидация_тегов/выход_valid_tag.json --input-chapter ../1_анализ_главы/вход_главы.example.json -o merged_with_tags.json
python3 merge_analysis_tags.py <merge.json> <validated_tags.json> [--input-chapter вход_главы.json] [-o выход.json]
```
Пример:
```bash
python3 merge_analysis_tags.py ../1_анализ_главы/merge.json ../4_валидация_тегов/validated_tags.json --input-chapter ../1_анализ_главы/вход_главы.json -o merged_with_tags.json
```
Без `-o` результат выводится в stdout.

View File

@@ -0,0 +1,95 @@
#!/usr/bin/env python3
"""
Запуск шага 5 с путями по умолчанию: мерж анализа (2b) и валидированных тегов (4).
Без вызова LLM — только слияние JSON. Использует merge_analysis_tags.merge_analysis_and_tags.
Вход по умолчанию: merge.json (1), validated_tags.json (4), вход_главы.json (1).
Выход по умолчанию: merged_with_tags.json в каталоге скрипта.
"""
import argparse
import json
import sys
from pathlib import Path
DIR = Path(__file__).resolve().parent
DEFAULT_ANALYSIS = DIR.parent / "1_анализ_главы" / "merge.json"
DEFAULT_TAGS = DIR.parent / "4_валидация_тегов" / "validated_tags.json"
DEFAULT_CHAPTER = DIR.parent / "1_анализ_главы" / "вход_главы.json"
DEFAULT_OUTPUT = DIR / "merged_with_tags.json"
# Импорт логики мержа из основного скрипта
from merge_analysis_tags import load_json, merge_analysis_and_tags
def main() -> int:
"""Загружает анализ и теги по путям (по умолчанию — из соседних этапов), мержит, пишет выход."""
parser = argparse.ArgumentParser(
description="Мерж анализа (2b) и валидированных тегов (4) в один JSON (шаг 5). Пути по умолчанию — из этапов 1 и 4.",
)
parser.add_argument(
"--merge",
type=Path,
default=DEFAULT_ANALYSIS,
help=f"Путь к merge.json с анализом (по умолчанию: {DEFAULT_ANALYSIS})",
)
parser.add_argument(
"--tags",
type=Path,
default=DEFAULT_TAGS,
help=f"Путь к validated_tags.json (по умолчанию: {DEFAULT_TAGS})",
)
parser.add_argument(
"--input-chapter",
type=Path,
default=DEFAULT_CHAPTER,
help=f"Путь к вход_главы.json для метаданных главы/книги (по умолчанию: {DEFAULT_CHAPTER})",
)
parser.add_argument(
"-o",
"--output",
type=Path,
default=DEFAULT_OUTPUT,
help=f"Путь к выходному JSON (по умолчанию: {DEFAULT_OUTPUT})",
)
parser.add_argument(
"--no-chapter",
action="store_true",
help="Не подставлять метаданные главы из --input-chapter.",
)
args = parser.parse_args()
if not args.merge.is_file():
print(f"Файл не найден: {args.merge}", file=sys.stderr)
return 1
if not args.tags.is_file():
print(f"Файл не найден: {args.tags}", file=sys.stderr)
return 1
print("Загрузка merge.json и validated_tags.json...")
try:
analysis = load_json(args.merge)
tags_doc = load_json(args.tags)
except json.JSONDecodeError as e:
print(f"Ошибка разбора JSON: {e}", file=sys.stderr)
return 1
input_chapter = None
if not args.no_chapter and args.input_chapter.is_file():
try:
input_chapter = load_json(args.input_chapter)
except json.JSONDecodeError as e:
print(f"Ошибка разбора input-chapter JSON: {e}", file=sys.stderr)
return 1
elif not args.no_chapter and not args.input_chapter.is_file():
print(f"Файл не найден (метаданные главы не добавлены): {args.input_chapter}", file=sys.stderr)
merged = merge_analysis_and_tags(analysis, tags_doc, input_chapter)
args.output.parent.mkdir(parents=True, exist_ok=True)
with open(args.output, "w", encoding="utf-8") as f:
json.dump(merged, f, ensure_ascii=False, indent=2)
print(f"Записано: {args.output}")
return 0
if __name__ == "__main__":
sys.exit(main())