Sentiment analysis (анализ тональности) — это задача определения эмоциональной окраски текста: положительный, отрицательный или нейтральный. С помощью AI API через ModelSwitch можно построить систему, которая автоматически анализирует тысячи отзывов, выделяет ключевые темы и помогает принимать бизнес-решения на основе данных.
Базовый анализ тональности
Начнём с простой классификации отзывов. Используем structured output для получения результата в формате JSON:
from openai import OpenAI
import json
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
def analyze_sentiment(review: str) -> dict:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": """Проанализируй отзыв клиента. Верни JSON:
{
"sentiment": "positive" | "negative" | "neutral",
"score": 0.0-1.0,
"topics": ["тема1", "тема2"],
"summary": "краткое резюме в 1 предложение"
}
Верни ТОЛЬКО валидный JSON, без markdown."""},
{"role": "user", "content": review}
],
temperature=0.1
)
return json.loads(response.choices[0].message.content)
# Пример
result = analyze_sentiment(
"Заказ пришёл на день раньше, упаковка отличная. "
"Но зарядка не подошла к телефону, пришлось покупать отдельно."
)
# {"sentiment": "neutral", "score": 0.55,
# "topics": ["доставка", "упаковка", "комплектация"],
# "summary": "Быстрая доставка и хорошая упаковка, но проблема с совместимостью зарядки."}
Пакетный анализ массива отзывов
Для обработки большого количества отзывов используйте пакетный подход — отправляйте несколько отзывов в одном запросе для экономии токенов:
import asyncio
from openai import AsyncOpenAI
async_client = AsyncOpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key="msk_ваш_ключ"
)
async def analyze_batch(reviews: list[str], batch_size: int = 5) -> list[dict]:
results = []
for i in range(0, len(reviews), batch_size):
batch = reviews[i:i + batch_size]
numbered = "
".join(f"{j+1}. {r}" for j, r in enumerate(batch))
response = await async_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": (
"Проанализируй каждый отзыв. Верни JSON-массив объектов "
"с полями: index, sentiment, score, topics, summary."
)},
{"role": "user", "content": numbered}
],
temperature=0.1
)
batch_results = json.loads(response.choices[0].message.content)
results.extend(batch_results)
return results
# Запуск
reviews = ["Отличный товар!", "Ужасное качество", "Нормально, но дорого", ...]
results = asyncio.run(analyze_batch(reviews))
Извлечение тем и трендов
После накопления данных можно выделять тренды — какие аспекты продукта чаще всего вызывают негатив:
from collections import Counter
def extract_trends(analyses: list[dict]) -> dict:
negative_topics = []
positive_topics = []
for item in analyses:
if item["sentiment"] == "negative":
negative_topics.extend(item["topics"])
elif item["sentiment"] == "positive":
positive_topics.extend(item["topics"])
return {
"top_negative": Counter(negative_topics).most_common(10),
"top_positive": Counter(positive_topics).most_common(10),
"avg_score": sum(i["score"] for i in analyses) / len(analyses)
}
trends = extract_trends(results)
# {"top_negative": [("доставка", 45), ("качество", 32), ...],
# "top_positive": [("цена", 89), ("удобство", 67), ...],
# "avg_score": 0.72}
Стоимость и масштабирование
Расчёт стоимости анализа отзывов через ModelSwitch:
| Объём | Модель | Примерная стоимость |
|---|---|---|
| 100 отзывов/день | gpt-4o-mini | ~$0.05/день |
| 1 000 отзывов/день | gpt-4o-mini | ~$0.50/день |
| 10 000 отзывов/день | gpt-4o-mini | ~$5/день |
Для повышения точности на специфических доменах (медицина, юриспруденция) можно использовать gpt-4o или claude-3.5-sonnet — они дороже, но дают более точную классификацию. ModelSwitch позволяет легко переключаться между моделями, изменив один параметр в запросе.
Автоматический анализ отзывов с AI — это доступный инструмент для любого бизнеса с онлайн-присутствием. Подключите ModelSwitch API и начните получать аналитику за считанные минуты.