# Нормализация тегов

## Команды

### `tags:normalize`

Нормализует все теги пользователей согласно текущей логике системы.

#### Использование

```bash
# Нормализация всех пользователей
php artisan tags:normalize

# Нормализация конкретного пользователя
php artisan tags:normalize --user-id=1

# Предварительный просмотр без изменений
php artisan tags:normalize --dry-run
```

#### Что делает команда

1. **Анализ существующих тегов** - собирает все теги пользователя
2. **AI-анализ алиасов** - использует ИИ для поиска похожих тегов и предложения объединений
3. **Нормализация имен** - приводит названия к единому формату
4. **Объединение дубликатов** - удаляет повторяющиеся теги
5. **Обновление связей** - корректирует связи между ссылками и тегами

#### AI-функции

Команда использует `TagAnalysisService` для:

- **Поиска алиасов** - предлагает объединить похожие теги
- **Семантического анализа** - группирует теги по смыслу
- **Предложения канонических названий** - рекомендует лучшие варианты

#### Примеры AI-анализа

```bash
php artisan tags:normalize --user-id=1

🤖 AI-анализ тегов пользователя 1...
📊 Найдено потенциальных алиасов:

Группа 1: Технологии
  - #AI → #искусственный интеллект, #ИИ, #artificial intelligence
  - #ML → #машинное обучение, #machine learning

Группа 2: Веб-разработка
  - #Laravel → #фреймворк, #PHP, #веб
  - #React → #фронтенд, #JavaScript, #UI

Применить AI-предложения по объединению тегов? (yes/no) [no]:
```

### `tags:merge-ai`

Объединяет все AI-теги в один канонический тег `#AI`.

#### Использование

```bash
# Объединение AI-тегов для всех пользователей
php artisan tags:merge-ai

# Объединение для конкретного пользователя
php artisan tags:merge-ai --user-id=1

# Предварительный просмотр без изменений
php artisan tags:merge-ai --dry-run
```

#### Что делает команда

1. **Поиск AI-тегов** - находит теги по паттернам:
   - `искусственный интеллект`
   - `искусственныйинтеллект`
   - `ИИ`
   - `AI`
   - `ai`
   - `artificial intelligence`
   - `artificialintelligence`

2. **Создание канонического тега** - создает или находит тег `#AI`

3. **Обновление связей** - переносит все связи со старых тегов на `#AI`

4. **Удаление дубликатов** - удаляет старые варианты тегов

#### Пример работы

```bash
php artisan tags:merge-ai --user-id=1

🤖 Объединение AI-тегов в канонический #AI...

👤 Пользователь 1 (user@example.com)
   Найдено AI-тегов: 3
   📝 #искусственный интеллект → #AI
   📝 #ИИ → #AI
   📝 #AI-Driven разработка → #AI
   ✅ Объединено: 3 тегов, обновлено связей: 5

🎉 ОБЪЕДИНЕНИЕ ЗАВЕРШЕНО!
Всего объединено тегов: 3
Пользователей обработано: 1
```

## Логика работы

### Автоматическое обнаружение алиасов

Система автоматически определяет похожие теги и предлагает их объединение:

- **Точное совпадение** - `#AI` и `#ai` → `#AI`
- **Семантическое сходство** - `#искусственный интеллект` и `#ИИ` → `#AI`
- **Английские варианты** - `#artificial intelligence` → `#AI`

### Нормализация имен

Все теги приводятся к единому формату:

- **Хештег** - добавляется `#` если отсутствует
- **Регистр** - первая буква заглавная
- **Пробелы** - лишние пробелы удаляются
- **Спецсимволы** - недопустимые символы заменяются пробелами

### Объединение дубликатов

Система находит и объединяет дублирующиеся теги:

1. **Поиск дубликатов** - по нормализованному имени
2. **Выбор канонического** - определяется по приоритету
3. **Обновление связей** - все ссылки переносятся на канонический тег
4. **Удаление дубликатов** - старые теги удаляются

## Конфигурация

### Стоп-слова

В `config/tags.php` можно настроить стоп-слова для исключения:

```php
'stopwords' => [
    'and', 'the', 'of', 'for', 'to', 'a', 'an', 'in', 'on',
    'wood' // доменные примерные стоп-слова
],
```

### Алиасы

Можно настроить ручные алиасы для принудительного объединения:

```php
'aliases' => [
    'AI' => [
        'искусственный интеллект',
        'ИИ',
        'artificial intelligence',
    ],
    'Slab Flattening' => [
        'Router Sled',
        'Wood Slab Flattening',
    ],
],
```

## Безопасность

### Режим предварительного просмотра

Всегда используйте `--dry-run` для проверки изменений:

```bash
php artisan tags:normalize --dry-run
php artisan tags:merge-ai --dry-run
```

### Логирование

Все операции логируются:

- **Успешные изменения** - количество обработанных тегов
- **Ошибки** - детали проблем с указанием тега и пользователя
- **AI-сбои** - информация о проблемах с ИИ-сервисом

### Транзакции

Критические операции выполняются в транзакциях:

- **Обновление связей** - атомарное изменение pivot таблицы
- **Удаление тегов** - только после успешного обновления связей

## Мониторинг

### Проверка состояния

```bash
# Статистика тегов
php artisan tinker --execute="echo 'Всего тегов: ' . \App\Models\Tag::count(); echo 'Пользователей с тегами: ' . \App\Models\Tag::distinct('user_id')->count();"

# Теги конкретного пользователя
php artisan tinker --execute="\$user = \App\Models\User::find(1); echo 'Теги пользователя: ' . \$user->tags->pluck('name')->implode(', ');"
```

### Очистка

```bash
# Удаление неиспользуемых тегов
php artisan tinker --execute="\$unused = \App\Models\Tag::doesntHave('links')->delete(); echo 'Удалено неиспользуемых тегов: ' . \$unused;"
```

## Troubleshooting

### Частые проблемы

1. **AI-сервис недоступен**
   - Проверьте настройки OpenRouter API
   - Убедитесь в наличии API ключа
   - Проверьте лимиты запросов

2. **Ошибки нормализации**
   - Проверьте права доступа к файлам
   - Убедитесь в корректности конфигурации
   - Проверьте логи Laravel

3. **Проблемы с базой данных**
   - Проверьте миграции
   - Убедитесь в корректности связей
   - Проверьте индексы

### Восстановление

```bash
# Откат последних изменений (если есть backup)
php artisan migrate:rollback

# Пересоздание тегов из ссылок
php artisan tinker --execute="\App\Models\Link::with('tags')->chunk(100, function(\$links) { foreach(\$links as \$link) { if(\$link->tags->isEmpty()) { \$link->processAi(); } } });"
```
