ПРОЕКТ
Цифровая геральдика
О проекте
Проект посвящен изучению возможностей технической обработки блазонов (описаний гербов), относящихся к российской геральдике и попытке создания графа онтологий российской геральдике

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

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

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

Каждый герб имеет описание (либо должен иметь). Такое описание называется блазоном. Процесс создания блазона - блазонированием

Хороший блазон должен соответствовать определенным правилам и быть написан геральдическим языком, имеющим особую терминологию

Хороший блазон дает возможность визуально восстановить изображение герба в случае его отсутствия

Немного об особенностях геральдического языка на примере трех блазонов разного времени

Задачи проекта
  • Предобработка данных
    Работа с изначальными датасетами с блазонами гербов. Приведение датасетов примерно к единому виду. Лемматизация блазонов и т.д.
  • Граф онтологий
    Создание графа онтологий российской геральдики
  • Работа с нейросетями
    Оценка эффективности моделей ИИ для блазонирования гербов
Предобработка данных
В работу над проектом было взято несколько датасетов, собранных некогда вручную из разных источников, в том числе с дореволюционными блазонами. Датасеты имели разный вид

Датасеты были разделены между участниками проекта. Требовалось привести их в более удобный и унифицированный вид для технической обработки и решения дальнейших задач
Облака тегов, созданные на основе датасетов
Граф онтологий российской геральдики
По сей день для российской геральдики не существует графа онтологий, отражающего основную терминологию российской геральдики и связи между понятиями. С помощью графа можно представить геральдический язык в цифровом виде и обозначить важность определенных терминов и их взаимосвязи, что крайне важно для геральдики и специалистов, изучающих ее
Подобный граф онтологий был создан для немецкой геральдики, но для российской геральдики он не подходит в силу специфики русского геральдического языка. Например, могут использоваться фигуры, не существующие в немецкой геральдике (локальные особенности муниципальных гербов)

Источник: https://digitalheraldry.org/digital-heraldry-ontology/heraldry/documentation/webvowl/index.html#
Этапы работы над графом онтологий
Выбор датасета
Для создания графа был взят датасет с гербами Гильдии геральдических художников и современными блазонами, так как в них нет дореволюционных слов и правописания, и даже для человеческого взгляда они кажутся более понятными
Работа с датасетом ГГХ
Для построения графа в датасет были добавлены новые столбцы с предобработкой данных: блазоны без девиза - блазоны без стоп-слов (список брался из библиотеки) - блазоны лемматизированные - блазоны без пунктуации. Каждый последующий этап предобработки текстов зависел от предыдущего
Написание кода
Граф строился на основе последнего столбца получившегося датасета: 'text_no_punct', где блазоны были представлены после лемматизации и без пунктуации. Поиск связей осуществлялся по принципу поиска сочетаний слов
Фрагмент кода для графа онтологий
import pandas as pd
import networkx as nx
import re
from collections import defaultdict
import math
from pyvis.network import Network

[..................]

# Функция для извлечения пар по заданным правилам
def extract_term_pairs(text):
    pairs = []
    words = [word for word in re.split(r'\s+', str(text)) if word and word not in stop_words]
    
    for i in range(len(words)-1):
        w1, w2 = words[i], words[i+1]
        
        if len(w1) < 3 or len(w2) < 3:
            continue
            
        pattern1 = w1 in adjectives and w2 in nouns     # прил + сущ
        pattern2 = w1 in nouns and w2 in nouns          # сущ + сущ
        pattern3 = w1 in verbs and w2 in nouns          # гл + сущ
        pattern4 = w1 in verbs and w2 in adverbs        # гл + нар
        
        if pattern1 or pattern2 or pattern3 or pattern4:
            pairs.append((w1, w2))
    
    return pairs

# Создание графа
G = nx.Graph()

# Добавление центрального узла "Гербовый щит"
G.add_node('Гербовый щит', size=50, color='#FF5733', group='central', title='Гербовый щит', shape='star')
Граф онтологий российской геральдики
(по блазонам гербов ГГХ)
Ссылка для скачивания html-файла с графом: https://github.com/Anna7Pio/github.io/blob/main/heraldic_ontology_fin.html
Работа с нейросетями
Главной задачей было оценить эффективность моделей ИИ для блазонирования гербов. Ручное составление описаний требует времени и компетенций, доступных лишь ограниченному числу специалистов

Зачем нужно блазонирование при помощи ИИ?

Ускоряет обработку больших массивов гербов
Облегчает классификацию и каталогизацию геральдических объектов
Снижает вероятность ошибок, связанных с человеческим фактором
Делает геральдику доступнее для широкой публики и исследователей, не владеющих геральдическим языком
Таким образом, проект находится на пересечении гуманитарных и цифровых наук и способствует сохранению культурного наследия с помощью передовых технологий. Его результаты могут быть полезны для архивов, музеев, генеалогических обществ, образовательных и научных учреждений
Этапы работы над оценкой блазонирования ИИ
Создание датасета
Создание датасета с гербами, их эталонными блазонами и блазонными описаниями, сгенерированными разными моделями
(gemini, o3, claude, gigachat)
Косинусная близость
Оценка косинусной близости между эталонным блазоном и блазонами, сгенерированными при помощи моделей
Оценка эксперта
Экспертная оценка качества блазонирования
Сравнение оценок
Сравнение экспертной оценки и оценки с помощью косинусной близости для определения, адекватна ли метрика косинусной близости для нашей задачи
Выбор модели
Выявление модели ИИ, наиболее эффективно справляющейся с задачей блазонирования

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

Промт для больших языковых моделей

Моделям давались промт и изображение герба. Задача модели: написать правильный блазон с использованием геральдического языка

