Files
999/scripts/apply_lexicon_update.py

674 lines
54 KiB
Python
Executable File

#!/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<WordItem> 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()