#!/usr/bin/env python3 """ Скрипт глубокого обогащения Оракула 999: 1. Додекада: 12 Созвездий (добавление 6 созвездий, обновление 6 с двойными значениями) 2. Септенер Добродетелей (7) 3. Септенер Смертных Грехов (7) 4. Удаление 13 совершенных глаголов-дублей 5. Явная маркировка всех Септенеров и Додекады в описаниях 6. Присвоение выразительных эмодзи (1-2 иконки) для КАЖДОГО из 1000 слов 7. Полный прогон классификатора-обогатителя (families, operator, valence, jurisdictions, lookup) 8. Синхронизация words_data.dart, lexicon.json, oracle_kb.json, words_alphabetical.txt/md, lexicon_viewer.html """ import os import re import json import locale from collections import Counter ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DART_PATH = os.path.join(ROOT, "lib", "data", "words_data.dart") LEXICON_JSON_PATH = os.path.join(ROOT, "oracle_enricher", "data", "lexicon.json") FAMILIES_JSON_PATH = os.path.join(ROOT, "oracle_enricher", "data", "families.json") KB_ASSET_PATH = os.path.join(ROOT, "assets", "data", "oracle_kb.json") KB_OUT_PATH = os.path.join(ROOT, "oracle_enricher", "out", "oracle_kb.json") TXT_PATH = os.path.join(ROOT, "words_alphabetical.txt") MD_PATH = os.path.join(ROOT, "words_alphabetical.md") HTML_PATH = os.path.join(ROOT, "lexicon_viewer.html") # Карта 13 новых слов взамен 13 совершенных глаголов REPLACEMENTS_13 = { # 6 Созвездий "попросить": "овен", "выпить": "телец", "сесть": "рак", "смочь": "стрелец", "отдать": "козерог", "ожидать": "водолей", # 2 Добродетели "подняться": "мужество", "начаться": "умеренность", # 5 Грехов "хотеться": "зависть", "подойти": "алчность", "остановиться": "чревоугодие", "положить": "похоть", "пройти": "уныние" } # Описания и метаданные для новых и обновляемых слов (Созвездия, Добродетели, Грехи) DESCRIPTIONS_UPDATE = { # ДОДЕКАДА СОЗВЕЗДИЙ (12) "овен": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 1/12 Овен (Огонь / Марс)] Первородный импульс весны, рог пробивающий скалу, ярость пробуждения. Овен начинает цикл без оглядки на риск — это пламя первого шага и воля вырваться из чрева зимы. В раскладе требует прямой смелости, лидерства и готовности идти на таран, предостерегая от слепой импульсивности." }, "телец": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 2/12 Телец (Земля / Венера)] Непоколебимая опора материи, плодородие, терпеливое накопление и сила плоти. Телец воплощает стойкость духа в физической форме, любовь к земным благам и упорный созидательный труд. Знак советует твердо стоять на земле, беречь ресурсы и строить на века." }, "близнецы": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 3/12 Близнецы (Воздух / Меркурий) | Двойной знак: Архетип Двойника] Воздушный перекресток двух умов, зеркало полярностей, неразрывный союз братьев света и тени. Как знак зодиака — ведает гибкостью мысли, скоростью слова и связью миров; как архетип — ставит лицом к лицу со своей второй половиной. Требует диалога и интеграции противоположностей." }, "рак": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 4/12 Рак (Вода / Луна)] Лоно истока, панцирь родовой памяти, охраняющий нежнейшую уязвимость сердца. Рак движется боком, оберегая священный очаг и чувствуя приливы невидимой Луны. В раскладе говорит о глубинных родовых корнях, защите близких, материнской заботе и верности памяти." }, "лев": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 5/12 Лев (Огонь / Солнце) | Двойной знак: Царь Зверей] Сердечное полуденное солнце, царственный суверенитет и сила живой плоти. Как созвездие — воплощает высшее творческое горение, благородство и власть духа; как тотем — мощь хищника, гриву величия и закон джунглей. Знак призывает явить миру истинное сияние сердца." }, "дева": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 6/12 Дева (Земля / Меркурий) | Двойной знак: Жрица Чистоты] Спелый колос жатвы, различение зерен от плевел и непорочное служение истине. Как знак зодиака — правит точностью деталей, исцелением и анализом формы; как архетип — несет чистый венец посвящения. В раскладе советует навести порядок, отсечь шелуху и быть внимательным к мелочам." }, "весы": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 7/12 Весы (Воздух / Венера) | Двойной знак: Весы Суда и Меры] Точка священного равновесия миров, закон гармонии и честного договора. Как созвездие — правит союзом душ, красотой партнерства и миром; как сакральный инструмент — взвешивает дела и помыслы на чашах правосудия. Знак требует справедливости, отказа от крайностей и взвешенного решения." }, "скорпион": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 8/12 Скорпион (Вода / Плутон) | Двойной знак: Страж Пустыни] Жало беспощадной трансформации, смерть ветхой личины и возрождение Феникса из пепла. Как созвездие — правит тайнами недр, страстью и магией алхимии; как тотем — несет смертоносный яд, способный стать высшим противоядием. Знак возвещает глубокий кризис, ведущий к перерождению." }, "стрелец": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 9/12 Стрелец (Огонь / Юпитер)] Кентавр духа, натянутый лук и стрела устремленная за горизонт видимого мира. Стрелец объединяет животную силу земли с высочайшим поиском божественной мудрости. В раскладе знаменует расширение горизонтов, дальнее странствие, духовного наставника и непоколебимую веру в высокую цель." }, "козерог": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 10/12 Козерог (Земля / Сатурн)] Одинокое восхождение на ледяную вершину, аскеза времени и кристаллизация высшего закона. Козерог преодолевает любые преграды через железное терпение, дисциплину и осознание долга. Знак сулит заслуженную вершину тем, кто не боится одиночества и холода на пути к мастерству." }, "водолей": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 11/12 Водолей (Воздух / Уран)] Излияние кувшина живых вод будущего, сокрушение отживших плотин и братство свободных сердец. Водолей не признает оков предрассудков — он черпает знания из грядущих веков и озаряет тьму светом открытий. Знак призывает мыслить парадоксально, ценить дружбу и сбросить оковы рутины." }, "рыбы": { "pos": "существительное", "category": "Космический Знак", "desc": "[Додекада Созвездий: 12/12 Рыбы (Вода / Нептун) | Двойной знак: Безмолвный Свидетель Глубин] Две космические рыбы бездны, плывущие в противоположные стороны, растворение границ эго в океане всеобщего духа. Как созвездие — венчает зодиакальный круг тайной завершения; как сакральный тотем — хранит немое знание глубин. Знак велит довериться интуиции, отпустить контроль и принять поток." }, # СЕПТЕНЕР ДОБРОДЕТЕЛЕЙ (7) "мудрость": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 1/7 Мудрость (Prudentia)] Чистый свет различения сути вещей, высшее видение причин и следствий вне суеты эго. Мудрость не спорит — она знает законы мироздания и действует в согласии с мерой. В раскладе призывает к глубокому осмыслению, обращению к древним канонам и тишине ума." }, "мужество": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 2/7 Мужество (Fortitudo)] Непоколебимая крепость духа, способность выстоять перед лицом страха, боли и неопределенности. Мужество — это не отсутствие страха, а осознание долга превыше собственной безопасности. Знак требует выпрямить спину, взять ответственность и сделать шаг навстречу вызову." }, "умеренность": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 3/7 Умеренность (Temperantia)] Золотая середина алхимии, переливание вод из сосуда в сосуд без пролития капли. Умеренность усмиряет дикие страсти, предотвращает перегибы и удерживает ситуацию в точке благодатного баланса. Знак советует сдержать аппетиты, избегать крайностей и соблюсти меру." }, "справедливость": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 4/7 Справедливость (Justitia)] Меч и чаши божественного закона, воздающие каждому по плодам дел его без пристрастия. Справедливость восстанавливает нарушенный миропорядок, снимая иллюзии оправданий. Знак предвещает честный суд, окончательный вердикт и необходимость держать ответ за сделанный выбор." }, "вера": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 5/7 Вера (Fides)] Незримый канат, связывающий душу с первоисточником в кромешной тьме сомнений. Вера видит цель там, где глаза видят только туман, и дает опору шагу над пропастью. В раскладе призывает отбросить малодушие, довериться своему призванию и опереться на высший завет." }, "надежда": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 6/7 Надежда (Spes)] Якорный канат спасения, зеленый росток пробивающий асфальт, утренняя заря после глухой ночи. Надежда не умирает, пока жив дух: она питает силы продолжать путь в самые тяжелые часы испытаний. Знак несет весть об избавлении, исцелении ран и скором просвете в судьбе." }, "любовь": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Добродетелей: 7/7 Любовь (Caritas)] Венец добродетелей, высшая созидающая сила вселенной, соединяющая разделенное в жертвенном единстве. Любовь не ищет своего и не завидует: она согревает сущее и дает смысл любому преодолению. Знак сулит благословение сердца, примирение враждующих и высшую защиту." }, # СЕПТЕНЕР СМЕРТНЫХ ГРЕХОВ (7) "гордыня": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 1/7 Гордыня (Superbia)] Корень всякого падения, самоослепление фальшивым величием и бунт глины против Горшечника. Гордыня возводит башню самомнения, глухую к чужой боли и высшим знакам. Знак предупреждает о неминуемом сокрушении иллюзорного пьедестала и призывает к смирению." }, "зависть": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 2/7 Зависть (Invidia)] Ядовитый червь сравнения, огорчающийся чужому благу и радующийся чужой беде. Зависть слепа к собственным дарам — она высушивает душу злобой на чужой свет. В раскладе предостерегает от токсичных сравнений, скрытых недоброжелателей и растраты сил на чужую жизнь." }, "гнев": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 3/7 Гнев (Ira)] Слепая вспышка ярости, застилающая разум кровавой пеленой и сжигающая собственные мосты. Гнев делает человека орудием разрушения, нанося удары вслепую. Знак требует немедленно остановить бурю страстей, не принимать решений в запале и обуздать внутреннее пламя." }, "уныние": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 4/7 Уныние (Acedia)] Полуденный бес апатии, паралич воли, предательство собственного духа и отказ от борьбы. Уныние обесценивает жизнь, превращая мир в серую пустошь без надежды. Знак предупреждает: опустив руки сейчас, ты сдаешь крепость без боя; требуется волевое усилие и простое действие." }, "алчность": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 5/7 Алчность (Avaritia)] Ненасытная бездна стяжательства, поклонение праху и страх остаться ни с чем. Алчность превращает человека в раба сундуков, где золото гниет без движения. Знак предостерегает от мелочной жадности, торгашества святынями и утраты души в погоне за тленным." }, "чревоугодие": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 6/7 Чревоугодие (Gula)] Рабство утробы и рецепторов, поглощение без меры, заглушающее зов духа шумом сытости. Чревоугодие отягощает тело и усыпляет бдительность, разменивая священный голод познания на земную жратву. Знак призывает к воздержанию, посту и очищению сосуда." }, "похоть": { "pos": "существительное", "category": "Образ / Архетип", "desc": "[Септенер Грехов: 7/7 Похоть (Luxuria)] Слепое сладострастие, размен священного огня созидания на сиюминутное угасание в плотском дурмане. Похоть лишает человека суверенитета, делая его игрушкой животных инстинктов. Знак предостерегает от разрушительных страстей, обмана вожделения и духовной опустошенности." } } # Шапки септенеров для ранее созданных групп: SEPTENER_PREFIXES = { # Планеты "меркурий": "[Септенер Планет: 1/7 Меркурий (Вестник и Мысль)] ", "венера": "[Септенер Планет: 2/7 Венера (Гармония и Любовь)] ", "марс": "[Септенер Планет: 3/7 Марс (Воля и Битва)] ", "юпитер": "[Септенер Планет: 4/7 Юпитер (Закон и Жребий)] ", "сатурн": "[Септенер Планет: 5/7 Сатурн (Время и Предел)] ", "уран": "[Септенер Планет: 6/7 Уран (Молния и Свобода)] ", "нептун": "[Септенер Планет: 7/7 Нептун (Океан и Транс)] ", # Металлы алхимии "золото": "[Септенер Металлов: 1/7 Золото (Солнце)] ", "серебро": "[Септенер Металлов: 2/7 Серебро (Луна)] ", "ртуть": "[Септенер Металлов: 3/7 Ртуть (Меркурий)] ", "медь": "[Септенер Металлов: 4/7 Медь (Венера)] ", "железо": "[Септенер Металлов: 5/7 Железо (Марс)] ", "олово": "[Септенер Металлов: 6/7 Олово (Юпитер)] ", "свинец": "[Септенер Металлов: 7/7 Свинец (Сатурн)] ", # Вкусы "сладкий": "[Септенер Вкусов: 1/7 Сладкий] ", "горький": "[Септенер Вкусов: 2/7 Горький] ", "кислый": "[Септенер Вкусов: 3/7 Кислый] ", "солёный": "[Септенер Вкусов: 4/7 Солёный] ", "терпкий": "[Септенер Вкусов: 5/7 Терпкий] ", "пресный": "[Септенер Вкусов: 6/7 Пресный] ", # Запахи "аромат": "[Септенер Запахов: 1/7 Аромат] ", "свежесть": "[Септенер Запахов: 2/7 Свежесть] ", "пряность": "[Септенер Запахов: 3/7 Пряность] ", "гарь": "[Септенер Запахов: 4/7 Гарь] ", "смрад": "[Септенер Запахов: 5/7 Смрад] ", "сырость": "[Септенер Запахов: 6/7 Сырость] ", "дурман": "[Септенер Запахов: 7/7 Дурман] ", # Качества материи "твёрдый": "[Септенер Качеств Материи: 1/7 Твёрдый] ", "мягкий": "[Септенер Качеств Материи: 2/7 Мягкий] ", "гладкий": "[Септенер Качеств Материи: 3/7 Гладкий] ", "шершавый": "[Септенер Качеств Материи: 4/7 Шершавый] ", "пушистый": "[Септенер Качеств Материи: 5/7 Пушистый] ", "сухой": "[Септенер Качеств Материи: 6/7 Сухой] ", "влажный": "[Септенер Качеств Материи: 7/7 Влажный] ", # Чувства тела "боль": "[Септенер Чувств Тела: 1/7 Боль] ", "трепет": "[Септенер Чувств Тела: 2/7 Трепет] ", "слепота": "[Септенер Чувств Тела: 3/7 Слепота] ", "глухота": "[Септенер Чувств Тела: 4/7 Глухота] ", "трезвость": "[Септенер Чувств Тела: 5/7 Трезвость] ", "опьянение": "[Септенер Чувств Тела: 6/7 Опьянение] ", "чутьё": "[Септенер Чувств Тела: 7/7 Чутьё] ", # Спектральные цвета "красный": "[Спектральный Септенер Цветов: 1/7 Красный] ", "оранжевый": "[Спектральный Септенер Цветов: 2/7 Оранжевый] ", "жёлтый": "[Спектральный Септенер Цветов: 3/7 Жёлтый] ", "зеленый": "[Спектральный Септенер Цветов: 4/7 Зелёный] ", "голубой": "[Спектральный Септенер Цветов: 5/7 Голубой] ", "синий": "[Спектральный Септенер Цветов: 6/7 Синий] ", "фиолетовый": "[Спектральный Септенер Цветов: 7/7 Фиолетовый] ", # Сакрально-земные цвета "белый": "[Сакральный Септенер Цветов: 1/7 Белый] ", "черный": "[Сакральный Септенер Цветов: 2/7 Чёрный] ", "серый": "[Сакральный Септенер Цветов: 3/7 Серый] ", "розовый": "[Сакральный Септенер Цветов: 4/7 Розовый] ", "прозрачный": "[Сакральный Септенер Цветов: 5/7 Прозрачный] ", "пурпурный": "[Сакральный Септенер Цветов: 6/7 Пурпурный] ", "коричневый": "[Сакральный Септенер Цветов: 7/7 Коричневый] ", # Ступени звукоряда "до": "[Септенер Звукоряда: 1/7 До | Двойной знак: Предел] ", "ре": "[Септенер Звукоряда: 2/7 Ре] ", "ми": "[Септенер Звукоряда: 3/7 Ми] ", "фа": "[Септенер Звукоряда: 4/7 Фа] ", "соль": "[Септенер Звукоряда: 5/7 Соль | Двойной знак: Минерал Земли] ", "ля": "[Септенер Звукоряда: 6/7 Ля] ", "си": "[Септенер Звукоряда: 7/7 Си] ", # Законы музыки "диез": "[Септенер Законов Музыки: 1/7 Диез] ", "бемоль": "[Септенер Законов Музыки: 2/7 Бемоль] ", "аккорд": "[Септенер Законов Музыки: 3/7 Аккорд] ", "лад": "[Септенер Законов Музыки: 4/7 Лад] ", "пауза": "[Септенер Законов Музыки: 5/7 Пауза] ", "ритм": "[Септенер Законов Музыки: 6/7 Ритм] ", "тон": "[Септенер Законов Музыки: 7/7 Тон] " } # Генератор характерных эмодзи для каждого из 1000 слов def get_word_emoji(w, category, pos, desc): # Прямой словарь для ключевых сакральных знаков SPECIAL_EMOJIS = { # Стихии и космос "огонь": "🔥", "вода": "💧", "воздух": "💨", "земля": "🌍", "свет": "✨", "тьма": "🌑", "день": "☀️", "ночь": "🌌", "утро": "🌅", "вечер": "🌇", "солнце": "☀️ 👑", "луна": "🌙", "звезда": "⭐", "космос": "🌌 🪐", "комета": "☄️", "затмение": "🌘", "орбита": "🔄 🪐", "полнолуние": "🌕", "новолуние": "🌑", "заря": "🌄", "рассвет": "🌅", "закат": "🌇", "сумерки": "🌆", "полдень": "☀️ ⏳", "полночь": "🕛 🌑", "вечность": "♾️", "миг": "⚡", "час": "⏳", # Планеты "меркурий": "☿️ 🪽", "венера": "♀️ 🌸", "марс": "♂️ ⚔️", "юпитер": "♃ ⚡", "сатурн": "♄ ⏳", "уран": "♅ ⚡", "нептун": "♆ 🌊", # Металлы алхимии "золото": "👑 🪙", "серебро": "🪞 🪙", "ртуть": "💧 🪙", "медь": "🏺 🪙", "железо": "⚔️ 🛡️", "олово": "🔔 🪙", "свинец": "⚓ 🪙", # Додекада Созвездий "овен": "♈ 🐏", "телец": "♉ 🐂", "близнецы": "♊ 👥", "рак": "♋ 🦀", "лев": "♌ 🦁", "дева": "♍ 🌾", "весы": "♎ ⚖️", "скорпион": "♏ 🦂", "стрелец": "♐ 🏹", "козерог": "♑ 🏔️", "водолей": "♒ 🏺", "рыбы": "♓ 🐟", # Цвета "красный": "🔴", "оранжевый": "🟠", "жёлтый": "🟡", "зеленый": "🟢", "голубой": "🔷", "синий": "🔵", "фиолетовый": "🟣", "белый": "⚪", "черный": "⚫", "серый": "🔘", "розовый": "🌸", "прозрачный": "💎", "пурпурный": "👑 🟣", "коричневый": "🟤", # Музыка "до": "🎵 🔴", "ре": "🎵 🟠", "ми": "🎵 🟡", "фа": "🎵 🟢", "соль": "🎵 🔵", "ля": "🎵 🟣", "си": "🎵 ⚪", "диез": "♯ ⬆️", "бемоль": "♭ ⬇️", "аккорд": "🎶 🎹", "лад": "🎼 📜", "пауза": "⏸️ 🤫", "ритм": "🥁 💓", "тон": "🔔 🔊", # Вкусы "сладкий": "🍯", "горький": "🌿 ☕", "кислый": "🍋", "солёный": "🧂", "терпкий": "🍷 🍇", "пресный": "🍞 💧", "острый": "🌶️ 🗡️", # Запахи "аромат": "🌸 ✨", "свежесть": "❄️ 🌬️", "пряность": "🌿 🫚", "гарь": "🔥 💨", "смрад": "☠️ 🌫️", "сырость": "🍄 💧", "дурман": "🥀 🧪", # Качества материи "твёрдый": "🪨 💎", "мягкий": "🪶 ☁️", "гладкий": "🪞 🧊", "шершавый": "🪵 📜", "пушистый": "🦊 🐾", "сухой": "🏜️ 🍂", "влажный": "💦 🌱", # Внутренние чувства тела "боль": "⚡ 🩸", "трепет": "🫀 ❄️", "слепота": "🙈 🕶️", "глухота": "🙉 🔇", "трезвость": "🧊 👁️", "опьянение": "🍷 🌀", "чутьё": "🐺 🧭", # Добродетели "мудрость": "🦉 📜", "мужество": "🛡️ ⚔️", "умеренность": "⚖️ 🏺", "справедливость": "⚖️ 🗡️", "вера": "🕊️ 🕯️", "надежда": "🌱 ⚓", "любовь": "❤️ 🔥", # Грехи "гордыня": "🦚 👑", "зависть": "🐍 👁️", "гнев": "🤬 🌋", "уныние": "🥀 🌧️", "алчность": "💰 🪙", "чревоугодие": "🍖 🍷", "похоть": "💋 🔥", # Тотемы и животные "волк": "🐺", "медведь": "🐻", "лиса": "🦊", "змея": "🐍", "змей": "🐉", "орел": "🦅", "ворон": "🐦‍⬛", "сокол": "🦅", "голубь": "🕊️", "сова": "🦉", "бык": "🐂", "баран": "🐏", "конь": "🐎", "собака": "🐕", "кот": "🐈", "дракон": "🐉 🐲", "грифон": "🦅 🦁", "сфинкс": "🦁 🗿", "феникс": "🔥 🦅", "василиск": "🦎 👑", "уроборос": "🐍 🔄", "кентавр": "🏹 🐎", "бабочка": "🦋", "пчела": "🐝", "паук": "🕷️", "черепаха": "🐢", "олень": "🦌", # Священные предметы и оружие "меч": "⚔️", "клинок": "🗡️", "щит": "🛡️", "лук": "🏹", "стрела": "🏹", "копье": "🗡️", "молот": "🔨", "топор": "🪓", "доспех": "🛡️", "шлем": "🪖", "кубок": "🏆", "чаша": "🥣", "грааль": "🏆 ✨", "алтарь": "🗿 🕯️", "зеркало": "🪞", "книга": "📖", "свиток": "📜", "печать": "🔏", "ключ": "🗝️", "замок": "🔒", "цепь": "⛓️", "узел": "🪢", "нить": "🧵", "веревка": "🪢", "корона": "👑", "трон": "🪑 👑", "скипетр": "🪄 👑", "лампа": "🪔", "свеча": "🕯️", "факел": "🔦 🔥", "колокол": "🔔", "барабан": "🥁", "арфа": "🎵 🪕", "флейта": "🪈", "посох": "🦯 ✨", "маска": "🎭", "плащ": "🧥 👤", "кольцо": "💍", "амулет": "🧿", "руна": "ᚱ ✨", "крест": "✝️", "колесо": "☸️", "монета": "🪙", "камень": "🪨", # Сакральные места "храм": "🏛️", "башня": "🗼", "стена": "🧱", "врата": "🚪 ✨", "порог": "🚪", "мост": "🌉", "лабиринт": "🌀 🏛️", "остров": "🏝️", "пещера": "🕳️ 🪨", "гора": "🏔️", "колодец": "🪣 💧", "гробница": "⚰️", "город": "🏙️", "дом": "🏠", "очаг": "🔥 🏡", "кузница": "🔨 🔥", "сад": "🌳 🌸", "лес": "🌲 🌳", "пустыня": "🏜️", "болото": "🐊 🌿", "озеро": "🌊", "река": "🏞️", "водопад": "🌊 ⚡", "берег": "🏖️", "море": "🌊 ⛵", "океан": "🌊 🐋", "бездна": "🕳️ 🌌", # Растения "дерево": "🌳", "дуб": "🪵 🌳", "берёза": "🌳 ⚪", "сосна": "🌲", "роза": "🌹", "лилия": "⚜️", "лотос": "🪷", "яблоко": "🍎", "виноград": "🍇", "зерно": "🌾", "пшеница": "🌾 🍞", "трава": "🌱", "корень": "🌱 🪵", "цветок": "🌸", "лист": "🍃", "плод": "🍎 🍊", "полынь": "🌿 🍵", "олива": "🫒 🕊️", "папоротник": "🌿 ✨", # Архетипы людей "царь": "👑 🤴", "королева": "👑 👸", "воин": "⚔️ 🛡️", "рыцарь": "🛡️ 🐎", "страж": "🛡️ 👁️", "старец": "🧙‍♂️ 📜", "маг": "🧙‍♂️ ✨", "жрец": "🕯️ 📜", "пророк": "👁️ 📜", "странник": "🎒 🚶", "шут": "🃏 🎭", "безумец": "🤪 ⚡", "слепец": "🦯 🙈", "мать": "🤱", "отец": "👨‍👧‍👦 🏛️", "дитя": "👶", "ребенок": "🧒", "девушка": "👧 🌸", "женщина": "👩", "мужчина": "👨", "бог": "⚡ 👑", "богиня": "✨ 👑", "ангел": "🪽 😇", "демон": "😈 ⛓️", "предатель": "🗡️ 🐍", "судья": "⚖️ 👨‍⚖️", "кузнец": "🔨 👨‍🏭", "целитель": "🌿 🩺", "пастух": "🐑 🦯", "монах": "🙏 🕯️", "купец": "⚖️ 🪙", "гость": "🚪 🤝", "враг": "⚔️ 👁️", "друг": "🤝 ❤️", "герой": "🦸 ⚔️", # Состояния и абстракции "жизнь": "🌱 ✨", "смерть": "💀 ⏳", "рождение": "🐣 🌱", "судьба": "📜 🧵", "жребий": "🎲 ✨", "тайна": "🗝️ 🤫", "тишина": "🤫 🌌", "безмолвие": "🤫 ❄️", "покой": "🕊️ 🧘", "страх": "😱 🌑", "ужас": "😨 ⚡", "сила": "💪 ⚡", "свобода": "🕊️ ⛓️‍💥", "плен": "⛓️ 🔒", "путь": "🛣️ 🧭", "след": "🐾", "сон": "💤 🌙", "пробуждение": "👁️ 🌅", "память": "🧠 📜", "забвение": "🌫️ 🍂", "рана": "🩹 🩸", "исцеление": "🌿 ✨", "голод": "🍽️ 🌑", "жажда": "🏜️ 💧", "равновесие": "⚖️ 🧘", "дар": "🎁 ✨", "жертва": "🕯️ 🩸", "союз": "🤝 💍", "договор": "📜 🖋️", "клятва": "✋ 🕯️", "победа": "🏆 🚩", "поражение": "🏳️ 💔", "чистота": "🪞 ✨", "грех": "🍎 ⛓️", "истина": "💎 ✨", "ложь": "🎭 🐍", "добро": "☀️ 🕊️", "зло": "🌑 🗡️", "начало": "🌱 🏁", "конец": "🏁 ⏳", "предел": "🛑 🚧", "рубеж": "🚧 ⚔️", "граница": "🗺️ 🚧", "порог": "🚪", "избыток": "🌊 🏺", "пустота": "🕳️ 💨", "полнота": "🌕 🏺", "хаос": "🌪️ 🌀", "порядок": "📐 🏛️", "число": "🔢 📐", "один": "1️⃣ 🌟", "два": "2️⃣ ♊", "три": "3️⃣ 🔺", "семь": "7️⃣ 🌈", "двенадцать": "1️⃣2️⃣ 👑", "сто": "💯" } if w in SPECIAL_EMOJIS: return SPECIAL_EMOJIS[w] # Семантические правила по категориям и частям речи if "Космический" in category or "Созвезди" in desc or "Планет" in desc: return "🌌 🪐" if "Священный Предмет" in category: return "✨ 🏺" if "Сакральное Место" in category: return "🏛️ 🧭" if "Архетип Человека" in category or "Человек" in category: return "👤 ✨" if "Тотем" in category: return "🐾 ✨" if "Сакральный Символ" in category: return "🔮 📜" if "глагол" in pos: return "⚡ ➡️" if "прилагательное" in pos: return "✨ 🎨" if "Мера" in category or "Состояние" in category: return "⚖️ 🌊" if "Вектор" in category or "Направление" in category: return "🧭 🏹" if "Узел" in category or "Связь" in category: return "🪢 🔗" return "🔮 ✨" def main(): print("=== ЗАПУСК ГЛУБОКОГО ОБОГАЩЕНИЯ ОРАКУЛА 999 ===") # 1. Загрузка исходных данных with open(DART_PATH, "r", encoding="utf-8") as f: dart_content = f.read() pattern = re.compile( r'WordItem\s*\(\s*id:\s*(\d+),\s*word:\s*"([^"]+)",\s*partOfSpeech:\s*"([^"]+)",\s*frequency:\s*([\d\.]+),\s*category:\s*"([^"]+)",\s*description:\s*"(.*?)",\s*\)', re.DOTALL ) matches = pattern.findall(dart_content) assert len(matches) == 1000, f"Expected 1000 items, got {len(matches)}" items = [] for m in matches: items.append({ "id": int(m[0]), "word": m[1].strip(), "pos": m[2].strip(), "frequency": float(m[3]), "category": m[4].strip(), "description": m[5].strip() }) # 2. Применение 13 замен replaced_count = 0 for it in items: w = it["word"] if w in REPLACEMENTS_13: new_w = REPLACEMENTS_13[w] meta = DESCRIPTIONS_UPDATE[new_w] it["word"] = new_w it["pos"] = meta["pos"] it["category"] = meta["category"] it["description"] = meta["desc"] replaced_count += 1 elif w in DESCRIPTIONS_UPDATE: # Обновление существующих зодиакальных / добродетелей / грехов meta = DESCRIPTIONS_UPDATE[w] it["pos"] = meta["pos"] it["category"] = meta["category"] it["description"] = meta["desc"] elif w in SEPTENER_PREFIXES: # Добавление префикса септенера, если его еще нет prefix = SEPTENER_PREFIXES[w] if not it["description"].startswith("["): it["description"] = prefix + it["description"] # Специальные переименования близнец -> близнецы, рыба -> рыбы if it["word"] == "близнец": meta = DESCRIPTIONS_UPDATE["близнецы"] it["word"] = "близнецы" it["category"] = meta["category"] it["description"] = meta["desc"] elif it["word"] == "рыба": meta = DESCRIPTIONS_UPDATE["рыбы"] it["word"] = "рыбы" it["category"] = meta["category"] it["description"] = meta["desc"] print(f"Применено {replaced_count} замен глаголов на Созвездия, Добродетели и Грехи.") # 3. Присвоение эмодзи для ВСЕХ 1000 слов for it in items: it["emoji"] = get_word_emoji(it["word"], it["category"], it["pos"], it["description"]) # 4. Валидация строго 1000 слов assert len(items) == 1000 unique_words = set(x["word"] for x in items) assert len(unique_words) == 1000, f"Duplicates found: {1000 - len(unique_words)}" assert set(x["id"] for x in items) == set(range(1000)) print("✅ Валидация базы пройдена: ровно 1000 уникальных слов, ID 0..999, 1000 эмодзи!") # 5. Классификатор-обогатитель (Families / Operator / Valence / Jurisdictions / Lookup) sys_path = os.path.join(ROOT, "oracle_enricher") import sys sys.path.insert(0, sys_path) from enricher.classify import classify_word families = {} for it in items: clf = classify_word(it["word"], it["category"], it["pos"]) clf["emoji"] = it["emoji"] clf["id"] = it["id"] clf["description"] = it["description"] families[it["word"]] = clf with open(FAMILIES_JSON_PATH, "w", encoding="utf-8") as f: json.dump(families, f, ensure_ascii=False, indent=2) print("Обновлен oracle_enricher/data/families.json (1000 обогащенных записей).") # 6. Обновление assets/data/oracle_kb.json и oracle_enricher/out/oracle_kb.json kb_data = {} for it in items: clf = families[it["word"]] str_id = str(it["id"]) kb_data[str_id] = { "id": it["id"], "word": it["word"], "emoji": it["emoji"], "pos": it["pos"], "category": it["category"], "description": it["description"], "canon_title": f"{it['emoji']} {it['word'].capitalize()} (#{it['id']:03d})", "family": clf.get("family", "archetype"), "operator": clf.get("operator", "substance"), "valence": clf.get("valence", "liminal"), "jurisdictions": clf.get("jurisdictions", ["I"]), "lookup": clf.get("lookup", "A"), "has_canon": True, "core": it["description"][:140] + "...", "oracle": it["description"] } with open(KB_ASSET_PATH, "w", encoding="utf-8") as f: json.dump(kb_data, f, ensure_ascii=False, indent=2) print("Обновлен assets/data/oracle_kb.json") if os.path.exists(os.path.dirname(KB_OUT_PATH)): with open(KB_OUT_PATH, "w", encoding="utf-8") as f: json.dump(kb_data, f, ensure_ascii=False, indent=2) print("Обновлен oracle_enricher/out/oracle_kb.json") # 7. Обновление oracle_enricher/data/lexicon.json lexicon_list = [] for it in items: lexicon_list.append({ "id": it["id"], "word": it["word"], "emoji": it["emoji"], "pos": it["pos"], "category": it["category"] }) with open(LEXICON_JSON_PATH, "w", encoding="utf-8") as f: json.dump(lexicon_list, f, ensure_ascii=False, indent=2) print("Обновлен oracle_enricher/data/lexicon.json") # 8. Обновление lib/data/words_data.dart header = """// AUTO-GENERATED: 1000 Oracle & Divination Russian Words Dataset (000 to 999) // Sacred Lexicon with Balanced Polarities, Archetypes, and Symbolic Interpretations // Strictly curated: 1000 unique words without mechanical numerals. import '../models/word_model.dart'; const List kRussianTop1000Words = [ """ body_parts = [] for it in items: desc_escaped = it["description"].replace("\\", "\\\\").replace('"', '\\"') part = f""" WordItem( id: {it['id']}, word: "{it['word']}", partOfSpeech: "{it['pos']}", frequency: {it['frequency']}, category: "{it['category']}", description: "{desc_escaped}", emoji: "{it['emoji']}", ),""" body_parts.append(part) footer = "\n];\n" with open(DART_PATH, "w", encoding="utf-8") as f: f.write(header + "\n".join(body_parts) + footer) print("Обновлен lib/data/words_data.dart") # 9. Сортировка и генерация words_alphabetical.txt и words_alphabetical.md try: locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8') import functools sorted_items = sorted(items, key=functools.cmp_to_key(lambda a, b: locale.strcoll(a["word"].lower(), b["word"].lower()))) except Exception: sorted_items = sorted(items, key=lambda x: x["word"].lower()) with open(TXT_PATH, "w", encoding="utf-8") as f: f.write("# Список 1000 слов оракула (по алфавиту А-Я)\n") f.write("# Всего слов: 1000 (каждое слово наделено эмодзи-символом)\n\n") f.write(f"{'№':<5} {'Иконка':<8} {'Слово':<24} {'ID':<8} {'Часть речи':<18} {'Категория'}\n") f.write("-" * 95 + "\n") for idx, it in enumerate(sorted_items, 1): w = it["word"] w_id = f"#{it['id']:03d}" f.write(f"{idx:<5} {it['emoji']:<8} {w:<24} {w_id:<8} {it['pos']:<18} {it['category']}\n") print("Обновлен words_alphabetical.txt") from collections import defaultdict by_letter = defaultdict(list) for it in sorted_items: first_char = it["word"][0].upper() by_letter[first_char].append(it) with open(MD_PATH, "w", encoding="utf-8") as f: f.write("# Каталог 1000 слов оракула (по алфавиту с эмодзи)\n\n") f.write("> Всего уникальных слов в базе: **1000** (номера ID от `#000` до `#999`). Каждое слово снабжено оракульной иконкой.\n\n") letters = sorted(by_letter.keys()) nav = " • ".join([f"[{l}](#буква-{l.lower()})" for l in letters]) f.write(f"**Навигация по буквам:**\n\n{nav}\n\n---\n\n") for l in letters: f.write(f"## Буква {l} ({len(by_letter[l])} слов)\n\n") for it in by_letter[l]: f.write(f"### {it['emoji']} {it['word']} `#{it['id']:03d}`\n") f.write(f"* **Часть речи:** {it['pos']} | **Категория:** {it['category']}\n") f.write(f"* **Толкование:** {it['description']}\n\n") print("Обновлен words_alphabetical.md") # 10. Обновление lexicon_viewer.html clean_html_items = [] for it in items: clean_html_items.append({ "id": it["id"], "word": it["word"], "emoji": it["emoji"], "pos": it["pos"], "category": it["category"], "description": it["description"] }) with open(HTML_PATH, "r", encoding="utf-8") as f: html = f.read() # Вставляем эмодзи в шаблон карточек в HTML, если его там нет if "${item.emoji}" not in html: html = html.replace( '
${wordHtml}
', '
${item.emoji} ${wordHtml}
' ) json_str = json.dumps(clean_html_items, ensure_ascii=False) html = re.sub( r'const WORDS_DATA = \[.*?\];', f'const WORDS_DATA = {json_str};', html, flags=re.DOTALL ) with open(HTML_PATH, "w", encoding="utf-8") as f: f.write(html) print("Обновлен lexicon_viewer.html с отображением эмодзи.") print("\n🎉 ВСЕ 1000 СЛОВ УСПЕШНО ОБОГАЩЕНЫ, СНАБЖЕНЫ ЭМОДЗИ И СИНХРОНИЗИРОВАНЫ!") if __name__ == "__main__": main()