min-co

A language of 45 meaning roots with value axes. A word is encoded in two ways — by AI (a language model) and by Vectors (pure math, no model) — and then decoded blind.

Язык из 45 смысловых корней с осями значений. Слово кодируется двумя способами — ИИ (языковая модель) и Векторы (чистая математика, без модели) — и раскодируется вслепую.

Hover over any part of a code (on a phone, tap it): a root, a label, a particle. Below the code are the axes of its roots.
Наведите курсор на любую часть кода (на телефоне — нажмите): корень, метку, частицу. Под кодом — оси его корней.

Saved examplesСохранённые примеры

Results of blind tests: one model encoded, another decoded without seeing the word. Green — the word was guessed first, yellow — it is among the alternatives, red — a miss. Click a row: the model is not called, the math is recomputed.

Результаты слепых тестов: кодировала одна модель, раскодировала другая, не видя слова. Зелёным — слово угадано первым, жёлтым — оно среди альтернатив, красным — промах. Нажмите строку — модель не вызывается, математика считает заново.

Two series. Recipes (law, money, food, transport, society, health, direction of motion): the Sonnet decoders saw the recipe list, so this checks that a recipe reads unambiguously, not that it can be guessed from scratch. Substances and numbers: the decoder saw only the root tables.

Две серии. Рецепты (право, деньги, еда, транспорт, общество, здоровье, направление движения): декодеры Sonnet видели список рецептов, так что это проверка того, что рецепт читается однозначно, а не того, что его можно угадать с нуля. Вещества и числа: декодер видел только таблицы корней.

wordсловоcodeкодread asпрочитано

Root mixerСмеситель корней

Put up to three roots into the slots and move their values: the vectors (no language model) read the code at once and show the words nearest to it. The first root is the head — what kind of thing it is; the next ones narrow it. Click a word in the cloud to see how it is coded.

Положите до трёх корней в ячейки и двигайте их значения: векторы (без языковой модели) сразу читают код и показывают ближайшие к нему слова. Первый корень — главный: что это за вещь; следующие его сужают. Нажмите на слово в облаке — увидите, как кодируется оно само.

meaningсмысл
—
codeкод
—

RootsКорни

Click a root: it goes into the first free slot; click a highlighted root again to take it out. To replace a root, first click its slot (it lights up), then click the new root. You can also drag a root onto a slot, and drag a slot by its name to reorder.Нажмите на корень — он встанет в первую свободную ячейку; повторное нажатие на подсвеченный корень убирает его. Чтобы заменить корень, сначала нажмите на его ячейку (она подсветится), потом на новый корень. Корень можно и перетащить на ячейку, а ячейки — переставить, перетащив за имя.

How to read a codeКак читать код

A word is written as ROOTS | form. Before the bar is the meaning: the head root and up to two modifying roots, each with a value on its axis when needed: GOOD(=+3) (fairly good), TIME(=-2) (recently), MANY(=-5) (none at all). No value written means the value is unspecified. Each next root refines everything before it: GRAIN(=0) THING(=-5) PART(=-5) — “loose crumbs of stone” (sand).

After the bar comes the part of speech — o thing, i action, a property, e circumstance — then, for a noun, an optional role like the Esperanto suffixes -ist, -il, -aĵ, -ec: agent the one who does it or a person of that field (ART(=+5) | o agent artist), tool, result, quality; and the form labels below: SAY | i T-2 M-5 — “did not say”. Roots without an axis () take no value.

Quotes are used only for numbers, proper names and specific members of a family in Latin or international form: a species "Canis", a substance "iodine", an organ "hepar", a celestial body "Luna", a game "chess", a narrow term "enzyme". The category itself is built from roots: organ — BODY INSIDE(=+5) PART(=-2) | o, star — HEAT(=+5) ABOVE(=+5) PART(=-2) | o. If a word has a recipe, no quotes are needed.

Слово записывается как КОРНИ | форма. До черты — смысл: главный корень и до двух уточняющих, у каждого при необходимости значение его оси: GOOD(=+3) (скорее хороший), TIME(=-2) (недавно), MANY(=-5) (ни одного). Ось не написана — значение не указано. Каждый следующий корень уточняет всё, что стоит перед ним: GRAIN(=0) THING(=-5) PART(=-5) — «сыпучие крошки камня» (песок).

После черты — часть речи: o предмет, i действие, a признак, e обстоятельство, у имени — необязательная роль, как суффиксы эсперанто -ist, -il, -aĵ, -ec: agent тот, кто делает, или человек этой области (ART(=+5) | o agent художник), tool орудие, result результат, quality свойство; и метки формы ниже: SAY | i T-2 M-5 — «не сказал». Корни без оси () значений не берут.

В кавычках пишутся только числа, имена собственные и конкретные члены семейства в латинской или международной форме: вид "Canis", вещество "iodine", орган "hepar", светило "Luna", игра "chess", узкий термин "enzyme". Сама категория строится из корней: орган — BODY INSIDE(=+5) PART(=-2) | o, звезда — HEAT(=+5) ABOVE(=+5) PART(=-2) | o. Если для слова есть рецепт, кавычки не нужны.

