feat: complete academic symbol lexicon heal, 2-column Cooper extraction, and updated assets
This commit is contained in:
Executable
+673
@@ -0,0 +1,673 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user