File size: 12,091 Bytes
e0ad138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# Архитектура проекта

## Обзор

SEO AI Editor построен на архитектуре клиент-сервер с использованием FastAPI для backend и простого HTML/JavaScript для frontend.

## Структура проекта

```
seo_ai_editor/
├── main.py              # Точка входа, FastAPI приложение
├── logic.py             # Бизнес-логика и алгоритмы анализа
├── models.py            # Pydantic модели данных
├── requirements.txt     # Python зависимости
├── templates/
│   └── index.html       # Frontend интерфейс
├── docs/                # Документация
│   ├── API.md
│   ├── ARCHITECTURE.md
│   └── DEVELOPMENT.md
└── README.md            # Основная документация
```

## Компоненты системы

### 1. Backend (FastAPI)

#### `main.py` - Веб-сервер

**Ответственность:**
- Инициализация FastAPI приложения
- Роутинг HTTP запросов
- Предзагрузка моделей при старте
- Обработка запросов и формирование ответов

**Ключевые функции:**
- `startup_event()` - загрузка моделей при старте
- `read_root()` - отдача главной страницы
- `analyze_text()` - обработка запроса на анализ

#### `logic.py` - Бизнес-логика

Разделен на три модуля:

##### A. SPACY (Лингвистический анализ)

**Модели:**
- Глобальный словарь `LoadedModels` для кэширования загруженных spaCy моделей
- Поддержка 5 языков: en, ru, de, es, it

**Функции:**
- `load_model_if_missing(lang)` - ленивая загрузка моделей
- `load_models()` - предзагрузка всех моделей
- `get_doc(text, lang)` - получение spaCy документа
- `is_valid_token(t)` - фильтрация токенов (удаление мусора)
- `get_lemmas_flat(text, lang)` - получение списка лемм
- `generate_ngrams_safe(text, lang, n)` - генерация N-грамм с умной фильтрацией

**Особенности:**
- Сохранение стоп-слов внутри фраз для читаемости
- Фильтрация N-грамм, состоящих только из стоп-слов
- Обработка больших текстов (max_length = 2,000,000)

##### B. ANALYTICS (N-граммы и BM25)

**Функции:**
- `calculate_ngram_stats()` - статистика по N-граммам (1-4)
- `parse_keywords()` - парсинг ключевых фраз
- `calculate_bm25_recommendations()` - многоуровневый BM25 анализ

**Алгоритм BM25 (с полной декомпозицией фраз):**
1. **Декомпозиция ключевых фраз**: Для каждой ключевой фразы генерируются все возможные под-н-граммы длиной от 1 до 3 слов
   - Пример: фраза "chicken road casino" разбивается на:
     - Униграммы: "chicken", "road", "casino"
     - Биграммы: "chicken road", "road casino"
     - Триграммы: "chicken road casino"
   - Используется скользящее окно по токенам фразы
   - Дубликаты отслеживаются через set для оптимизации
2. Генерация N-грамм для целевого текста и конкурентов (униграммы, биграммы, триграммы)
3. Обучение BM25 модели на корпусе N-грамм для каждого уровня (1, 2, 3)
4. Расчет BM25 скоров для каждой декомпозированной фразы
5. Сравнение скоров целевого текста со средним скором конкурентов
6. Генерация рекомендаций (add/remove/ok) на основе пороговых значений
7. Сортировка результатов: сначала проблемные (add/remove), затем по длине фразы, затем алфавитно

**Пороги:**
- Униграммы: 0.5
- Биграммы: 0.25
- Триграммы: 0.15

**Особенности:**
- Полная декомпозиция позволяет анализировать не только целые фразы, но и их части
- Это особенно полезно для длинных ключевых фраз, которые могут встречаться в тексте частично
- Автоматическое удаление дубликатов при декомпозиции

##### C. BERT / VECTOR ANALYSIS

**Модель:**
- Глобальная переменная `BertModel` для кэширования
- Модель: `paraphrase-multilingual-MiniLM-L12-v2`
- Автоматическое определение устройства (CPU/GPU)

**Функции:**
- `get_bert_model()` - загрузка BERT модели
- `perform_bert_analysis()` - семантический анализ

**Алгоритм BERT анализа:**
1. Разбиение текстов на предложения (chunks)
2. Генерация эмбеддингов для всех chunks и ключевых фраз
3. Расчет косинусного сходства между ключевыми фразами и chunks
4. Global Score: средний максимальный score по всем ключам
5. Detailed Analysis: топ-5 наиболее релевантных chunks для каждой фразы

