Автоматическое построение геометрических иллюстраций из текста

Анализ подхода на основе семантических сетей и шаблонного анализа

Контекст: Магистерская диссертация 2009 года (АФТ УФ РАН, Санкт-Петербург) исследовала задачу автоматического построения иллюстраций к задачам по планиметрии. Данная статья критически рассматривает выбранные технические решения, их ограничения и актуальность.

Постановка задачи

Требуется: по текстовому описанию геометрической задачи на естественном языке (русском) построить корректную иллюстрацию.

Практическая мотивация: автоматизация создания иллюстраций для электронных учебников и задачников снижает трудоёмкость подготовки материалов и позволяет динамически генерировать изображения для разных вариантов условий.

Исследовательская мотивация: задача требует формализации процесса визуализации, что представляет интерес для изучения связи языка и пространственного мышления.

Сплит-скрин: текст и иллюстрация

Декомпозиция задачи

Задача распадается на три независимых подзадачи, каждая из которых представляет самостоятельную область исследований:

Уровни обработки

  1. Лингвистический анализ: токенизация, морфологический разбор, синтаксический парсинг предложений на естественном языке
  2. Семантический анализ: построение промежуточного представления (семантической сети), отражающего объекты и отношения между ними
  3. Геометрическое построение: определение порядка рисования и вычисление координат в двумерном пространстве

Критическое замечание: наиболее сложной оказывается третья подзадача, так как она требует формализации неявных эвристик, которые человек применяет интуитивно.

Трёхуровневая трансформация

Проблема порядка построения

Центральная сложность — определение корректной последовательности рисования геометрических объектов.

Пример условия:
«В треугольнике ABC проведена медиана BM. Через точку M провели прямую, параллельную стороне AB.»

Граф зависимостей:

Следствие: необходимо построить DAG (направленный ациклический граф) зависимостей и определить топологический порядок обхода. Циклические зависимости указывают на некорректность или недоопределённость условия.

Ограничения и инварианты

Проблема коллинеарности: если условие требует "прямая, проходящая через точки A, B, C", наивный подход (случайно сгенерировать три точки, затем построить прямую) приводит к вырожденному случаю.

Корректное решение:

  1. Построить прямую как первичный объект
  2. Разместить три точки на прямой как зависимые объекты

Обобщение: для любого геометрического ограничения необходимо явно учитывать зависимости между объектами. Система должна различать первичные (independent) и вторичные (dependent) объекты.

Правильный и неправильный подход

Архитектура решения: три кита

Проект разбивается на три большие части:

1. Построение семантической сети

Семантическая сеть — это граф, где узлы — понятия (точка, треугольник, прямая), а рёбра — связи между ними (принадлежит, перпендикулярен, является вершиной).

Чтобы построить её из текста, используется язык шаблонов:

Шаблон "ОБОЗНАЧЕНИЕ":

<геометрический объект> <метка>

Примеры: «треугольник ABC», «отрезок MH», «точка X»

Результат: создаётся связь «ABC обозначает треугольник»

Текст разбивается на предложения, слова сопоставляются с понятиями (например, «вершина», «ортоцентр» → тип point), затем применяются шаблоны для поиска связей.

2. Обработка семантической сети

Полученная напрямую из текста сеть ещё сырая. Нужна «нормализация»:

Этот этап соответствует «мышлению» — обдумыванию условия перед рисованием.

Семантическая сеть

3. Построение иллюстрации

Теперь самое интересное — алгоритм рисования. Вот его логика (упрощённо):

  1. Рисуем случайным образом самую большую фигуру (ту, которой принадлежит больше всего точек) — например, треугольник
  2. Ищем точки, которые однозначно заданы уже нарисованным (например, середина стороны)
  3. Рисуем фигуры, которые теперь можно построить по этим точкам (например, медиану)
  4. Повторяем шаги 2-3, пока возможно
  5. Если остались неопределённые точки, выбираем ту, у которой наименьшая степень свободы, и рисуем случайно (с учётом ограничений)
  6. Повторяем, пока всё не нарисовано

Аналогия с кроссвордом: сначала заполняем самое длинное слово, потом используем пересечения, чтобы вписать остальные.

Технические хитрости

Классы фигур и конструкторы

Каждая геометрическая фигура — это класс с несколькими конструкторами, отражающими разные способы её построения:

Окружность можно задать:

Программа выбирает конструктор в зависимости от того, какие данные уже есть.

Степень свободы

