#!/usr/bin/env python3 """ Скрипт применения сакрального обновления лексикона Оракула 999: - Септенер планет (7) - Септенер металлов алхимии (6 новых + золото) - 14 цветов (7 спектральных + 7 погранично-сакральных) - 14 музыкальных знаков (7 ступеней + 7 принципов) - 7 вкусов - 7 запахов - 7 тактильных качеств (включая 'пушистый') - 7 телесных чувств (включая 'чутьё') - Замена 'зодиак' -> 'космос', расширение 'до' и 'соль' - Удаление 62 дублирующих слов - Синхронное обновление: words_data.dart, lexicon.json, oracle_kb.json, words_alphabetical.txt/md, lexicon_viewer.html """ import re import json import os import locale 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") 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") # Канонические описания для новых понятий и обновляемых слов NEW_DATA = { # 1. КОСМОС И ПЛАНЕТЫ "космос": { "pos": "существительное", "category": "Космический Знак", "desc": "Всеобъемлющий порядок и бездонная глубина, объемлющая все формы и законы. Космос — противоположность первозданному хаосу: в нём каждое движение взвешено и имеет траекторию. В раскладе знак требует оторваться от сиюминутной ряби и взглянуть на вопрос в масштабе вечности. Здесь нет места мелочной суете — действует закон высшей необходимости." }, "до": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Двуликий знак порога и зарождения звука. Как предлог — указывает край, предел и рубеж пути, до которого простирается воля. Как первоначальная нота — знаменует узел возвращения к корню, тонику, из которой разворачивается вся октава мира. Знак спрашивает: стоишь ли ты у своего предела, или готов стать чистым истоком для новой песни?" }, "соль": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Двуликий знак сохранения формы и музыкальной доминанты. Как минерал земли — предотвращает гниение, скрепляет завет и придает вкус любому опыту ценой разъедания раны. Как пятая ступень лада — несет предельное гармоническое напряжение, устремляющееся к разрешению в покое. Знак требует удержать суть и дать ситуации завершающий аккорд." }, "меркурий": { "pos": "существительное", "category": "Космический Знак", "desc": "Быстрокрылый вестник между мирами, дух языка, торговли и посредничества. Меркурий не знает застывших стен — он связывает несоединимое через мысль, весть и гибкий ум. В раскладе указывает на скорое известие, необходимость переговоров или смену угла зрения. Сила знака — в подвижности; ловушка — в пустом плутовстве и рассеянии внимания." }, "венера": { "pos": "существительное", "category": "Космический Знак", "desc": "Утренняя звезда притяжения, чувственной полноты и созидающей красоты. Венера соединяет разделенное через любовь, эстетическую меру и влечение сердец. Знак знаменует расцвет гармонии, обретение истинной ценности и плода. Предостерегает от самолюбования и праздной привязанности к преходящей форме." }, "марс": { "pos": "существительное", "category": "Космический Знак", "desc": "Огненный импульс первопроходца, обнажённый клинок воли и готовность к битве. Марс разрывает застой прямым напором и не терпит сомнений. В раскладе знаменует фазу активного преодоления, вызов или конфликт, требующий мужества. Цена знака — опасность слепого разрушения, если огонь гнева не обуздан внутренней дисциплиной." }, "юпитер": { "pos": "существительное", "category": "Космический Знак", "desc": "Великий благодетель, верховный закон, расширение горизонтов и щедрый жребий. Юпитер открывает двери возможностей, дарует покровительство старших сил и расширяет масштаб замысла. Знак указывает на справедливость, мудрость и авторитет. Требует делиться изобилием и не поддаваться гордыне величия." }, "сатурн": { "pos": "существительное", "category": "Космический Знак", "desc": "Владыка времени, коса созревшей жатвы, кристаллизация формы и страж границ. Сатурн отсекает всё лишнее, проверяя замысел на прочность через холод, задержку и дисциплину. В раскладе это знак терпения, испытания фундаментов и долгосрочного служения. То, что выстоит под его взглядом, обретет бессмертие." }, "уран": { "pos": "существительное", "category": "Космический Знак", "desc": "Небесная молния, внезапное озарение и сокрушительный слом привычных рамок. Уран врывается ветром революции, открывая доступ к высшему будущему через разрыв застывших шаблонов. В раскладе это неожиданный поворот судьбы, квантовый скачок и освобождение духа. Требует смелости шагнуть в неведомое." }, "нептун": { "pos": "существительное", "category": "Космический Знак", "desc": "Бездонный океан бессознательного, мистический транс, пророческий сон и растворение границ. Нептун смывает жесткие контуры эго, открывая тайные течения души и силу всепрощающего сострадания. Знак предупреждает о тонкой грани между духовным экстазом и самообманом, иллюзией или бегством от яви." }, # 2. МЕТАЛЛЫ АЛХИМИИ "золото": { "pos": "существительное", "category": "Священный Предмет", "desc": "Совершенный солнечный металл алхимии, нетленный свет, царский венец и мера высшей ценности. Золото не ржавеет в земле и не тускнеет от времени, знаменуя победу духа над распадом материи. В раскладе это знак высшего успеха, обретения нетленного сокровища мудрости и кристальной чистоты намерения." }, "серебро": { "pos": "существительное", "category": "Священный Предмет", "desc": "Чистый металл Луны, зеркало души и холодный проводник ночного света. Серебро отталкивает ложь, очищает темные воды и хранит память о первозданной чистоте. В раскладе говорит о главенстве интуиции, необходимости отразить реальность без искажений и довериться тонким предчувствиям." }, "ртуть": { "pos": "существительное", "category": "Священный Предмет", "desc": "Жидкий металл алхимиков, живое серебро, неуловимый дух связи и трансмутации. Ртуть не удерживается пальцами — она скользит между состояниями, связывая плотное и тонкое. Знак указывает на высокую адаптивность, необходимость быстрой реакции и способность переплавить тупик в новое качество." }, "медь": { "pos": "существительное", "category": "Священный Предмет", "desc": "Теплый металл Венеры, проводник сердечного огня, сплавов и созидательного ремесла. Медь придает устойчивость нежным формам, гармонизирует среду и резонирует с живой вибрацией. В раскладе знаменует союз, целебное тепло, раскрытие творческого дара и плодотворное сотрудничество." }, "железо": { "pos": "существительное", "category": "Священный Предмет", "desc": "Кровный металл Марса, основа плуга, меча и несокрушимой брони. Железо куется только в сильном жаре и закаляется в воде, воплощая несгибаемую стойкость и тяжелый труд. Знак требует твердости характера, практического упорства и готовности защищать рубежи своего мира." }, "олово": { "pos": "существительное", "category": "Священный Предмет", "desc": "Звонкий металл Юпитера, податливый для пайки, соединяющий разрозненные элементы в единое целое. Олово воплощает верность слову, мягкую силу благородства и способность соединить то, что казалось несовместимым. В раскладе указывает на примирение, надежный союз и доброе посредничество." }, "свинец": { "pos": "существительное", "category": "Священный Предмет", "desc": "Тяжелая первоматерия Сатурна, темная руда предела, экранирующая любые лучи. Свинец символизирует грубое бремя материи, непроницаемость и точку наибольшего сгущения духа. Знак указывает на тяжесть долга, кармический груз или замедление; именно в свинце сокрыто зерно будущего золота." }, # 3. ЦВЕТА "оранжевый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет утренней зари, творческого горения и витального жара плоти. Оранжевый объединяет ярость красного и ясность жёлтого, порождая чистую радость созидания и энтузиазм. Знак свидетельствует о приливе жизненных сил, рождении нового проекта и призыве к смелому самовыражению." }, "жёлтый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет полуденного солнца, золота интеллекта, проницательности и озарения. Жёлтый рассеивает туман неопределенности, высвечивая логику вещей и даруя ясность взгляда. В раскладе указывает на необходимость ясного понимания, ученичества, передачи знания и трезвого расчета." }, "голубой": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет чистого утреннего неба, горного истока, открытости и бесконечного доверия. Голубой не давит массой — он распахивает пространство для дыхания и честной речи. Знак призывает к прямоте, верности идеалам, прощению и поиску душевного мира." }, "синий": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет космической бездны, глубины океана, священного закона и созерцания. Синий погружает ум в покой, требуя преданности истине и верности внутреннему обету. В раскладе говорит о глубинных процессах, сокрытых от поверхностного взгляда, и незыблемости установленного порядка." }, "фиолетовый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет сумеречного моста, алхимической трансформации и высшего жреческого посвящения. Фиолетовый соединяет противоположности — страсть и покой, земное и небесное — на границе перехода. Знак указывает на глубокий духовный кризис, перерастающий в новое рождение." }, "серый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет пепла, туманной дымки, нейтралитета и тончайшего баланса теней. Серый не занимает сторону — он укрывает от ударов плащом незаметности и дает время для скрытого созревания замысла. В раскладе советует не высовываться, сохранять объективность и выждать свой час." }, "розовый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет нежного рассвета, уязвимости новорожденного чувства и трепетной ласки. Розовый растворяет броню отчуждения, напоминая о ценности сострадания и мягкости. Знак предостерегает от излишней наивности, но обещает исцеление зачерствевшего сердца через доброту." }, "прозрачный": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Качество чистого стекла, горного хрусталя и незамутненного родника. Прозрачный не имеет собственной окраски — он пропускает весь спектр мира без искажений и скрытых мотивов. Знак знаменует абсолютную честность, снятие масок, проницаемость и ясность намерений." }, "пурпурный": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет царственной мантии, высокого достоинства, власти духа и завершения великого делания. Пурпурный венчает путь победы, требуя соответствовать взятой ответственности и священному сану. Знак указывает на признание заслуг, суверенитет воли и способность повелевать собой." }, "коричневый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Цвет плодородной почвы, древесной коры, надежной глины и древних корней. Коричневый дает безусловную опору ногам, призывая к простоте, хозяйственности и уважению к законам земли. В раскладе знак напоминает: высокое дерево стоит крепко только благодаря глубоким корням." }, # 4. МУЗЫКАЛЬНЫЕ ЗНАКИ "ре": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Вторая ступень гармонии, поток движения от истока, дыхание ветра. Нота ре размыкает замкнутость одиночества и направляет силу вперед, к взаимодействию и поиску пары. Знак знаменует начало пути, движение навстречу другому и первый шаг за порог." }, "ми": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Третья ступень строя, свет озарения, внутренняя устойчивость треугольника. Нота ми приносит тепло, ясность и оптимизм, закрепляя гармонию в пространстве. В раскладе указывает на расцвет сил, устойчивое равновесие и радость осознания своего призвания." }, "фа": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Четвертая ступень лада, порог перехода, преодоление земного притяжения. Фа вносит в строй волнение поиска и тягу к высшим сферам, требуя готовности к жертве во имя идеала. Знак указывает на рубеж между малым уютом и великим призванием." }, "ля": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Шестая ступень октавы, эталонный камертон вселенского строя, чистота вибрации. Нота ля настраивает все струны в единый унисон, отсекая фальшь и сомнительные полутона. Знак призывает свериться с высшим эталоном и вычистить нестройные помыслы." }, "си": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Седьмая ступень, предельное тяготение к тонике, вершина перед разрешением. Си не может оставаться в подвешенном состоянии — её природа требует финального шага в полноту круга. Знак знаменует канун кульминации и неизбежность завершающего выбора." }, "диез": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Вектор устремления ввысь, полутоновое обострение, натяжение струны к следующему регистру. Диез обостряет ситуацию, требуя предельной концентрации, повышения темпа и планки мастерства. Знак предостерегает от излишней резкости, но требует подняться над средним уровнем." }, "бемоль": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Вектор мягкого спуска, гравитационное заземление, уход в бархатную глубину звука. Бемоль снимает напряжение конфликта, призывая к смирению, уступке и поиску глубинных интуитивных решений. Знак учит силе мягкости, способной обойти камень." }, "аккорд": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Одновременное звучание разных голосов, сплетающихся в единую гармоническую ткань. Аккорд показывает, что в одиночку полноту не взять: требуется согласие различных сил, союзников и противоположностей. Знак знаменует слаженность, поддержку и соборную силу." }, "лад": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Внутренний закон строения мира, матрица отношений между частями целого. Лад определяет, будет ли песня гимном радости или элегией скорби; он задает правила игры и климат пространства. В раскладе знак призывает восстановить мир, порядок и согласие в делах." }, "пауза": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Священная тишина между тактами, безмолвный вдох перед рождением новой мысли. Пауза — не пустота, а высшее напряжение ожидания, где звук растворяется в источнике. Знак велит замолчать, остановить суету действий и вслушаться в зов невидимого." }, "ритм": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Пульс вселенной, биение сердца, мерная поступь времени и приливов. Ритм упорядочивает хаос, превращая разрозненные удары в священный танец и плодотворный труд. Знак требует соблюдения меры, режима и последовательности: побеждает не рывок, а мерный шаг." }, "тон": { "pos": "существительное", "category": "Музыкальный Знак", "desc": "Первичная высота вибрации, качество звучания и базовое отношение к бытию. Тон задает атмосферу диалога задолго до того, как произнесены конкретные слова. Знак призывает обратить внимание на подлинную интонацию, душевный настрой и чистоту изначального посыла." }, # 5. ВКУСЫ "горький": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус полыни, отрезвляющего лекарства и суровой правды бытия. Горький разрушает приторный морок самообмана, открывая глаза на цену совершенных ошибок. В раскладе знак сулит жесткий, но спасительный урок, выжигающий иллюзии и дарующий непоколебимую зрелость." }, "сладкий": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус дикого меда, спелого плода, любовной неги и заслуженной награды. Сладкий утоляет усталость и исцеляет израненную душу теплом привязанности. Знак предостерегает от ловушки пресыщения и лени: постоянная сладость усыпляет бдительность воина." }, "кислый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус брожения, реакции отторжения, уксуса и острого пробуждения рецепторов. Кислый заставляет сморщиться и немедленно проснуться; он разрушает застой и активизирует внутренние соки. Знак указывает на ферментацию процессов и необходимость быстрого очищения среды." }, "солёный": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус человеческих слёз, трудового пота и жертвенной крови завета. Солёный вкус напоминает о цене человеческого опыта и невозможности избежать страданий на пути становления. Знак говорит о прочности заключенного союза и глубокой памяти сердца." }, "терпкий": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус выдержанного вина, дубовой коры и неспелой терновой ягоды. Терпкий оставляет вяжущее сухое послевкусие, собирая воедино распыленную силу и требуя терпения. В раскладе это знак благородной выдержки, концентрации ресурсов и внутреннего достоинства." }, "пресный": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Вкус чистейшей дождевой воды, пресного хлеба путника и нейтрального покоя. Пресный не навязывает себя вкусовым рецепторам — он служит надежной основой без приправ и страстей. Знак знаменует нейтралитет, период затишья и возвращение к простым истинам." }, # 6. ЗАПАХИ "аромат": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Тончайшее благоухание раскрытого цветка, ладана небес и витальной силы расцвета. Аромат привлекает пчел и сердца без принуждения, действуя тайным очарованием духа. В раскладе знаменует фазу благословения, притягательности замысла и незримого присутствия высших сил." }, "свежесть": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Запах озона после грозы, чистого первого снега и утреннего дыхания гор. Свежесть сдувает паутину вчерашней усталости, наполняя легкие восторгом нового начала. Знак возвещает очищение ситуации, приход свежих людей и обновление взгляда на жизнь." }, "пряность": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Запах восточных пряностей, жарких трав, корицы и священного шафрана. Пряность будит огонь аппетита, зовет к приключениям и добавляет остроты пресному бытию. Знак сулит интересное приключение, разжигание страсти и насыщенность событийного ряда." }, "гарь": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Запах пепелища, остывших углей, сгоревшего моста и неотвратимой катастрофы. Гарь свидетельствует о том, что пожар уже случился и прежнего дома больше нет. Знак велит не рыдать над золой, а искать зерно жизни среди пепла и начинать возрождение с нуля." }, "смрад": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Запах распада, гниения плоти, стоячей тухлой воды и порчи формы. Смрад предупреждает о глубокой заразе в отношениях или делах, которую больше невозможно замалчивать. Знак требует немедленно вскрыть нарыв, провести хирургическое очищение и вынести сор вон." }, "сырость": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Запах темного погреба, болотного мха, подземелья и прелых листьев. Сырость указывает на отсутствие согревающего солнечного луча, застой и опасность медленного угасания духа. Знак советует проветрить мысли, впустить свет и осушить застойные трясины сомнений." }, "дурман": { "pos": "существительное", "category": "Образ / Архетип", "desc": "Пьянящий, тяжелый запах белены, ночных цветов и колдовского зелья. Дурман усыпляет рассудок сладкими видениями, лишая воли к сопротивлению и подменяя цель миражом. Знак предостерегает от токсичных связей, лести и сладких обещаний с двойным дном." }, # 7. ТАКТИЛЬНЫЕ КАЧЕСТВА МАТЕРИИ "твёрдый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Качество кремня, алмаза, гранитной скалы и несгибаемого хребта. Твёрдый держит удар любой силы, не прогибаясь под изменчивый мир и защищая слабых. В раскладе знак требует проявить принципиальность, опереться на твердую почву и не уступать давлению." }, "мягкий": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Свойство теплой глины, пуховой подушки, весеннего мха и материнских объятий. Мягкий гасит удар уступкой, огибает острые углы и сохраняет форму через гибкость. Знак советует проявить такт, не идти на лобовой таран и смягчить резкость приговора." }, "гладкий": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Свойство речной гальки, полированного мрамора и зеркального льда. Гладкий не дает зацепки трению, позволяя скользить вперед без сопротивления и ссадин. Знак предвещает благополучное и легкое течение дел, предупреждая, однако, об опасности поскользнуться." }, "шершавый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Качество коры векового дуба, наждачного камня и ладони труженика. Шершавый обеспечивает надежное сцепление с реальностью ценой трения и шероховатостей. В раскладе знак обещает прочную опору для подъема, требуя быть готовым к мелким царапинам." }, "пушистый": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Качество нежного подшерстка зверя, одуванчика, кошачьей поступи и уютного тепла. Пушистый рассеивает агрессию мягким объемом, убаюкивает страхи и создает ощущение безопасности. Знак говорит об искреннем тепле и заботе, либо предостерегает от усыпления бдительности кошачьей лаской." }, "сухой": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Свойство прокаленной солнцем степи, аскетичного свитка и чистого хвороста. Сухой не знает гнили и размягчения — он хранит контуры неповрежденными, но готов вспыхнуть от одной искры. Знак призывает к ясности формулировок, аскезе и бдительности вблизи огня." }, "влажный": { "pos": "прилагательное", "category": "Свойство / Качество", "desc": "Качество утренней росы, пропитанной соками почвы и живительного семени. Влажный размягчает очерствевшее, растворяет границы и питает всходы грядущей жатвы. В раскладе знаменует плодовитость, восприимчивость и готовность принять чужую мысль." }, # 8. ВНУТРЕННИЕ ЧУВСТВА И СОСТОЯНИЯ ТЕЛА "боль": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Священный сторож предела, сигнал нарушения границ и мгновенное пробуждение к реальности. Боль не враг — она учитель, указывающий точное место повреждения формы и требующий немедленного внимания. В раскладе знак знаменует неизбежный рубеж роста: где болит, там и лежит путь исцеления." }, "трепет": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Священный ужас и благоговейный озноб плоти при встрече с непостижимым величием тайны. Трепет выбивает из рук оружие гордыни, склоняя человека перед истинным масштабом мироздания. Знак призывает к глубочайшему почтению перед ходом судьбы и смирению ума." }, "слепота": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Выключенное зрение, добровольное или наведенное нежелание видеть очевидное положение дел. Слепота заставляет спотыкаться о ровные ступени, блуждая в лабиринте проекций. Знак предостерегает от слепого упрямства, либо советует закрыть внешние глаза, чтобы увидеть внутреннюю правду." }, "глухота": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Закрытые уши, неспособность и отказ внимать предостережениям, советам и знакам оракула. Глухота изолирует человека в эхокамере собственных страхов и догм. Знак предупреждает: если ты не услышишь шепот судьбы сейчас, вскоре она заговорит с тобой ударом грома." }, "трезвость": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Холодная, кристальная ясность незамутненного взгляда, освобожденного от хмеля надежд и страхов. Трезвость видит вещи такими, каковы они есть, не преувеличивая опасность и не теша себя иллюзиями. В раскладе это знак высшей зрелости, точного расчета и непоколебимости." }, "опьянение": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Сладкий дурман, потеря ориентации и ложное ощущение полета на краю обрыва. Опьянение успехом, вином или страстью усыпляет инстинкт самосохранения, толкая на безумные траты. Знак предостерегает от необдуманных шагов под влиянием эйфории: похмелье реальности будет тяжелым." }, "чутьё": { "pos": "существительное", "category": "Мера / Состояние", "desc": "Звериный локатор, древний инстинкт предчувствия опасности и верного следа в темноте. Чутьё работает быстрее логических цепочек, улавливая дуновение грядущих событий кожей и нутром. Знак советует отбросить чужие доводы и безоговорочно довериться своей первобытной интуиции." } } # Карта замен: какое удаляемое слово заменяется каким новым REPLACEMENT_MAP = { # 1-to-1 замена "зодиак": "космос", # 1. Планеты (7) "бывать": "меркурий", "брать": "венера", "говорить": "марс", "увидеть": "юпитер", "подумать": "сатурн", "сделать": "уран", "понять": "нептун", # 2. Металлы алхимии (7) "глядеть": "золото", "ладан": "серебро", "мирра": "ртуть", "старик": "медь", "парень": "железо", "девочка": "олово", "дома": "свинец", # 3. Цвета (10) "золотой": "оранжевый", "маленький": "жёлтый", "красивый": "голубой", "огромный": "синий", "высший": "фиолетовый", "лучший": "серый", "скорый": "розовый", "опять": "прозрачный", "вновь": "пурпурный", "тут": "коричневый", # 4. Музыка (12) "постоянно": "ре", "чуть": "ми", "наверное": "фа", "что-нибудь": "ля", "какой-нибудь": "си", "тоже": "диез", "разве": "бемоль", "зачем": "аккорд", "просто": "лад", "многое": "пауза", "оставаться": "ритм", "становиться": "тон", # 5. Вкусы (6) "начинать": "горький", "приходить": "сладкий", "выходить": "кислый", "проходить": "солёный", "узнать": "терпкий", "отвечать": "пресный", # 6. Запахи (7) "называть": "аромат", "написать": "свежесть", "услышать": "пряность", "помогать": "гарь", "рассказывать": "смрад", "показывать": "сырость", "возвращаться": "дурман", # 7. Тактильность (7) "возникать": "твёрдый", "вспоминать": "мягкий", "входить": "гладкий", "вызывать": "шершавый", "давать": "пушистый", "пойти": "сухой", "поехать": "влажный", # 8. Внутренние чувства тела (7) "посмотреть": "боль", "спрашивать": "трепет", "уходить": "слепота", "почувствовать": "глухота", "поставить": "трезвость", "показаться": "опьянение", "прийтись": "чутьё" } def load_dart(): with open(DART_PATH, "r", encoding="utf-8") as f: 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(content) 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() }) return items def update_items(items): updated = [] replaced_count = 0 words_map = {it["word"]: it for it in items} for it in items: w = it["word"] if w in REPLACEMENT_MAP: new_w = REPLACEMENT_MAP[w] meta = NEW_DATA[new_w] it["word"] = new_w it["pos"] = meta["pos"] it["category"] = meta["category"] it["description"] = meta["desc"] replaced_count += 1 elif w in NEW_DATA: # Обновление до и соль meta = NEW_DATA[w] it["pos"] = meta["pos"] it["category"] = meta["category"] it["description"] = meta["desc"] updated.append(it) print(f"Replaced {replaced_count} words successfully.") return updated def validate(items): assert len(items) == 1000, f"Expected 1000 items, got {len(items)}" words = [it["word"] for it in items] unique_words = set(words) assert len(unique_words) == 1000, f"Expected 1000 unique words, got {len(unique_words)} (diff: {len(words) - len(unique_words)})" ids = [it["id"] for it in items] assert set(ids) == set(range(1000)), "IDs are not exactly 0 to 999" print("ALL VALIDATION CHECKS PASSED: Exactly 1000 unique words with IDs 0..999!") def write_dart(items): 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: # escape double quotes and backslashes in description 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}", ),""" body_parts.append(part) footer = "\n];\n" full_content = header + "\n".join(body_parts) + footer with open(DART_PATH, "w", encoding="utf-8") as f: f.write(full_content) print("Updated lib/data/words_data.dart") def write_lexicon_json(items): lexicon_list = [] for it in items: lexicon_list.append({ "id": it["id"], "word": it["word"], "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("Updated oracle_enricher/data/lexicon.json") def write_oracle_kb_json(items): kb = {} # Read existing if available to preserve extra fields, else build existing_kb = {} if os.path.exists(KB_ASSET_PATH): try: with open(KB_ASSET_PATH, "r", encoding="utf-8") as f: existing_kb = json.load(f) except Exception: pass for it in items: str_id = str(it["id"]) record = existing_kb.get(str_id, {}) record["id"] = it["id"] record["word"] = it["word"] record["pos"] = it["pos"] record["category"] = it["category"] record["description"] = it["description"] record["canon_title"] = f"{it['word'].capitalize()} (#{it['id']:03d})" kb[str_id] = record with open(KB_ASSET_PATH, "w", encoding="utf-8") as f: json.dump(kb, f, ensure_ascii=False, indent=2) print("Updated 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, f, ensure_ascii=False, indent=2) print("Updated oracle_enricher/out/oracle_kb.json") def write_alphabetical(items): 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()) # 1. TXT with open(TXT_PATH, "w", encoding="utf-8") as f: f.write("# Список 1000 слов оракула (по алфавиту А-Я)\n") f.write("# Всего слов: 1000\n\n") f.write(f"{'№':<5} {'Слово':<24} {'ID':<8} {'Часть речи':<18} {'Категория'}\n") f.write("-" * 85 + "\n") for idx, it in enumerate(sorted_items, 1): w = it["word"] w_id = f"#{it['id']:03d}" f.write(f"{idx:<5} {w:<24} {w_id:<8} {it['pos']:<18} {it['category']}\n") print("Updated words_alphabetical.txt") # 2. MD 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(f"> Всего уникальных слов в базе: **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['word']} `#{it['id']:03d}`\n") f.write(f"* **Часть речи:** {it['pos']} | **Категория:** {it['category']}\n") f.write(f"* **Толкование:** {it['description']}\n\n") print("Updated words_alphabetical.md") def update_html(items): clean_items = [] for it in items: clean_items.append({ "id": it["id"], "word": it["word"], "pos": it["pos"], "category": it["category"], "description": it["description"] }) with open(HTML_PATH, "r", encoding="utf-8") as f: html = f.read() json_str = json.dumps(clean_items, ensure_ascii=False) new_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(new_html) print("Updated lexicon_viewer.html") def main(): print("Starting lexicon update...") items = load_dart() print(f"Loaded {len(items)} items from Dart source.") updated_items = update_items(items) validate(updated_items) write_dart(updated_items) write_lexicon_json(updated_items) write_oracle_kb_json(updated_items) write_alphabetical(updated_items) update_html(updated_items) print("\n🎉 ВСЕ ФАЙЛЫ БАЗЫ ДАННЫХ И ИНТЕРФЕЙСА УСПЕШНО ОБНОВЛЕНЫ!") if __name__ == "__main__": main()