#### `models.py` - Модели данных

**Pydantic модели:**
- `AnalysisRequest` - входные данные для анализа
- `AnalysisResponse` - структура ответа API

### 2. Frontend

#### `templates/index.html`

**Технологии:**
- Bootstrap 5 для UI
- Vanilla JavaScript (без фреймворков)
- AJAX для взаимодействия с API

**Компоненты:**
- Форма ввода данных
- Табы для отображения результатов
- Динамическое добавление полей конкурентов
- Визуализация результатов анализа

## Поток данных

```
1. Пользователь вводит данные в форму

2. JavaScript собирает данные и отправляет POST /analyze

3. FastAPI получает запрос, валидирует через Pydantic

4. main.py вызывает функции из logic.py:
   - calculate_ngram_stats()
   - parse_keywords()
   - calculate_bm25_recommendations()
   - perform_bert_analysis()

5. Каждая функция использует:
   - spaCy для лингвистики
   - BM25 для частотного анализа
   - BERT для семантики

6. Результаты собираются в AnalysisResponse

7. JSON ответ отправляется клиенту

8. JavaScript рендерит результаты в UI
```

## Управление состоянием

### Backend

**Глобальные переменные:**
- `LoadedModels` - кэш загруженных spaCy моделей
- `BertModel` - кэш BERT модели

**Стратегия:**
- Модели загружаются один раз при первом использовании
- Предзагрузка spaCy моделей при старте (опционально)
- BERT модель загружается лениво при первом запросе

### Frontend

**Состояние:**
- `currentData` - последние результаты анализа
- DOM состояние для табов и форм

## Производительность

### Оптимизации

1. **Кэширование моделей:**
   - spaCy модели загружаются один раз
   - BERT модель загружается один раз

2. **Ленивая загрузка:**
   - spaCy модели загружаются только для используемых языков
   - BERT модель загружается при первом запросе

3. **GPU ускорение:**
   - Автоматическое использование CUDA для BERT
   - Значительное ускорение на GPU

4. **Ограничения:**
   - N-граммы ограничены 150 элементами на тип
   - Топ-5 chunks для BERT анализа

### Ограничения

- Максимальная длина текста для spaCy: 2,000,000 символов
- Память: зависит от размера моделей и длины текстов
- Время обработки: зависит от длины текстов и наличия GPU

## Масштабируемость

### Текущие ограничения

- Однопоточная обработка запросов
- Модели загружаются в память
- Нет кэширования результатов

### Возможные улучшения

1. **Асинхронность:**
   - Использование async/await для I/O операций
   - Параллельная обработка конкурентов

2. **Кэширование:**
   - Redis для кэширования результатов
   - Кэширование эмбеддингов

3. **Микросервисы:**
   - Отдельный сервис для BERT
   - Отдельный сервис для spaCy

4. **База данных:**
   - Сохранение истории анализов
   - Статистика использования

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

### Текущее состояние

- Нет аутентификации
- Нет ограничений на размер запросов
- Нет валидации входных данных (кроме Pydantic)

### Рекомендации

1. **Валидация:**
   - Ограничение размера текстов
   - Санитизация входных данных

2. **Аутентификация:**
   - API ключи
   - OAuth 2.0

3. **Rate Limiting:**
   - Ограничение количества запросов
   - Защита от DDoS

## Зависимости

### Критические

- `fastapi` - веб-фреймворк
- `spacy` - NLP библиотека
- `sentence-transformers` - BERT модели
- `rank-bm25` - BM25 алгоритм
- `torch` - глубокое обучение

### Вспомогательные

- `uvicorn` - ASGI сервер
- `pydantic` - валидация данных
- `jinja2` - шаблонизация
- `numpy` - численные вычисления

## Расширяемость

### Добавление нового языка

1. Установить spaCy модель для языка
2. Добавить в `MODEL_NAMES` в `logic.py`
3. Добавить опцию в UI (`templates/index.html`)

### Добавление новой модели BERT

1. Изменить модель в `get_bert_model()`
2. Убедиться в совместимости с `sentence-transformers`

### Добавление нового типа анализа

1. Создать функцию в `logic.py`
2. Добавить вызов в `analyze_text()` в `main.py`
3. Добавить поле в `AnalysisResponse`
4. Обновить UI для отображения результатов