Был создан один максимально подробный промт для всех моделей

При написании промта опирались на классический источник: Медведев М.Ю. Геральдика. СПб.: Специальные исторические дисциплины. 2003
Сгенерируй, пожалуйста, блазон по этой картинке. Ниже - правила составления блазона.

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

Существует два «меха»: горностаевый в виде белого фона, равномерно покрытого стилизованными черными хвостиками, и беличий в виде серебряных и лазоревых угловатых «шкурок».

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

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

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

Важнейшие геральдические фигуры — столб (вертикальная полоса), пояс (горизонтальная), правая и левая перевязи (диагональные), крест (образованный столбом и поясом), андреевский (косой, «косвенный») крест, глава (отделенный верх щита), оконечность (низ щита), кайма (полоса по краю щита), стропило (две полосы, соединенные под углом).
Прочие фигуры именуются негеральдическими и делятся на естественные (лев, дракон, ангел, молния, звезда и т. п.) и искусственные (стена, меч и т. п.).

Установлен традиционный набор позиций, в которых предстают геральдические животные. Так, четвероногие могут быть восстающими (вставшими на дыбы), идущими (стоящими на трех лапах, одна из передних поднята в шаге), стоящими (на четырех лапах), скачущими, сидящими, лежащими; другие позиции более редки. Твари также могут быть обернувшимися (гладящими назад) или повернувшими морды к зрителю. При этом позиция понимается условно, без графической фиксации деталей; так, восстающий зверь может равно изображаться опирающимся на обе задние лапы или на одну, значительная свобода допускается в расположении хвоста и т. п. Орел, как правило, предстает фронтально (лишь голова его обращена в профиль), распростершим и воздевшим крылья.


Оценка косинусной близости

между блазонами, взятыми за эталон и блазонами, сгенерированными моделями

Для всех блазонов провели стемминг

Исключили стоп-слова
Вычислили косинусную близость к эталонному блазону
Получили новый датасет
Фрагмент кода для расчета косинусного расстояния
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

from typing import List
from nltk.stem import SnowballStemmer
import re

# Функция стемминга
snowball = SnowballStemmer(language="russian")

def apply_stemming_ru(text: str) -> str:
    text = text.lower()
    text = re.sub(r"[^а-яё ]", " ", text)
    x = list(set([snowball.stem(t) for t in text.split()]))
    return ' '.join(x)

# Загрузка стоп-слов из файла
def load_stopwords_from_file(filepath: str) -> List[str]:
    with open(filepath, 'r', encoding='utf-8') as f:
        stopwords = [line.strip().lower() for line in f if line.strip()]
    return stopwords

# Вычисление косинусного расстояния
def compute_stem_cosine_distance_ru(reference: str, candidate: str, stop_words: List[str]) -> float:
    vectorizer = CountVectorizer(
        stop_words=stop_words,
        analyzer='word',
    )
    stem_matrix = vectorizer.fit_transform([reference, candidate])
    sim = cosine_similarity(stem_matrix[0:1], stem_matrix[1:2])[0][0]
    return sim
Фрагмент получившегося датасета
У Gigachat систематически более низкие метрики косинусной близости
Experience
Each member of our team has at least 5 years of legal experience. They use their knowledge at work.
Однозначного лидера нет, хотя большинство первых мест у Gemini
Support
Our managers are always ready to answer your questions. You can call us during the weekends and at night.
С некоторыми гербами все модели справляются хуже. Как правило, это гербы с большим количеством элементов
Efficiency
We care about our clients' time. Give us a call, and we will help you with all the questions.
Экспертная оценка качества блазонирования
Чтобы удостовериться, что мы выбрали валидную метрику качества, попросили эксперта оценить качество блазонирования и после этого сравнили, насколько похожи оценки у эксперта и с помощью косинусной близости. При высокой корреляции сможем сказать, что метрика косинусной близости отражает экспертную оценку и, таким образом, экспертная оценка может быть автоматизирована.

Для этого создали анкету, в которой по очереди предъявляются на оценку гербы из нашего датасета, эталонный и сгенерированные ИИ блазоны приведены в рандомном порядке. От эксперта требовалось проранжировать удачность блазонных описаний от наилучшего к наихудшему
В итоге мы получили датасет с экспертной оценкой о качестве блазонов и смогли визуализировать полученные данные

По экспертной оценке Gemini - однозначный лидер!
Сравнение экспертной оценки и оценки с помощью косинусной близости

Выяснили, насколько совпали наши метрики. Для этого сделали несколько визуализаций
Выводы:
  • Корреляция Спирмена высокая для большинства гербов
  • Оценки разошлись там, где разница между метрикой косинусного расстояния в численных значениях была очень небольшой (например, в случае Елизовского района или герба Василевского)
  • Косинусная близость может использоваться как валидная метрика
Выявление модели ИИ, наиболее эффективно справляющейся с задачей блазонирования
Взяли в качестве критериев оценки эффективности нормализованные:
  1. Среднюю оценку эксперта
  2. Среднюю косинусную близость
  3. Количество первых мест в экспертной оценке
  4. Количество первых по косинусной близости
  5. Согласованность оценок между экспертными оценками и метрикой косинусной близости
В этом турнире победу одержал Gemini!

КОМАНДА
  • Татьяна Фомичева
    Куратор проекта, специалист по геральдике
  • Елена Михалькова
    Технический куратор проекта
  • Валерия Васильева
    Студентка ДПО программы ПАНДАН
  • Анна Пиотровская
    Студентка 1 курса магистратуры программы ПАНДАН
Также благодарим Екатерину Глазкову (Яндекс) за помощь в начале проекта
Made on
Tilda