lsdf's picture
Initial commit: SEO AI Editor MVP with BERT, BM25 and N-gram analysis
e0ad138

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

Тело запроса:

{
  "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

{
  "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:

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:

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:

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 прямо в браузере
  • Видеть схемы данных
  • Просматривать примеры запросов и ответов