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
+973
View File
@@ -0,0 +1,973 @@
import json
import re
LEXICON_JSON = 'oracle_enricher/data/lexicon.json'
FAMILIES_JSON = 'oracle_enricher/data/families.json'
KB_ASSET_JSON = 'assets/data/oracle_kb.json'
KB_OUT_JSON = 'oracle_enricher/out/oracle_kb.json'
WORDS_DATA_DART = 'lib/data/words_data.dart'
WORDS_TXT = 'words_alphabetical.txt'
WORDS_MD = 'words_alphabetical.md'
VIEWER_HTML = 'lexicon_viewer.html'
EXPLICIT_EMOJIS = {
# 1. 12 Zodiac signs & Constellations
'овен': '♈ 🐏',
'телец': '♉ 🐂',
'близнецы': '♊ 👥',
'рак': '♋ 🦀',
'лев': '♌ 🦁',
'дева': '♍ 🌾',
'весы': '♎ ⚖️',
'скорпион': '♏ 🦂',
'стрелец': '♐ 🏹',
'козерог': '♑ 🐐',
'водолей': '♒ 🏺',
'рыбы': '♓ 🐟',
# 2. 7 Planets & Cosmos
'солнце': '☀️ 👑',
'луна': '🌙 🌊',
'меркурий': '☿️ 📜',
'венера': '♀️ 🌹',
'марс': '♂️ ⚔️',
'юпитер': '♃ ⚡',
'сатурн': '♄ ⏳',
'космос': '🌌 🪐',
# 3. 7 Alchemical Metals
'золото': '🪙 ☀️',
'серебро': '🥈 🌙',
'медь': '🥉 ♀️',
'железо': '⚙️ ⚔️',
'олово': '🪞 ⚡',
'свинец': '🧱 ⏳',
'ртуть': '💧 ⚗️',
# 4. 7 Virtues
'мудрость': '🦉 📜',
'мужество': '🦁 🛡️',
'умеренность': '⚖️ 🌿',
'справедливость': '⚔️ ⚖️',
'вера': '🕯️ ✝️',
'надежда': '🕊️ ⚓',
'любовь': '❤️ 🕊️',
# 5. 7 Deadly Sins
'гордыня': '👑 🪞',
'зависть': '🐍 👁️',
'гнев': '🔥 ⚡',
'уныние': '🌧️ 🥀',
'алчность': '💰 🪙',
'чревоугодие': '🍞 🍷',
'похоть': '💋 🔥',
# 6. 14 Musical Terms & Acoustics
'до': '🎵 🔔',
'ре': '🎶 🌊',
'ми': '🎼 🌿',
'фа': '🎺 ☀️',
'соль': '🧂 ☀️',
'ля': '🎻 🕊️',
'си': '🪕 ✨',
'диез': '♯ 🔺',
'бемоль': '♭ 🔻',
'звук': '🔊 🌊',
'тишина': '🤫 🌌',
'эхо': '📢 🏔️',
'ритм': '🥁 💓',
'мелодия': '🎼 🎶',
# 7. 14 Colors
'красный': '🔴 🔥',
'оранжевый': '🟠 🌅',
'жёлтый': '🟡 ☀️',
'зелёный': '🟢 🌿',
'зеленый': '🟢 🌿',
'голубой': '💠 🩵',
'синий': '🔵 🌊',
'фиолетовый': '🟣 🔮',
'белый': '⚪ 🕊️',
'чёрный': '⚫ 🌑',
'черный': '⚫ 🌑',
'серый': '🔘 🌫️',
'розовый': '🌸 💖',
'пурпурный': '👑 🪻',
'коричневый': '🟤 🪵',
'прозрачный': '💎 🪟',
# 8. 14 Senses, Tastes & Smells
'сладкий': '🍯 🍓',
'горький': '☕ 🌿',
'кислый': '🍋 ⚡',
'солёный': '🧂 🌊',
'острый': '🌶️ 🗡️',
'вяжущий': '🍂 🪵',
'пресный': '💧 ⚪',
'аромат': '🌸 🪔',
'вонь': '🦨 ☣️',
'свежесть': '🍃 ❄️',
'пряный': '🌿 🌰',
'терпкий': '🍇 🍷',
'гниль': '🍄 🍂',
'гарь': '🌋 💨',
# 9. 14 Bodily Senses & Tactility
'зрение': '👁️ 🌅',
'слух': '👂 🔔',
'осязание': '✋ 🪶',
'вкус': '👅 🍯',
'обоняние': '👃 🌸',
'равновесие': '⚖️ 🧘',
'чутьё': '🐺 🧭',
'мягкий': '🪶 ☁️',
'твёрдый': '🪨 💎',
'пушистый': '🐱 ☁️',
'гладкий': '🧊 🪞',
'шершавый': '🪵 🧗',
'горячий': '♨️ 🔥',
'холодный': '❄️ 🧊',
# 10. Daily Cycle
'полночь': '🕛 🌑',
'заря': '🌄 ✨',
'рассвет': '🌅 ☀️',
'утро': '☕ 🌅',
'день': '☀️ 🏙️',
'полдень': '🕛 ☀️',
'вечер': '🌇 🍷',
'закат': '🌆 🌅',
'сумерки': '🌃 🌫️',
'ночь': '🌙 🌌',
# 11. Fundamental Elements
'огонь': '🔥 ⚡',
'вода': '💧 🌊',
'воздух': '💨 🍃',
'земля': '🌍 ⛰️',
'свет': '✨ ☀️',
'тьма': '🌑 🖤',
'лёд': '❄️ 🧊',
'пламя': '🔥 🕯️',
'искра': '⚡ ✨',
'пепел': '🌫️ ⚱️',
'дым': '💨 🌫️',
'пар': '♨️ 🌫️',
'тень': '👤 🌑',
'луч': '☀️ ⚡',
'сияние': '✨ 🌟',
'мрак': '🌑 🖤',
'зима': '❄️ 🌨️',
'весна': '🌱 🌸',
'осень': '🍂 🍁',
'лето': '☀️ 🌻',
'молния': '⚡ 🌩️',
'гром': '🌩️ 🔊',
'дождь': '🌧️ 💧',
'туман': '🌫️ 🌁',
'роса': '💧 🍃',
'иней': '❄️ 🌾',
'буря': '🌪️ ⚡',
'ветер': '💨 🍃',
'волна': '🌊 🌊',
'прилив': '🌊 🌕',
'отлив': '🌊 🌑',
'лава': '🌋 🔥',
'радуга': '🌈 ✨',
'снег': '❄️ 🌨️',
'жар': '🔥 🌡️',
'холод': '❄️ 🧊',
'небо': '🌌 ☁️',
'бездна': '🕳️ 🌌',
'верх': '⬆️ 🏔️',
'низ': '⬇️ 🕳️',
'высота': '🏔️ 🦅',
'глубина': '🌊 ⚓',
'север': '❄️ 🧭',
'юг': '☀️ 🧭',
'восток': '🌅 🧭',
'запад': '🌇 🧭',
# 12. Actions / Verbs (all 109 verbs)
'бежать': '🏃 💨',
'бояться': '😨 🌑',
'бросить': '🤾 💨',
'быть': '🕯️ 👁️',
'верить': '🕯️ ✝️',
'вернуться': '🔄 🏠',
'вести': '🧭 🚶',
'взять': '🤲 ✊',
'видеть': '👁️ ✨',
'возникнуть': '✨ 🌱',
'войти': '🚪 ➡️',
'вспомнить': '🧠 💡',
'встать': '🧍 ⬆️',
'выглядеть': '🪞 👁️',
'вызвать': '📯 ⚡',
'выйти': '🚪 🌅',
'дать': '🤲 🎁',
'действовать': '⚡ 🔨',
'делать': '🛠️ 🧱',
'держать': '✊ 🔒',
'думать': '🧠 💭',
'ехать': '🏇 🛤️',
'ждать': '⏳ 👁️',
'желать': '🌟 💫',
'жить': '🌿 💓',
'забыть': '🌫️ 🍂',
'заметить': '👁️ ⚡',
'звать': '📢 📯',
'знать': '📜 💡',
'значить': '🗝️ 📖',
'играть': '🎭 🎲',
'идти': '🚶 🛤️',
'иметь': '💼 🔑',
'искать': '🧭 🔍',
'казаться': '🌫️ 🪞',
'касаться': '✋ ✨',
'кричать': '📢 ⚡',
'лежать': '🛏️ 🧘',
'любить': '❤️ 🕊️',
'молчать': '🤫 🤐',
'мочь': '⚡ ✊',
'надеяться': '🕊️ ⚓',
'назвать': '🗣️ 🏷️',
'найти': '🗝️ 💎',
'находиться': '📍 🧭',
'начать': '🏁 🌱',
'нести': '🎒 🚶',
'нравиться': '✨ 💖',
'обнаружить': '🔍 💡',
'объяснить': '📜 🗣️',
'оставить': '🥀 🚪',
'остаться': '⚓ 🏛️',
'ответить': '🗣️ ✉️',
'открыть': '🔓 🚪',
'передать': '🤝 📜',
'петь': '🎤 🎶',
'писать': '✍️ 📜',
'пить': '🍷 💧',
'поднять': '⬆️ 🤲',
'позволить': '🕊️ 🔓',
'показать': '👆 👁️',
'получить': '🎁 🤲',
'помнить': '🧠 🏛️',
'помочь': '🤝 🛡️',
'понимать': '💡 🧠',
'попасть': '🎯 🏹',
'потерять': '🍂 🕳️',
'появиться': '✨ 🌅',
'предложить': '🤲 📜',
'прийти': '🚪 🚶',
'принести': '🎁 🚶',
'принять': '🤲 🤍',
'продолжать': '⏳ ➡️',
'просить': '🙏 🕯️',
'пытаться': '🧗 ⚡',
'рассказать': '🗣️ 📜',
'расти': '🌱 🌳',
'решить': '⚖️ 🗡️',
'связать': '🪢 🔗',
'сидеть': '🪑 🧘',
'сказать': '🗣️ 💬',
'служить': '🛡️ 🕯️',
'случиться': '⚡ 🎲',
'слушать': '👂 🔔',
'слышать': '👂 🌊',
'смотреть': '👁️ 🔭',
'снять': '🎭 ⬇️',
'собираться': '🎒 🧭',
'согласиться': '🤝 🕊️',
'создать': '🏛️ ✨',
'спать': '💤 🌙',
'спросить': '❓ 🗣️',
'ставить': '🧱 📍',
'стараться': '🧗 🔨',
'стать': '⚡ 👑',
'стоить': '🪙 ⚖️',
'стоять': '🧍 ⚓',
'существовать': '🌌 🕯️',
'убить': '⚔️ 💀',
'уйти': '🚪 🚶',
'умереть': '💀 ⏳',
'уметь': '🛠️ 💡',
'успеть': '⏳ ⚡',
'учиться': '📖 🧙',
'хватать': '✊ 🦅',
'ходить': '🚶 🐾',
'хотеть': '🔥 💭',
'читать': '📖 👓',
'чувствовать': '💓 🌊',
# 13. Adjectives (all remaining)
'близкий': '🫂 📍',
'большой': '🐘 🏔️',
'великий': '👑 🏛️',
'влажный': '💧 🌿',
'внешний': '🌐 🪟',
'внутренний': '🧘 🗝️',
'высокий': '🏔️ 🦅',
'глубокий': '🌊 ⚓',
'готовый': '🏁 ⚡',
'далекий': '🔭 🌌',
'длинный': '📏 🛤️',
'добрый': '☀️ 🤍',
'долгий': '⏳ 📜',
'дорогой': '💎 🪙',
'единый': '⭕ 🔗',
'живой': '🌱 💓',
'знакомый': '🤝 💡',
'знаменитый': '🌟 👑',
'интересный': '🔍 ✨',
'короткий': '✂️ ⏱️',
'легкий': '🪶 💨',
'личный': '🗝️ 👤',
'любимый': '💖 🌹',
'малый': '🔬 🔹',
'молодой': '🌱 👶',
'настоящий': '💎 ⚖️',
'низкий': '⬇️ 🕳️',
'новый': '✨ 🌅',
'открытый': '🔓 🚪',
'плохой': '🥀 🌑',
'поздний': '🦉 🌙',
'полный': '🌕 🏺',
'последний': '🔚 ⏳',
'похожий': '🪞 👥',
'правый': '⚖️ ➡️',
'прекрасный': '🌺 ✨',
'простой': '🪵 ⚪',
'прошлый': '🏛️ 📜',
'прямой': '📏 🏹',
'пустой': '🫙 💨',
'равный': '⚖️ 🟰',
'разный': '🔀 🎭',
'ранний': '🌅 🐓',
'свободный': '🦅 🕊️',
'серьезный': '🗿 ⚖️',
'сильный': '🦁 💪',
'сложный': '🧩 🌀',
'старый': '👴 ⏳',
'странный': '🌀 👁️',
'страшный': '👹 ⚡',
'сухой': '🏜️ 🍂',
'темный': '🌑 🖤',
'тяжелый': '🪨 ⚖️',
'хороший': '🌟 👍',
'целый': '🌕 🛡️',
'чистый': '💧 🕊️',
'чужой': '👤 🚪',
'широкий': '🌊 ↔️',
# 14. Grammar Particles, Pronouns, Numerals
'а': '⚖️ ⚡',
'без': '🚫 🫙',
'более': '📈 ➕',
'больше': '📈 ➕',
'будто': '🪞 ✨',
'бы': '💭 🔮',
'быстро': '⚡ 💨',
'в': '📥 📍',
'ваш': '🛡️ 👥',
'вдруг': '⚡ 💥',
'ведь': '💡 🗣️',
'весь': '🌐 ⭕',
'вместе': '🤝 👥',
'вместо': '🔀 🪑',
'во': '📥 📍',
'возможно': '🎲 ✨',
'вокруг': '🔄 🌐',
'вообще': '🌐 🌊',
'вот': '👉 ⚡',
'впервые': '🌱 1️⃣',
'вперед': '➡️ 🏹',
'все': '🌐 👥',
'все-таки': '⚖️ ⚡',
'всегда': '♾️ ⏳',
'всего': '🌐 ▫️',
'вчера': '🏛️ 📜',
'вы': '👥 👑',
'где': '📍 ❓',
'где-то': '📍 🌫️',
'да': '🟢 ✔️',
'давно': '⏳ 🏛️',
'даже': '⚡ ❗',
'далеко': '🔭 🌌',
'два': '2️⃣ 👥',
'двадцать': '2️⃣0️⃣ ⏳',
'десять': '🔟 🏛️',
'для': '🎯 🎁',
'долго': '⏳ 📜',
'домой': '🏠 🚶',
'другой': '🔀 🎭',
'его': '👤 🗝️',
'едва': '🤏 ⏱️',
'ее': '👩 🗝️',
'если': '🔀 ❓',
'еще': '⏳ ➕',
'ж': '⚡ 💥',
'же': '⚡ 💥',
'за': '🚪 🛡️',
'завтра': '🌅 🔮',
'затем': '➡️ ⏳',
'зато': '⚖️ 🌿',
'здесь': '📍 ⚓',
'и': '➕ 🔗',
'ибо': '📜 💡',
'из': '📤 🏞️',
'из-за': '⛈️ ⚡',
'или': '⚖️ 🔀',
'именно': '🎯 📍',
'иначе': '🔀 ⚡',
'иногда': '🎲 ⏳',
'иной': '🔀 🎭',
'их': '👥 🗝️',
'к': '➡️ 📍',
'как': '🪞 ❓',
'как-то': '🌫️ ❓',
'какой': '❓ 🔍',
'какой-то': '🌫️ ❓',
'ко': '➡️ 📍',
'когда': '⏳ ❓',
'который': '👉 🗝️',
'кроме': '🚫 ✂️',
'кто': '❓ 👤',
'кто-то': '👤 🌫️',
'куда': '🧭 ❓',
'легко': '🪶 💨',
'ли': '❓ ⚖️',
'либо': '🔀 🎲',
'лишь': '🎯 ▫️',
'мало': '💧 ▫️',
'между': '↔️ ⚖️',
'многий': '🌊 👥',
'много': '🌊 ➕',
'можно': '🟢 🕊️',
'мой': '🗝️ 👤',
'мы': '👥 🤝',
'на': '🔝 📍',
'над': '☁️ ⬆️',
'надо': '⚠️ 🔨',
'назад': '⬅️ ⏳',
'наконец': '🏁 ⏳',
'наш': '🛡️ 👥',
'не': '🚫 🛡️',
'недавно': '⏱️ 🌿',
'некий': '🌫️ ✨',
'нельзя': '🔴 🚫',
'немного': '🤏 💧',
'нет': '🔴 ✖️',
'ни': '🚫 ⚪',
'никак': '🚫 ⚡',
'никогда': '🚫 ⏳',
'никто': '🚫 👤',
'ничто': '🚫 🕳️',
'но': '🛡️ ⚡',
'ну': '🗣️ ⚡',
'нужно': '⚠️ 🔨',
'о': '💭 🗣️',
'об': '💭 🗣️',
'оба': '👥 🟰',
'один': '1️⃣ ☝️',
'однажды': '🌟 📖',
'однако': '🛡️ ⚡',
'около': '🔄 📍',
'он': '👨 👤',
'она': '👩 👤',
'они': '👥 🌐',
'оно': '⚪ 🔮',
'от': '⬅️ 📍',
'откуда': '🏛️ ❓',
'очень': '🔥 ❗',
'перед': '🚪 👁️',
'плохо': '👎 🥀',
'по': '🛤️ ➡️',
'под': '⬇️ 🛡️',
'пока': '⏳ ⏳',
'поскольку': '📜 💡',
'после': '🔚 ➡️',
'потом': '➡️ ⏳',
'потому': '💡 🗝️',
'почему': '❓ 💡',
'почему-то': '❓ 🌫️',
'почти': '🤏 🎯',
'поэтому': '➡️ 💡',
'правда': '💎 ⚖️',
'прежде': '⬅️ 📜',
'при': '🤝 📍',
'причем': '➕ 📜',
'про': '📖 💭',
'против': '⚔️ 🛡️',
'прямо': '📏 ➡️',
'пусть': '🕊️ ✨',
'пять': '5️⃣ ⭐',
'рано': '🌅 🐓',
'рядом': '🫂 📍',
'с': '🤝 📍',
'сам': '👤 ⚡',
'самый': '🔝 ⭐',
'свой': '🗝️ 🤍',
'себя': '🪞 👤',
'сегодня': '☀️ 📅',
'сей': '👉 📍',
'сейчас': '⏱️ ⚡',
'сильно': '💪 ⚡',
'сколько': '❓ 🔢',
'скоро': '⚡ ⏳',
'слишком': '🌊 ⚠️',
'словно': '🪞 ✨',
'сначала': '🏁 1️⃣',
'снова': '🔄 🔁',
'со': '🤝 📍',
'совсем': '💯 ⭕',
'сразу': '⚡ ⏱️',
'среди': '👥 🌾',
'сто': '💯 🏛️',
'столь': '📈 ⚡',
'сюда': '↙️ 📍',
'так': '👉 ✔️',
'такой': '🪞 ▫️',
'там': '📍 🔭',
'твой': '🗝️ 🫵',
'теперь': '⏳ 📍',
'тихо': '🤫 🍃',
'то': '👉 📍',
'тогда': '⏳ ⚡',
'только': '🎯 ▫️',
'тот': '👈 🔭',
'точно': '🎯 📐',
'три': '3️⃣ 🔺',
'трудно': '🪨 🧗',
'туда': '↗️ 🧭',
'ты': '🫵 👤',
'у': '📍 🏡',
'уж': '⏳ ⚡',
'уже': '⌛ ⚡',
'хорошо': '👍 ✨',
'хоть': '🌧️ ☀️',
'хотя': '🌧️ ☀️',
'часто': '🌊 🌊',
'чем': '⚖️ ❓',
'через': '🌉 ➡️',
'четыре': '4️⃣ 🟩',
'что': '❓ 🔮',
'что-то': '🔮 🌫️',
'чтоб': '🎯 🏹',
'чтобы': '🎯 🏹',
'шесть': '6️⃣ 🔯',
'это': '👆 📍',
'этот': '👉 📍',
'я': '👁️ 👤',
'ясно': '☀️ 💡',
# 15. Nouns (specific archetypal pairs)
'бдение': '🕯️ 👁️',
'благодать': '✨ 🕊️',
'благословение': '🤲 ✨',
'болезнь': '🥀 🩹',
'борьба': '🤼 ⚔️',
'брат': '👦 🤝',
'будущее': '🌅 🔮',
'буря': '🌪️ ⚡',
'вдова': '🖤 🥀',
'ведьма': '🧙‍♀️ 🌙',
'век': '🏛️ ⏳',
'верёвка': '🪢 🧵',
'вестник': '📯 🕊️',
'вещь': '📦 🏺',
'взгляд': '👁️ 🎯',
'вид': '🏞️ 👁️',
'вина': '⛓️ 😔',
'вино': '🍷 🍇',
'власть': '👑 ⚡',
'внимание': '🎯 👁️',
'война': '⚔️ 🛡️',
'волос': '💇 🌾',
'воля': '⚡ ✊',
'встреча': '🤝 👥',
'вуаль': '🕸️ 👰',
'вход': '🚪 🔑',
'высота': '🏔️ 🦅',
'выход': '🚪 🌅',
'глаз': '👁️ ✨',
'год': '📅 ⏳',
'голова': '👤 🧠',
'голос': '🗣️ 🎶',
'гримуар': '📖 🔮',
'грудь': '🫁 🛡️',
'дверь': '🚪 🗝️',
'движение': '🏃 ➡️',
'двойник': '👥 🪞',
'двор': '🏡 🌿',
'дворец': '🏰 👑',
'дельфин': '🐬 🌊',
'деревня': '🏘️ 🌾',
'долина': '🏞️ 🌾',
'дорога': '🛤️ 🧭',
'дочь': '👧 🌸',
'древо': '🌳 🪵',
'дубрава': '🌳 🌿',
'дух': '🕊️ ✨',
'душа': '🕯️ 💖',
'дым': '💨 🌫️',
'дыхание': '🫁 💨',
'единорог': '🦄 ✨',
'желание': '🌟 💫',
'жена': '👰 💍',
'жрица': '🔮 🌙',
'журавль': '🪿 🌾',
'завеса': '🎭 🌫️',
'закон': '📜 ⚖️',
'зал': '🏛️ 🕯️',
'защита': '🛡️ 🏰',
'заяц': '🐇 🐾',
'знамение': '☄️ 📜',
'знание': '💡 📖',
'зов': '📯 📢',
'ива': '🌿 💧',
'игра': '🎭 🎲',
'идея': '💡 ⚡',
'идол': '🗿 🕯️',
'изгнанник': '🚶 🌑',
'изобилие': '🌾 🍇',
'имя': '🏷️ 📜',
'интерес': '🔍 ✨',
'искупление': '🕊️ 🕯️',
'искусство': '🎨 🏛️',
'искушение': '🍎 🐍',
'история': '📜 ⏳',
'источник': '⛲ 💧',
'итог': '🏁 ⚖️',
'кабан': '🐗 🌲',
'кадило': '🪔 💨',
'кадуцей': '⚕️ 🐍',
'капище': '🗿 🔥',
'карма': '☸️ 🔄',
'карта': '🗺️ 🧭',
'картина': '🖼️ 🎨',
'катакомбы': '🏛️ 💀',
'кедр': '🌲 🏔️',
'кинжал': '🗡️ ⚡',
'кипарис': '🌲 🏛️',
'кит': '🐋 🌊',
'кладбище': '🪦 🥀',
'коза': '🐐 🌾',
'компас': '🧭 ⭐',
'копьё': '🗡️ 🛡️',
'король': '👑 🏰',
'кость': '🦴 💀',
'костёр': '🔥 🪵',
'котёл': '🫕 ⚗️',
'край': '⛰️ 🌅',
'крик': '📢 ⚡',
'кристалл': '💎 🔮',
'кровь': '🩸 💓',
'круг': '⭕ 🔄',
'купель': '🏺 💧',
'лавр': '🌿 👑',
'ласточка': '🐦 🌅',
'лебедь': '🦢 💧',
'линия': '📏 〰️',
'лира': '🎻 🎶',
'лицо': '👤 🎭',
'мальчик': '👦 🌱',
'мандала': '☸️ 🌸',
'маяк': '🗼 💡',
'мера': '⚖️ 📏',
'место': '📍 🏛️',
'месть': '🗡️ 🔥',
'месяц': '🌙 ⭐',
'мир': '🕊️ 🌿',
'момент': '⏱️ ⚡',
'мудрец': '🧙 📜',
'муж': '👨 💍',
'мужик': '🧔 🪵',
'музыка': '🎼 🎶',
'муравей': '🐜 🌿',
'мысль': '🧠 💭',
'название': '🏷️ 📖',
'направление': '🧭 ➡️',
'народ': '👥 🏛️',
'нектар': '🍯 🌺',
'ненависть': '🔥 🗡️',
'нищета': '🏚️ 🥀',
'нищий': '🤲 🍂',
'нога': '🦵 👣',
'нос': '👃 🌬️',
'обет': '📜 🕯️',
'обитель': '🏡 🕊️',
'образ': '🪞 👤',
'обрыв': '🧗 🕳️',
'опыт': '🧠 ⏳',
'оружие': '⚔️ 🏹',
'основа': '🏛️ 🧱',
'основание': '🏛️ 🧱',
'ось': '🌐 📍',
'ответ': '✉️ 🗣️',
'откровение': '📜 ⚡',
'отношение': '🤝 🪢',
'отсутствие': '🫙 💨',
'отчаяние': '🌧️ 😔',
'отшельник': '🧙 🏔️',
'охотник': '🏹 🌲',
'палач': '🪓 🖤',
'палец': '☝️ 🖐️',
'пантера': '🐆 🌑',
'пара': '👥 🤍',
'перевал': '🏔️ 🛤️',
'перекресток': '➕ 🧭',
'песня': '🎤 🎶',
'петух': '🐓 🌅',
'печаль': '😢 🌧️',
'пилигрим': '🚶 🧭',
'пир': '🍷 🍖',
'письмо': '✉️ 📜',
'плач': '😭 💧',
'плечо': '🦾 🛡️',
'плющ': '🌿 🏛️',
'подземелье': '🕳️ 🗝️',
'пол': '🪵 🏛️',
'поле': '🌾 🌻',
'половина': '🌓 ✂️',
'помощь': '🤝 🛡️',
'пора': '⏳ 🌾',
'посвящение': '🕯️ 👑',
'пост': '🍞 🧘',
'поэт': '🪶 📜',
'правило': '📜 📏',
'право': '⚖️ 📜',
'принцип': '🏛️ ⚖️',
'природа': '🌿 🌲',
'пристань': '⚓ ⛵',
'причина': '🗝️ 💡',
'проклятие': '☠️ ⚡',
'пропасть': '🕳️ 🧗',
'пророчество': '📜 👁️',
'пространство': '🌌 📐',
'прощение': '🕊️ 🤲',
'радость': '☀️ 😄',
'раз': '1️⃣ ⚡',
'развитие': '🌱 📈',
'рассказ': '📖 🗣️',
'ребята': '🧒 👧',
'реликвия': '🏺 ✨',
'речь': '🗣️ 💬',
'решение': '⚖️ 🗡️',
'рисунок': '🎨 📜',
'рог': '📯 🦏',
'род': '🌳 🩸',
'родитель': '👨‍👩‍👧 🕊️',
'родник': '💧 🌿',
'рок': '⚡ ⏳',
'роман': '📖 ❤️',
'рост': '🌱 ⬆️',
'рот': '👄 🗣️',
'роща': '🌳 🍃',
'рука': '✋ 🤲',
'ручей': '🏞️ 💧',
'рысь': '🐾 🌲',
'связь': '🪢 🔗',
'святилище': '🏛️ 🕯️',
'семья': '👨‍👩‍👧 🏡',
'семя': '🌱 🌰',
'сердце': '❤️ 💓',
'сестра': '👧 🌸',
'сирота': '🥀 🧒',
'скала': '⛰️ 🪨',
'скверна': '☣️ 🖤',
'скит': '🛖 🌲',
'скорбь': '🥀 🖤',
'скрижаль': '📜 🪨',
'слабость': '🥀 ⏳',
'слово': '💬 🪶',
'случай': '🎲 ⚡',
'смех': '😄 ✨',
'смирение': '🙇 🕊️',
'смысл': '💡 🗝️',
'событие': '⚡ 📅',
'совет': '🗣️ 📜',
'создание': '🏛️ ✨',
'сознание': '🧠 ✨',
'солдат': '🪖 ⚔️',
'сомнение': '❓ ⚖️',
'состояние': '🌊 🧘',
'сосуд': '🏺 🫙',
'спаситель': '🕊️ 👑',
'спина': '👤 🛡️',
'спираль': '🌀 🐚',
'спутник': '🛰️ 🌙',
'среда': '🌿 🌐',
'стихи': '📜 🪶',
'сторона': '🧭 ↔️',
'страсть': '🔥 ❤️',
'стыд': '😳 🥀',
'суд': '⚖️ 🏛️',
'сцена': '🎭 🏛️',
'счастье': '🍀 ☀️',
'сын': '👦 🏹',
'талисман': '🧿 🪙',
'танец': '💃 🎶',
'творец': '🏛️ ✨',
'тело': '👤 🩸',
'театр': '🎭 🏛️',
'течение': '🌊 ➡️',
'тигр': '🐅 🐾',
'тотем': '🐾 🪵',
'точка': '📍 ⚫',
'тревога': '⚡ 😟',
'тропа': '🛤️ 🌲',
'труд': '🔨 🌾',
'тысяча': '1️⃣0️⃣0️⃣0️⃣ 🏛️',
'угасание': '🕯️ 💨',
'угол': '📐 🏛️',
'удар': '💥 ⚡',
'улица': '🏙️ 🛤️',
'ум': '🧠 💡',
'успех': '🏆 🌟',
'ухо': '👂 🔔',
'ущелье': '🏞️ 🧗',
'филин': '🦉 🌲',
'фонарь': '🏮 💡',
'форма': '🔷 📐',
'характер': '🗿 ⚡',
'хижина': '🛖 🌲',
'хлеб': '🍞 🌾',
'ход': '♟️ ➡️',
'хозяин': '👑 🔑',
'хранитель': '🗝️ 🛡️',
'художник': '🎨 🖌️',
'цвет': '🎨 🌈',
'цель': '🎯 🏹',
'центр': '🎯 ⭕',
'церковь': '⛪ 🕊️',
'цикл': '🔄 ⏳',
'часть': '🧩 ▫️',
'чаща': '🌲 🌳',
'человек': '👤 🕯️',
'чертог': '🏛️ 👑',
'чувство': '💓 🌊',
'чудо': '✨ 🌟',
'шаг': '👣 🚶',
'шаман': '🪶 🥁',
'шатёр': '⛺ 🌌',
'шрам': '⚡ 🩹',
'шёпот': '🤫 🍃',
'эпоха': '🏛️ ⏳',
'явь': '👁️ ☀️',
'яд': '🧪 ☠️',
'язык': '👅 🗣️',
'яйцо': '🥚 🐣',
'якорь': '⚓ 🌊',
}
def resolve_emoji(word, current_emoji, pos, category):
w = word.lower().strip()
if w in EXPLICIT_EMOJIS:
return EXPLICIT_EMOJIS[w]
if current_emoji and current_emoji not in ('🔮 ✨', '⚡ ➡️', '🧭 🏹', '✨ 🎨', '🏛️ 🧭', '🪢 🔗', '🔮 📜', '✨ 🏺', '👤 ✨', '🐾 ✨'):
return current_emoji
return '✨ 🔮'
def main():
print('=== ASSIGNING RICH EMOJIS TO ALL 1000 WORDS ===')
with open(LEXICON_JSON, 'r', encoding='utf-8') as f:
lexicon = json.load(f)
assert len(lexicon) == 1000, f'Expected 1000 items, got {len(lexicon)}'
word_to_emoji = {}
missing_count = 0
for item in lexicon:
w = item['word']
em = resolve_emoji(w, item.get('emoji', ''), item.get('pos', ''), item.get('category', ''))
item['emoji'] = em
word_to_emoji[w] = em
if em == '✨ 🔮':
missing_count += 1
print(f'Warning: unmapped word: {w}')
print(f'Assigned emojis. Unmapped count: {missing_count}')
# Save lexicon.json
with open(LEXICON_JSON, 'w', encoding='utf-8') as f:
json.dump(lexicon, f, ensure_ascii=False, indent=2)
print(f'Updated {LEXICON_JSON}')
# Update families.json
try:
with open(FAMILIES_JSON, 'r', encoding='utf-8') as f:
families = json.load(f)
for w, entry in families.items():
if w in word_to_emoji and isinstance(entry, dict):
entry['emoji'] = word_to_emoji[w]
with open(FAMILIES_JSON, 'w', encoding='utf-8') as f:
json.dump(families, f, ensure_ascii=False, indent=2)
print(f'Updated {FAMILIES_JSON}')
except Exception as e:
print(f'Error updating families.json: {e}')
# Update KB asset & out
for kb_path in (KB_ASSET_JSON, KB_OUT_JSON):
try:
with open(kb_path, 'r', encoding='utf-8') as f:
kb = json.load(f)
for k, entry in kb.items():
w_name = entry.get('word', '')
if w_name in word_to_emoji:
entry['emoji'] = word_to_emoji[w_name]
with open(kb_path, 'w', encoding='utf-8') as f:
json.dump(kb, f, ensure_ascii=False, indent=2)
print(f'Updated {kb_path}')
except Exception as e:
print(f'Error updating {kb_path}: {e}')
# Update lib/data/words_data.dart
with open(WORDS_DATA_DART, 'r', encoding='utf-8') as f:
dart_lines = f.readlines()
updated_dart_lines = []
current_w = None
for line in dart_lines:
m_word = re.search(r'word:\s*"([^"]+)"', line)
if m_word:
current_w = m_word.group(1)
m_emoji = re.search(r'emoji:\s*"([^"]*)"', line)
if m_emoji and current_w and current_w in word_to_emoji:
line = re.sub(r'emoji:\s*"[^"]*"', f'emoji: "{word_to_emoji[current_w]}"', line)
updated_dart_lines.append(line)
with open(WORDS_DATA_DART, 'w', encoding='utf-8') as f:
f.writelines(updated_dart_lines)
print(f'Updated {WORDS_DATA_DART}')
# Update words_alphabetical.txt and .md
alpha_items = sorted(lexicon, key=lambda x: x['word'])
with open(WORDS_TXT, 'w', encoding='utf-8') as f:
for it in alpha_items:
f.write("#%03d %s %s" % (it["id"], it["word"], it["emoji"]) + chr(10))
print(f"Updated {WORDS_TXT}")
with open(WORDS_MD, "w", encoding="utf-8") as f:
f.write("# Алфавитный указатель Оракула 999" + chr(10) + chr(10))
f.write("| № | Слово | Иконка | Категория | Ч. речи |" + chr(10))
f.write("|---|---|---|---|---|" + chr(10))
for it in alpha_items:
f.write(("| #%03d | **%s** | %s | %s | %s |" % (it["id"], it["word"], it["emoji"], it["category"], it["pos"])) + chr(10))
print(f"Updated {WORDS_MD}")
print(f'Updated {WORDS_MD}')
# Update lexicon_viewer.html
with open(VIEWER_HTML, 'r', encoding='utf-8') as f:
html_content = f.read()
escaped_lexicon = json.dumps(lexicon, ensure_ascii=False)
if 'const rawLexicon = ' in html_content:
html_content = re.sub(r'const rawLexicon = \[.*?\];', f'const rawLexicon = {escaped_lexicon};', html_content, flags=re.DOTALL)
with open(VIEWER_HTML, 'w', encoding='utf-8') as f:
f.write(html_content)
print(f'Updated embedded rawLexicon in {VIEWER_HTML}')
print('=== ALL 1000 WORDS RICHLY EMOJI-MAPPED SUCCESSFULLY ===')
if __name__ == '__main__':
main()