680 lines
50 KiB
Python
Executable File
680 lines
50 KiB
Python
Executable File
#!/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()
|