Spaces:
Sleeping
Sleeping
File size: 9,025 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 | # API Документация
## Обзор
SEO AI Editor предоставляет REST API для анализа текстов. API построен на FastAPI и автоматически генерирует интерактивную документацию.
## Базовый URL
```
http://127.0.0.1:8001
```
## Endpoints
### GET `/`
Возвращает главную страницу приложения (HTML).
**Ответ:** HTML страница с интерфейсом
---
### POST `/analyze`
Выполняет комплексный анализ текста с использованием N-грамм, BM25 и BERT.
#### Запрос
**Content-Type:** `application/json`
**Тело запроса:**
```json
{
"target_text": "string (обязательно)",
"competitors": ["string"] (обязательно, может быть пустым массивом),
"keywords": ["string"] (обязательно, может быть пустым массивом),
"language": "string" (опционально, по умолчанию "en")
}
```
**Параметры:**
| Параметр | Тип | Обязательный | Описание |
|----------|-----|--------------|----------|
| `target_text` | string | Да | Текст пользователя для анализа |
| `competitors` | array[string] | Да | Массив текстов конкурентов |
| `keywords` | array[string] | Да | Массив ключевых фраз (каждая фраза - отдельный элемент) |
| `language` | string | Нет | Код языка: `en`, `ru`, `de`, `es`, `it` |
#### Ответ
**Статус:** 200 OK
**Content-Type:** `application/json`
```json
{
"ngram_stats": {
"unigrams": [
{
"ngram": "string",
"target_count": 0,
"competitor_avg": 0.0
}
],
"bigrams": [...],
"trigrams": [...],
"quadgrams": [...]
},
"bm25_recommendations": [
{
"word": "string",
"type": "1-gram" | "2-gram" | "3-gram",
"my_score": 0.0,
"avg_comp_score": 0.0,
"action": "ok" | "add" | "remove",
"count": 0
}
],
"bert_analysis": {
"global_scores": [
{
"name": "string",
"score": 0.0,
"is_me": true
}
],
"detailed": [
{
"phrase": "string",
"my_max_score": 0.0,
"comp_max_score": 0.0,
"status": "ok" | "good" | "warning" | "bad",
"recommendation": "string",
"my_top_chunks": [
{
"text": "string",
"score": 0.0
}
],
"comp_top_chunks": [
{
"text": "string",
"score": 0.0,
"source": "string"
}
]
}
]
}
}
```
#### Структура ответа
##### ngram_stats
Статистика по N-граммам (1-4 слова).
**Поля:**
- `ngram` - текст N-граммы (лемматизированный)
- `target_count` - количество вхождений в целевом тексте
- `competitor_avg` - среднее количество вхождений у конкурентов
**Сортировка:** По максимальному значению (target_count или competitor_avg)
##### bm25_recommendations
Рекомендации по оптимизации частоты слов/фраз с использованием алгоритма BM25.
**Особенности алгоритма:**
- **Полная декомпозиция фраз**: Каждая ключевая фраза автоматически разбивается на все возможные под-н-граммы длиной от 1 до 3 слов
- Пример: фраза "chicken road casino" анализируется как:
- Униграммы: "chicken", "road", "casino"
- Биграммы: "chicken road", "road casino"
- Триграммы: "chicken road casino"
- Это позволяет находить не только точные совпадения, но и частичные вхождения ключевых фраз
- Дубликаты автоматически удаляются
**Поля:**
- `word` - слово или фраза (лемматизированная)
- `type` - тип: "1-gram", "2-gram", "3-gram"
- `my_score` - BM25 score в целевом тексте
- `avg_comp_score` - средний BM25 score у конкурентов
- `action` - рекомендуемое действие:
- `"ok"` - частота в норме
- `"add"` - нужно добавить (ваш score ниже среднего конкурентов)
- `"remove"` - нужно убрать (ваш score значительно выше среднего конкурентов)
- `count` - рекомендуемое количество добавлений/удалений (рассчитывается на основе разницы скоров)
**Пороги для действий:**
- Униграммы: порог 0.5
- Биграммы: порог 0.25
- Триграммы: порог 0.15
**Сортировка:**
1. Сначала проблемные рекомендации (add/remove)
2. Затем по длине фразы (длинные фразы важнее)
3. Затем алфавитно
##### bert_analysis
Семантический анализ с использованием BERT.
**global_scores:**
- `name` - название текста ("Мой текст" или "Конкурент #N")
- `score` - средний максимальный score по всем ключевым фразам (0.0 - 1.0)
- `is_me` - флаг, является ли это целевым текстом
**detailed:**
Для каждой ключевой фразы:
- `phrase` - исходная ключевая фраза
- `my_max_score` - максимальный score в целевом тексте (0.0 - 1.0)
- `comp_max_score` - максимальный score у конкурентов
- `status` - статус:
- `"good"` - score >= 0.7
- `"ok"` - 0.5 <= score < 0.7
- `"warning"` - score < 0.5 или конкуренты лучше на 0.1+
- `"bad"` - score < 0.5
- `recommendation` - текстовое описание рекомендации
- `my_top_chunks` - топ-5 наиболее релевантных предложений из целевого текста
- `comp_top_chunks` - топ-5 наиболее релевантных предложений у конкурентов (с указанием источника)
#### Примеры запросов
**cURL:**
```bash
curl -X POST "http://127.0.0.1:8001/analyze" \
-H "Content-Type: application/json" \
-d '{
"target_text": "Это мой текст для анализа SEO.",
"competitors": ["Текст конкурента номер один.", "Текст конкурента номер два."],
"keywords": ["SEO анализ", "текст"],
"language": "ru"
}'
```
**Python:**
```python
import requests
response = requests.post(
"http://127.0.0.1:8001/analyze",
json={
"target_text": "Это мой текст для анализа SEO.",
"competitors": ["Текст конкурента номер один.", "Текст конкурента номер два."],
"keywords": ["SEO анализ", "текст"],
"language": "ru"
}
)
data = response.json()
print(data)
```
**JavaScript:**
```javascript
fetch('http://127.0.0.1:8001/analyze', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
target_text: "Это мой текст для анализа SEO.",
competitors: ["Текст конкурента номер один.", "Текст конкурента номер два."],
keywords: ["SEO анализ", "текст"],
language: "ru"
})
})
.then(response => response.json())
.then(data => console.log(data));
```
#### Ошибки
**400 Bad Request**
Неверный формат запроса или отсутствуют обязательные поля.
**422 Unprocessable Entity**
Ошибка валидации данных (например, неверный код языка).
**500 Internal Server Error**
Внутренняя ошибка сервера (проблемы с моделями, памятью и т.д.).
## Интерактивная документация
После запуска приложения доступны:
- **Swagger UI**: `http://127.0.0.1:8001/docs`
- **ReDoc**: `http://127.0.0.1:8001/redoc`
Эти интерфейсы позволяют:
- Просматривать все endpoints
- Тестировать API прямо в браузере
- Видеть схемы данных
- Просматривать примеры запросов и ответов
|