Files
999/scripts/enrich_and_add_emojis.py
T

680 lines
50 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()