Для проекта были взяты не только старые, в том числе дворянские гербы, но и современные, созданные Гильдией геральдических художников
Немного об особенностях геральдического языка на примере трех блазонов разного времени
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')
Зачем нужно блазонирование при помощи ИИ?
Из каждого используемого нами источника взяли по три произвольных герба
Промт для больших языковых моделей
Оценка косинусной близости
между блазонами, взятыми за эталон и блазонами, сгенерированными моделями
Для всех блазонов провели стемминг
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