example — hover over the parts of the codeпример — наведите на части кода

ParticlesЧастицы

Form labelsМетки формы

Labels are not roots. They go after the bar, separated by spaces, once on the head word.

Метки — не корни. Ставятся после черты через пробел, один раз на главном слове.

labelметкаwhatчтоscaleшкала

Single words use this notation (with the part of speech after the bar) because it is the one verified by blind tests on words. The Toki Pona-style notation (no bar) won on whole sentences but was not measured on single words.

Для отдельных слов используется эта запись (с частью речи после черты), потому что именно она проверена слепыми тестами на словах. Запись в стиле токи пона (без черты) выиграла на целых предложениях, на словах отдельно не измерялась.

Phonetics (optional, draft)Фонетика (опция, черновик)

Switch it on under the input field: every code gets a line with its pronunciation. Not checked by ear yet; the source is phonetics.yaml.

  • A root is a Toki Pona word where one fits (pona GOOD, suli BIG, sona KNOW, moku CONSUME), and the word itself never changes — the head of a word is always the plain Toki Pona word. The value on its axis is a suffix of syllables that Toki Pona forbids, so it cannot be mistaken for a word: ti positive, wu negative, repeated |v| times; an explicit (=0) is a short y (Russian ы, as in Polish); nothing written means no value. Roots without an axis take no suffix (SEE lukin, DO pali, TEXT lipu).
  • Examples: GOOD is pona, GOOD(=+3) is ponatititi, GOOD(=-2) is ponawuwu, GOOD(=0) is ponay.
  • Word = root blocks joined with -, then ' and the vowel of the part of speech, then the role and labels after · (ul il aj ec for agent, tool, result, quality; a label is a vowel and a consonant: at T+, ad T−, an T0).
  • Particles all start with h: he E, hi PI, ha LA, hu AND, hen FROM, hon FOR, hin LIKE, ho PE; hem … hom are the brackets, hum is ;. Quoted names are read in their own language.

In the Roots tab the sounds of each root show next to its name.

Включается под полем ввода: у каждого кода появляется строка с произношением. На слух ещё не проверено; источник — phonetics.yaml.

  • Корень — токипонское слово, где оно подходит (pona GOOD, suli BIG, sona KNOW, moku CONSUME); само слово не меняется, голова слова — всегда обычное токипонское слово. Значение оси — суффикс из слогов, которые запрещает токипонская фонотактика, поэтому он не спутается со словом: ti — положительное, wu — отрицательное, повторённые |v| раз; явный (=0) — короткое y (ы, как в польском); ничего не названо — значения нет. У корней без оси суффикса нет (SEE — lukin, DO — pali, TEXT — lipu).
  • Примеры: GOOD — pona, GOOD(=+3) — ponatititi, GOOD(=-2) — ponawuwu, GOOD(=0) — ponay.
  • Слово = блоки корней через -, затем ' и гласная части речи, затем роль и метки после · (ul il aj ec — agent, tool, result, quality; метка — гласная и согласный: at — T+, ad — T−, an — T0).
  • Частицы все начинаются на h: he E, hi PI, ha LA, hu AND, hen FROM, hon FOR, hin LIKE, ho PE; hem … hom — скобки, hum — ;. Имена в кавычках читаются на своём языке.

В таблице «Корни» рядом с каждым корнем показано его звучание.

RootsКорни

rootкорень−50+5

Source: the file roots.yaml; the table on the site is built from it.

Источник — файл roots.yaml; таблица на сайте собирается из него.

Recipe dictionaryСловарь рецептов

wordсловоcodeкод

The recipes are collected from encoding.md and from the hints the model gets on the site; each was checked by a blind test (reports in data/translation_test). Click a row — the code opens in “Try it”: the model decodes it blind and the math reads it.

Рецепты собраны из encoding.md и подсказок, которые получает модель на сайте; каждый проверен слепым тестом (отчёты — в data/translation_test). Нажмите строку — код откроется на «Пробе»: модель раскодирует его вслепую, математика прочитает.

Method

The main question: is meaning preserved along the chain text → code → text? The check is blind:

  1. The encoder sees only the language description and the text, and writes the code.
  2. The decoder, a separate instance, sees only the description and the code, and restores the text.
  3. The judge (another, stronger model) sees the original and the shuffled variants and scores 0–3: 3 the same meaning, 2 the gist kept, 1 only the topic, 0 off.
  4. Differences between variants come with a 95% bootstrap interval over sentences. The language is changed only if the interval excludes zero.

Results

checkresult
Removed the roots CONTAINER and MAYBE (replaced by combinations and a label)within noise; fewer roots
An axis on the root “see”worse than without (−0.43, interval at the edge); not introduced
Curly braces around wordsmany more codes without format errors (8–10% errors instead of 30–58%), meaning unchanged (+0.04 [−0.20, +0.26])
Recipes for gaps (law, money, food, transport, society, power, war, health)in two blind tests 24 of 24 with recipes against 17, 13 and 19 without; no new roots needed
Toki Pona-style notation (root words, roles by position)better meaning: +0.33 [+0.05, +0.60] on a held-out set of 40 sentences