Когда точка не задана однозначно, программа оценивает её степень свободы:

Рисуем точки с минимальной степенью свободы — так меньше произвола.

Степени свободы

Что это даёт нам сегодня?

Проект 2009 года, но идеи актуальны:

Для образования

Для исследований

Современный контекст

В 2009 году использовались шаблоны и графы. Сегодня, в эпоху больших языковых моделей:

Но! Базовые принципы остаются: понимание зависимостей, порядок построения, степени свободы. Нейросеть может «понять» текст лучше, но логика геометрического построения — та же.

Эволюция технологий

Детали реализации: как это работает на практике

Теперь перейдём к техническим деталям — как именно всё это было реализовано в коде.

Язык шаблонов для семантического анализа

Вместо полноценного NLP-парсера был разработан специализированный язык шаблонов. Это компромисс между простотой реализации и выразительностью.

Структура шаблона

Каждый шаблон состоит из двух частей:

  1. Трафарет — правило поиска в тексте (регулярное выражение над типами понятий)
  2. Заготовки связей — список связей, которые нужно создать для найденных понятий
Пример шаблона: ОБОЗНАЧЕНИЕ

Трафарет: <геометрический_объект> <обозначение>

Заготовка связи: обозначение.isSignOf(объект)

Найдёт: "отрезок MH", "точка X", "треугольник ABC"

Создаст: узлы для отрезка и обозначения "MH", связь между ними

Пример сложного шаблона: ПЕРПЕНДИКУЛЯР

Трафарет: прямую <sign1>, перпендикулярную <geom2> <sign2>

Заготовки:

Найдёт: "прямую l, перпендикулярную отрезку AB"

Этапы обработки текста

  1. Токенизация: текст → предложения → слова. Каждое слово становится объектом со ссылками на соседей
  2. Морфологический анализ: выделение основ слов ("вершина", "вершины", "вершине" → одна основа)
  3. Сопоставление типов: "точка", "вершина", "ортоцентр" → тип point
  4. Применение шаблонов: к каждому предложению применяются все шаблоны связей

Преобразование текста в "помеченную" последовательность:

Пример преобразования

Исходный текст:
"Через H провели прямую, перпендикулярную отрезку MH, которая пересекла прямые AB и BC в точках X и Y."

После маркировки типов:
Через H-sign провели прямую-line, перпендикулярную отрезку-piece MH-sign, которая пересекла прямые-line AB-sign и BC-sign в точках-point X-sign и Y-sign.

Найденные понятия:

Математическая модель семантической сети

Семантическая сеть формализована как ориентированный граф:

Формальное определение

Множество типов узлов:
NodeTypes = {sign, point, line, piece, triangle, square, circle, ...}

Множество типов связей:
LinkTypes = {isSignOf, belong, isVertex, isCenter, isPerpendicular, ...}

Узел: node := (id, nodeType), где id ∈ ℕ₀

Связь: link := (node₁, node₂, linkType)

Сеть: S := ({nodes}, {links})

Нормализация сети: декомпозиция и синтез

Самая хитрая часть — превратить "сырую" сеть в удобную для рисования. Это трёхэтапный процесс:

Этап 1: Декомпозиция (разложение на атомы)

Сложные понятия разбиваются на простейшие составляющие.

Пример: четырёхугольник ABCD

До декомпозиции:

После декомпозиции:

Этап 2: Унификация (объединение одинаковых)

Если встречаются понятия с одинаковыми обозначениями — они объединяются.

Пример: треугольник ABC и отрезок AB

До унификации:

После унификации:

Этап 3: Очистка (удаление лишнего)

Удаляются узлы, которые были созданы на этапе декомпозиции, но не участвовали в унификации — они избыточны.

Классы геометрических фигур

Каждая фигура — это класс, реализующий интерфейс IFigure с методом draw().

Реализованные классы фигур

Конструкторы фигур

Ключевая идея: одна фигура может быть задана разными способами. Каждый способ — отдельный конструктор.

Класс Circle — три конструктора

1. По центру и радиусу:

Circle(Point center, double radius)

2. По центру и точке на окружности:

Circle(Point center, Point pointOnCircle)

3. По трём точкам на окружности:

Circle(Point p1, Point p2, Point p3)

Все три способа однозначно определяют окружность! Программа выбирает конструктор в зависимости от доступных данных.

Класс Triangle — два конструктора

1. По трём вершинам:

Triangle(Point a, Point b, Point c)

2. По двум вершинам и углу:

Triangle(Point a, Point b, Angle angle)

Алгоритм рисования: псевдокод

Основной цикл построения
while (не все фигуры нарисованы) {
    
    // Ищем фигуры, для которых есть все опорные точки
    for (каждая ненарисованная фигура F) {
        constructor = найтиПодходящийКонструктор(F);
        if (constructor && всеОпорныеТочкиЗаданы(constructor)) {
            нарисоватьФигуру(F, constructor);
            continue;
        }
    }
    
    // Ищем точки, однозначно заданные нарисованными фигурами
    for (каждая ненарисованная точка P) {
        if (P.принадлежитНарисованнойФигуре() && 
            P.положениеОднозначноЗадано()) {
            нарисоватьТочку(P);
            continue;
        }
    }
    
    // Если прогресс застопорился — рисуем случайную точку
    if (нетПрогресса) {
        P = найтиТочкуСМинимальнойСтепеньюСвободы();
        нарисоватьТочкуСлучайно(P);
    }
}
            

Степени свободы точки

Когда точка не задана однозначно, программа вычисляет её степень свободы — количество независимых параметров.

Классификация по степеням свободы

0 степеней — точка задана однозначно:

1 степень — точка на линии:

2 степени — свободная точка:

Выбираем точку с минимальной степенью свободы — так результат меньше зависит от случайности.

Структура проекта (Java пакеты)

Модульная архитектура

Пакет geom — геометрические примитивы:

Пакет semantic — ядро логики:

Подпакет semantic.nodes — типы узлов:

Подпакет semantic.links — типы связей:

Пакет gui — интерфейс (Swing):

Практики программирования

Проект использовал принципы, которые обеспечили чистоту и расширяемость кода:

Использование программы

Интерфейс программы

Рабочий процесс:

  1. Пользователь вводит текст задачи в текстовое поле
  2. Нажимает кнопку "Построить"
  3. Программа показывает промежуточные результаты:
    • Семантическую сеть (граф) — для отладки
    • Нормализованную сеть
  4. Отрисовывается финальная иллюстрация
  5. В случае ошибки — показывается, на каком этапе возникла проблема

Интеграция с GraphViz

Для визуализации семантической сети использовалась библиотека GraphViz:

Это позволяло видеть, как программа понимает текст — бесценно для отладки!

Ограничения реализации

Что не было реализовано (и почему это интересно):

Каждое ограничение — это отдельное исследование! Проект показал принципиальную возможность, но до «промышленной» системы ещё далеко.

Расширение на другие языки

Архитектура спроектирована с учётом мультиязычности:

Пример шаблона для английского:

English template: LABELING

<geometric_object> <label>

Matches: "triangle ABC", "segment MH", "point X"

Философское отступление

Язык описывает мир, но геометрия показывает его. Перевод между ними — это не просто техническая задача, а моделирование того, как разум связывает символы с образами.

Проект исследует фундаментальный вопрос: как мы думаем о пространстве?

Когда вы читаете «биссектриса угла», в голове не возникают слова — возникает картинка. Зрительные образы — язык творческого мышления. Психологи утверждают: человек не может помыслить понятие, не визуализировав его.

Заставляя компьютер превращать текст в рисунок, мы:

  1. Формализуем неявные процессы человеческого мышления
  2. Проверяем гипотезы о том, как устроено визуальное мышление
  3. Создаём инструменты, которые усиливают наши когнитивные способности

Ограничения и будущее

Что не работало (тогда)

Направления развития

Футуристический интерфейс

Выводы

Автоматическое построение иллюстраций к геометрическим задачам — это больше, чем просто «удобная фича» для учебников. Это:

«Моделирование умственной деятельности человека при построении геометрического изображения вполне реалистично» — но требует глубокого понимания того, как мы думаем о пространстве.

Проект 2009 года заложил фундамент. Современные технологии могут построить на нём небоскрёб. Но принципы — извлечение смысла, моделирование зависимостей, уважение к геометрической логике — останутся неизменными.


Техническая реализация: Java, Swing (GUI), собственный язык шаблонов для NLP, семантические сети на основе графов. Исходный код включал модули geom (геометрические примитивы), semantic (анализ и сеть), gui (интерфейс).

О дипломе: Работа защищена в 2009 году в Академическом физико-технологическом университете РАН (Санкт-Петербург). Научный руководитель — д.ф.-м.н., доцент А.В. Омельченко. Рецензент — к.ф.-м.н., доцент С.И. Николенко.

← Вернуться на главную