Автоматическая оценка качества HTML-макетов с помощью машинного обучения
Анализатор качества макетов — это интеллектуальная система для автоматической классификации HTML-макетов (веб-страниц, презентаций, email-шаблонов) на категории «хорошие» и «плохие».
Проект анализирует HTML-код и извлекает более 100+ признаков, включая:
- 🏗️ Структурные — количество тегов, ссылок, плотность элементов
- 🎨 Стилевые — размеры шрифтов, отступы, повороты, цвета
- 📝 Текстовые — объём контента, распределение текста
Для классификации применяются современные алгоритмы машинного обучения: Random Forest, Gradient Boosting, Logistic Regression и KNN.
| Модель | Accuracy | Precision | Recall | F1-score | ROC-AUC |
|---|---|---|---|---|---|
| Random Forest | 0.97 | 0.97 | 0.97 | 0.97 | 0.99 |
| Gradient Boosting | 0.97 | 0.97 | 0.97 | 0.97 | 1.00 |
| Logistic Regression | 0.89 | 0.88 | 0.89 | 0.88 | 0.95 |
| KNN | 0.85 | 0.84 | 0.85 | 0.84 | 0.92 |
💡 Почему такие высокие метрики?
Тщательно спроектированные признаки позволяют моделям чётко разделять классы даже на небольшой выборке (120 макетов). Ансамблевые методы показывают наилучшую стабильность при кросс-валидации.
Модель определяет качество макета на основе следующих характеристик:
| Признак | Описание | Важность (RF) |
|---|---|---|
link_count |
Количество ссылок <a> на странице |
27.9% |
width_min |
Минимальная ширина элементов (px) | 20.6% |
total_text_length |
Общий объём текстового содержимого | 17.0% |
font-size_mean |
Средний размер шрифта (px) | 16.6% |
height_mean |
Средняя высота элементов (px) | 8.2% |
rotate_mean |
Средний угол поворота элементов (deg) | 4.9% |
line-height_mean |
Средний межстрочный интервал | 4.7% |
entity_count— количество контентных блоковabsolute_position_count— использование абсолютного позиционированияborder_radius_count— наличие скругленийunique_colors— разнообразие цветовой палитрыpadding_count,background_count— характеристики оформленияhas_default_entity— наличие элементов по умолчанию- И многие другие CSS-свойства (height, width, font-size, color, transform...)
layout-quality-analyzer/
│
├── 📂 data/
│ ├── raw/
│ │ ├── good.json # HTML-код «хороших» макетов (60 шт.)
│ │ └── bad.json # HTML-код «плохих» макетов (60 шт.)
│ └── processed/
│ └── features.csv # Извлечённые признаки
│
├── 📂 src/
│ ├── __init__.py
│ ├── data_loader.py # Загрузка и декодирование JSON
│ ├── feature_extractor.py # Извлечение 100+ признаков из HTML
│ ├── preprocessing.py # Очистка, удаление корреляций, стандартизация
│ ├── model.py # Конфигурация моделей ML
│ ├── train.py # Обучение и кросс-валидация
│ ├── evaluation.py # Расчёт метрик, важность признаков
│ └── visualization.py # Графики: боксплоты, heatmap, importance
│
├── 📂 notebooks/
│ └── Untitled24.ipynb # Полное EDA, визуализация, эксперименты
│
├── 📄 requirements.txt # Зависимости Python
├── 📄 main.py # Точка входа: запуск пайплайна
├── 📄 Dockerfile # Контейнеризация проекта
├── 📄 .dockerignore
├── 📄 .gitignore
└── 📄 README.md # Этот файл
graph LR
A[JSON файлы] --> B[Декодирование HTML]
B --> C[Извлечение признаков]
C --> D[Очистка данных]
D --> E[Стандартизация]
E --> F[Обучение моделей]
F --> G[Оценка качества]
G --> H[Визуализация результатов]
-
Загрузка данных
Чтение JSON-файлов с HTML-контентом макетов -
Декодирование HTML
Преобразование HTML-сущностей (<,>,") в читаемый формат -
Извлечение признаков
- Парсинг HTML через BeautifulSoup
- Анализ структуры (теги, ссылки, блоки)
- Извлечение CSS-свойств (размеры, цвета, отступы)
- Расчёт статистик (min, max, mean, var)
-
Предобработка
- Удаление дублирующихся признаков
- Фильтрация сильно коррелирующих переменных (|corr| > 0.9)
- Стандартизация числовых признаков (StandardScaler)
-
Обучение моделей
- Train/Test split (80/20)
- 5-fold кросс-валидация
- 4 модели: RF, GB, LR, KNN
-
Оценка и визуализация
- Метрики: Accuracy, Precision, Recall, F1, ROC-AUC
- Feature Importance анализ
- Boxplot распределений признаков
- Heatmap корреляций
# Клонируем репозиторий
git clone https://github.com/oliviadebirs/layout-quality-analyzer.git
cd layout-quality-analyzer
# Создаём виртуальное окружение
python -m venv venv
# Активируем (Linux/Mac)
source venv/bin/activate
# Или (Windows)
venv\Scripts\activate
# Устанавливаем зависимости
pip install -r requirements.txt
# Запускаем пайплайн
python main.py# Клонируем репозиторий
git clone https://github.com/oliviadebirs/layout-quality-analyzer.git
cd layout-quality-analyzer
# Собираем образ
docker build -t layout-analyzer .
# Запускаем контейнер
docker run --rm layout-analyzerОсновные библиотеки:
| Библиотека | Назначение |
|---|---|
pandas, numpy |
Работа с данными |
beautifulsoup4 |
Парсинг HTML |
scikit-learn |
Модели машинного обучения |
matplotlib, seaborn, plotly |
Визуализация |
jupyter |
Интерактивные ноутбуки |
Полный список в requirements.txt.
✅ Чёткая структура
✅ Сбалансированное использование пространства
✅ Гармоничные размеры элементов
✅ Оптимальное количество ссылок
❌ Хаотичная компоновка
❌ Экстремальные значения размеров
❌ Недостаток/переизбыток контента
❌ Проблемы с читаемостью
📌 Презентации макетов доступны по запросу.
В проекте доступен подробный ноутбук Untitled24.ipynb, содержащий:
- 📈 Разведочный анализ данных (EDA)
- 🔬 Детальный анализ признаков
- 📉 Визуализацию распределений (boxplots)
- 🔥 Heatmap корреляций
- 🎯 Анализ важности признаков (Feature Importance)
- 📊 Сравнение моделей
- 💬 Интерпретацию результатов
-
Ансамблевые методы (Random Forest, Gradient Boosting) показывают наилучшие результаты (~97% accuracy) благодаря способности улавливать сложные нелинейные зависимости между признаками.
-
Ключевые факторы качества:
- Количество ссылок (
link_count) — наиболее значимый признак - Минимальная ширина элементов (
width_min) — важный структурный параметр - Объём текста (
total_text_length) — показатель наполненности макета - Размер шрифта (
font-size_mean) — влияет на читаемость
- Количество ссылок (
-
Декоративные признаки (повороты, line-height) имеют второстепенное значение, что логично для задачи оценки базового качества компоновки.
-
Высокие метрики объясняются:
- Информативностью извлечённых признаков
- Чёткой разделимостью классов в датасете
- Корректной предобработкой данных
Проект открыт для улучшений! Вы можете:
- Предложить новые признаки для анализа
- Добавить дополнительные модели (XGBoost, LightGBM, нейросети)
- Улучшить визуализацию результатов
- Расширить датасет новыми макетами
MIT License — свободное использование с указанием авторства.
Olivia Debirs
GitHub
Если проект оказался полезным — поставьте ⭐ на GitHub!