Files
999/scripts/ingest_rene_guenon.py

210 lines
13 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ingest_rene_guenon.py
=====================
Парсер фундаментального труда Рене Генона «Символы священной науки» (1962/2002)
из файла /home/alexives/Desktop/newsources/simvoli_svyash_nauki.doc (29 694 строки).
"""
import os
import sys
import json
import re
import subprocess
from pathlib import Path
from datetime import datetime
PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(PROJECT_ROOT))
from oracle_enricher.enricher.passport_schema import count_filled_fields
DOC_PATH = Path("/home/alexives/Desktop/newsources/simvoli_svyash_nauki.doc")
STAGING_DB_PATH = PROJECT_ROOT / "assets" / "data" / "oracle_passports_staging.json"
MAIN_DB_PATH = PROJECT_ROOT / "assets" / "data" / "oracle_passports.json"
EXTERNAL_DB_PATH = PROJECT_ROOT / "assets" / "data" / "oracle_external_symbols.json"
ENRICHER_EXTERNAL_PATH = PROJECT_ROOT / "oracle_enricher" / "data" / "oracle_external_symbols.json"
def clean_spaces(text: str) -> str:
text = re.sub(r'(\w+)-\s*\n\s*(\w+)', r'\1\2', text)
return re.sub(r'\s+', ' ', text).strip()
def main():
print("=" * 70)
print("📖 ПАРСИНГ РЕНЕ ГЕНОНА: «СИМВОЛЫ СВЯЩЕННОЙ НАУКИ»")
print("=" * 70)
if not DOC_PATH.exists():
print(f"❌ Файл не найден: {DOC_PATH}")
return
# Извлекаем текст через catdoc
raw_text = subprocess.check_output(["catdoc", "-d", "utf-8", str(DOC_PATH)]).decode("utf-8")
print(f"Извлечено строк: {len(raw_text.splitlines())}, символов: {len(raw_text)}")
with open(STAGING_DB_PATH, "r", encoding="utf-8") as f:
staging_db = json.load(f)
with open(EXTERNAL_DB_PATH, "r", encoding="utf-8") as f:
external_db = json.load(f)
core_index = {}
for idx_str, entry in staging_db.items():
w = entry.get("word", "").lower().strip()
if w:
core_index[w] = idx_str
# Карта глав Генона к целевым сакральным знакам Оракула
chapter_sign_map = [
(2, "Слово и символ", "слово", ["philosophical_essence", "meta_synthesis", "semantic_core"]),
(3, "Сердце Иисусово и легенда о Святом Граале", "сердце", ["philosophical_essence", "meta_synthesis", "culture_hermetic_light"]),
(4, "Святой Грааль", "чаша", ["culture_hermetic_light", "meta_synthesis", "state_creative"]),
(7, "Язык птиц", "птица", ["archetype_category", "meta_synthesis", "script_antiquity"]),
(8, "Идея Центра в древних традициях", "центр", ["philosophical_essence", "meta_synthesis", "geometric_archetype"]),
(9, "Цветы-символы", "цветок", ["meta_synthesis", "culture_hermetic_light", "semantic_core"]),
(10, "Тройная друидическая ограда", "лабиринт", ["culture_celtic_light", "geometric_archetype", "meta_synthesis"]),
(11, "Хранители Святой Земли", "земля", ["cosmogonic_role", "meta_synthesis", "culture_kabbalah_light"]),
(12, "Земля Солнца", "солнце", ["solar_lunar_axis", "meta_synthesis", "cosmogonic_role"]),
(14, "Тетрактис и квадрат четырех", "четыре", ["geometric_archetype", "meta_synthesis", "script_antiquity"]),
(15, "Иероглиф Полюса", "север", ["spatial_orientation", "meta_synthesis", "cosmogonic_role"]),
(17, "Буква G и свастика", "колесо", ["geometric_archetype", "meta_synthesis", "culture_hermetic_light"]),
(18, "Несколько аспектов символики Януса", "врата", ["spatial_orientation", "culture_antiquity_light", "meta_synthesis"]),
(19, "Иероглиф рака", "рак", ["mantic_zodiac_west", "meta_synthesis", "cosmogonic_role"]),
(22, "Некоторые аспекты символики рыбы", "рыба", ["archetype_category", "meta_synthesis", "culture_hermetic_light"]),
(24, "Вепрь и Медведица", "вепрь", ["archetype_category", "culture_celtic_light", "culture_india_light"]),
(24, "Вепрь и Медведица", "медведь", ["archetype_category", "culture_celtic_light", "culture_nordic_light"]),
(25, "Громовые камни", "камень", ["elemental_affinity", "culture_hermetic_light", "meta_synthesis"]),
(25, "Громовые камни", "молния", ["elemental_affinity", "culture_antiquity_light", "meta_synthesis"]),
(26, "Символическое оружие", "меч", ["will_vector", "meta_synthesis", "culture_hermetic_light"]),
(27, "Сайфуль-Ислам", "меч", ["culture_islam_light", "will_vector", "meta_synthesis"]),
(28, "Символика рогов", "рога", ["archetype_category", "culture_sumer_light", "meta_synthesis"]),
(29, "Пещера и лабиринт", "пещера", ["chthonic_aspect", "spatial_orientation", "meta_synthesis"]),
(29, "Пещера и лабиринт", "лабиринт", ["geometric_archetype", "meta_synthesis", "spatial_orientation"]),
(30, "Сердце и пещера", "сердце", ["philosophical_essence", "meta_synthesis", "semantic_core"]),
(31, "Гора и Пещера", "гора", ["cosmogonic_role", "spatial_orientation", "meta_synthesis"]),
(32, "Сердце и Мировое Яйцо", "яйцо", ["cosmogonic_role", "geometric_archetype", "meta_synthesis"]),
(35, "Врата солнцестояния", "врата", ["spatial_orientation", "cosmogonic_role", "meta_synthesis"]),
(39, "Символика купола", "храм", ["spatial_orientation", "geometric_archetype", "meta_synthesis"]),
(40, "Купол и колесо", "колесо", ["geometric_archetype", "meta_synthesis", "cosmogonic_role"]),
(41, "Узкие врата", "врата", ["spatial_orientation", "meta_synthesis", "will_vector"]),
(42, "Восьмиугольник", "восемь", ["geometric_archetype", "meta_synthesis", "script_antiquity"]),
(47, "Белое и черное", "белый", ["elemental_affinity", "meta_synthesis", "culture_hermetic_light"]),
(47, "Белое и черное", "черный", ["chthonic_aspect", "meta_synthesis", "culture_hermetic_light"]),
(48, "Черный камень и камень кубический", "камень", ["geometric_archetype", "meta_synthesis", "culture_islam_light"]),
(51, "Мировое Древо", "дерево", ["cosmogonic_role", "meta_synthesis", "culture_india_light"]),
(52, "Дерево и ваджра", "молния", ["cosmogonic_role", "culture_india_light", "meta_synthesis"]),
(53, "Древо Жизни и напиток бессмертия", "вино", ["culture_hermetic_light", "meta_synthesis", "cosmogonic_role"]),
(54, "Символика лестницы", "лестница", ["spatial_orientation", "meta_synthesis", "will_vector"]),
(56, "Прохождение вод", "вода", ["elemental_affinity", "cosmogonic_role", "meta_synthesis"]),
(56, "Прохождение вод", "река", ["elemental_affinity", "spatial_orientation", "meta_synthesis"]),
(57, "Семь лучей и радуга", "радуга", ["elemental_affinity", "cosmogonic_role", "meta_synthesis"]),
(57, "Семь лучей и радуга", "семь", ["geometric_archetype", "meta_synthesis", "mantic_septener"]),
(60, "Свет и дождь", "свет", ["elemental_affinity", "cosmogonic_role", "meta_synthesis"]),
(60, "Свет и дождь", "дождь", ["elemental_affinity", "cosmogonic_role", "meta_synthesis"]),
(63, "Символика моста", "мост", ["spatial_orientation", "meta_synthesis", "will_vector"]),
(64, "Мост и радуга", "мост", ["spatial_orientation", "cosmogonic_role", "meta_synthesis"]),
(68, "Узы и узлы", "узел", ["geometric_archetype", "meta_synthesis", "will_vector"]),
(69, "Сердце лучистое и сердце пылающее", "сердце", ["philosophical_essence", "meta_synthesis", "state_creative"]),
(70, "Сердце и мозг", "мозг", ["philosophical_essence", "meta_synthesis", "state_creative"]),
(72, "Всевидящее око", "глаз", ["cosmogonic_role", "meta_synthesis", "script_egypt"]),
(73, "Горчичное зерно", "зерно", ["cosmogonic_role", "meta_synthesis", "state_creative"]),
(75, "Божественный град", "город", ["spatial_orientation", "geometric_archetype", "meta_synthesis"]),
]
# Находим границы каждой главы в тексте
chapter_positions = []
matches = list(re.finditer(r'\n([0-9]{1,2})\.\s+([А-ЯЁ][^\n]{3,60})\n', raw_text))
for m in matches:
title = m.group(2).strip()
if "PAGEREF" not in title:
chapter_positions.append((int(m.group(1)), title, m.start()))
print(f"Найдено глав в основном тексте: {len(chapter_positions)}")
enriched_count = 0
external_count = 0
timestamp_str = datetime.now().isoformat()
# Извлекаем текст каждой главы
for idx, (ch_num, ch_title, start_pos) in enumerate(chapter_positions):
end_pos = chapter_positions[idx + 1][2] if idx + 1 < len(chapter_positions) else len(raw_text)
chapter_body = clean_spaces(raw_text[start_pos:end_pos])
# Ищем совпадения в нашей карте знаков
matched_mappings = [m for m in chapter_sign_map if m[0] == ch_num]
if matched_mappings:
for _, title_hint, sign_word, pref_fields in matched_mappings:
if sign_word in core_index:
core_id = core_index[sign_word]
entry = staging_db[core_id]
fields = entry.setdefault("fields", {})
target_field = None
for pf in pref_fields:
if not fields.get(pf):
target_field = pf
break
if not target_field:
# Запасные ячейки
for alt in ["meta_synthesis", "semantic_core", "state_creative"]:
if not fields.get(alt):
target_field = alt
break
excerpt = (chapter_body[:420] + "...") if len(chapter_body) > 420 else chapter_body
quoted = f"[Рене Генон · «Символы священной науки»]: «{excerpt}»"
if target_field and not fields.get(target_field):
fields[target_field] = quoted
filled, _ = count_filled_fields(entry)
entry["filled_count"] = filled
entry["is_complete"] = (filled >= 78)
enriched_count += 1
else:
# Если глава не сопоставлена с каноном, отправляем в базу внешних символов
term_clean = re.sub(r'\(.*?\)', '', ch_title).strip()
norm = term_clean.lower()
if len(norm) > 2 and norm not in external_db:
external_db[norm] = {
"term": term_clean,
"normalized": norm,
"category_guess": "Священный традиционный символ (Рене Генон)",
"sources": [{
"author": "Рене Генон",
"work": "Символы священной науки",
"excerpt": chapter_body[:1000],
"target_field_suggestion": "meta_synthesis"
}],
"illustrations": [],
"created_at": timestamp_str,
"updated_at": timestamp_str
}
external_count += 1
print(f"\n✅ Завершено: Обогащено знаков Оракула 999: +{enriched_count}")
print(f"✅ Добавлено внешних священных символов Генона: +{external_count}")
# Сохраняем обновленные базы
with open(STAGING_DB_PATH, "w", encoding="utf-8") as f:
json.dump(staging_db, f, ensure_ascii=False, indent=2)
with open(MAIN_DB_PATH, "w", encoding="utf-8") as f:
json.dump(staging_db, f, ensure_ascii=False, indent=2)
with open(EXTERNAL_DB_PATH, "w", encoding="utf-8") as f:
json.dump(external_db, f, ensure_ascii=False, indent=2)
with open(ENRICHER_EXTERNAL_PATH, "w", encoding="utf-8") as f:
json.dump(external_db, f, ensure_ascii=False, indent=2)
print("💾 Базы данных успешно сохранены и синхронизированы.")
if __name__ == "__main__":
main()