feat: complete academic symbol lexicon heal, 2-column Cooper extraction, and updated assets

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