Math without a model

The right column in “Try it” encodes a word without a language model: the word vector (ConceptNet Numberbatch) is approximated by a sum of at most three roots with integer axis values, by trying all variants. A root is a “center” (what the axis is about) plus an axis direction, built from pole words in roots.yaml. The root directions are then fitted on 70% of frequent words, with the condition that each stays close to the original (cos ≥ 0.85). Decoding: a word must be close to each root of the code separately, and hub words that are close to any code are penalized.

What it gives: on the math's own codes (2000 words of the site dictionary) the word is restored first in 46–51% of cases and in the top ten in 91–93%. But people and models hardly read the math's codes (1–3 of 24 in an earlier blind test). So it serves as an analysis tool — finding missing roots, checking axis poles, finding duplicate roots (this is how MATTER and GRAIN were merged) — not as a translator. Details: docs/math.md (in Russian).

Honest caveats

  • Absolute accuracy is modest: on encyclopedic sentences the average score is about 1.2–1.4 of 3. The language carries the topic and the main relations, not the details.
  • The encoder, decoder and judge are models of one family; there are no people and no other languages in the check. Two encoders per variant, 40–60 sentences, noise around ±0.3.
  • The first run of the “toki” notation was inflated: the encoders inserted ordinary English words in quotes. The loophole was closed and the run repeated; the result above is after the fix.
  • Roots and axes were tuned on development sets, so the final numbers come from a held-out set of fresh articles.

Protocol and scripts: scripts/eval; results: data/translation_test.

Методология

Главный вопрос: сохраняется ли смысл при цепочке текст → код → текст. Проверка слепая:

  1. Кодировщик видит только описание языка и текст и пишет код.
  2. Декодер — отдельный экземпляр — видит только описание и код и восстанавливает текст.
  3. Судья (другая, более сильная модель) видит оригинал и перемешанные варианты и ставит 0–3: 3 тот же смысл, 2 главное сохранено, 1 только тема, 0 мимо.
  4. Разницу между вариантами считаем с 95%-ным бутстреп-интервалом по предложениям. Меняем язык, только если интервал не содержит нуля.

Что получилось

проверкарезультат
Убрали корни CONTAINER и MAYBE (вместо них сочетания и метка)в пределах шума; корней стало меньше
Ось у корня «видеть»хуже, чем без оси (−0,43, интервал на границе); не введена
Фигурные скобки вокруг словкодов без ошибок формата стало намного больше (8–10% ошибок вместо 30–58%), смысл не изменился (+0,04 [−0,20, +0,26])
Рецепты для лакун (право, деньги, еда, транспорт, общество, власть, война, здоровье)в двух слепых тестах по 24 из 24 с рецептами против 17, 13 и 19 без них; новых корней не понадобилось
Запись в стиле токи пона (слова-корни, роли по позиции)смысл лучше: +0,33 [+0,05, +0,60] на отложенном наборе из 40 предложений

Математика без модели

Правая колонка на «Пробе» кодирует слово без языковой модели: вектор слова (ConceptNet Numberbatch) приближается суммой не больше трёх корней с целыми значениями осей, перебором всех вариантов. Корень — это «центр» (о чём ось) плюс направление оси, построенные из слов-полюсов в roots.yaml. Направления корней затем подогнаны по 70% частых слов с условием, что каждый остаётся похож на исходный (cos ≥ 0,85). Раскодирование: слово должно быть близко к каждому корню кода по отдельности, а слова-хабы, близкие к любому коду, штрафуются.

Что это даёт: на собственных кодах математики (2000 слов словаря сайта) слово восстанавливается первым в 46–51% случаев и в первой десятке в 91–93%. Но люди и модели коды математики почти не читают (1–3 из 24 в прежнем слепом тесте). Поэтому она служит инструментом анализа — искать недостающие корни, проверять полюса осей, находить корни-дубли (так слиты MATTER и GRAIN), — а не переводчиком. Подробно: docs/math.md.

Честные оговорки

  • Абсолютная точность невысока: на энциклопедических предложениях средняя оценка около 1,2–1,4 из 3. Язык пока передаёт тему и главные связи, но не детали.
  • Кодировщик, декодер и судья — модели одной семьи; людей и других языков в проверке нет. Кодировщиков по два на вариант, предложений 40–60, шум порядка ±0,3.
  • Первый прогон записи «токи» оказался раздутым: кодировщики вставляли обычные английские слова в кавычках. Лазейку закрыли и повторили, результат выше — после исправления.
  • Корни и оси подбирались на настроечных наборах; поэтому итоговые цифры берём с отложенного набора свежих статей.

Протокол и скрипты: scripts/eval; результаты: data/translation_test.

DocumentationДокументация

The documents in the repository are in Russian and still describe the previous notation (with | and suffixes). The Toki Pona-style notation is accepted for testing and has not been moved into them yet.

Документы в репозитории пока описывают предыдущую запись (с | и суффиксами). Запись в стиле токи пона принята для проверки и ещё не перенесена в них.