Разработка AI-системы социального прослушивания упоминаний и трендов
Social listening — мониторинг упоминаний бренда, продукта, персон и тем в социальных сетях, форумах и СМИ с последующим анализом тональности, охватов и трендов. Отличие от базового мониторинга — понимание контекста и инсайты, а не просто счётчик упоминаний.
Источники и парсинг
ВКонтакте: VK API (wall.search, newsfeed.search) — посты, комментарии, репосты. Ограничения: 5 запросов/сек, глубина архива — 90 дней для бесплатного API.
Telegram: публичные каналы и группы через TDLib (неофициально) или Telethon. Сторонние агрегаторы — TGStat API.
Одноклассники: OK API с ограниченным поиском.
Форумы и отзовики: Otzovik, IRecommend, Яндекс.Маркет, Google Reviews, 2GIS — парсинг с соблюдением robots.txt и rate limits.
СМИ: NewsAPI, RSS-агрегаторы, парсинг новостных сайтов.
Система мониторинга в реальном времени
class SocialListeningSystem:
def __init__(self, brand_profile: BrandProfile):
self.brand_profile = brand_profile
self.sentiment_model = load_sentiment_model("ru")
self.mention_extractor = MentionExtractor(brand_profile)
async def process_stream(self, post: SocialPost) -> MentionEvent | None:
# Проверка релевантности: упоминание бренда или ключевых слов
if not self.mention_extractor.is_relevant(post.text):
return None
# Анализ тональности с аспектной разбивкой
sentiment = self.sentiment_model.analyze(post.text)
aspects = self.extract_aspects(post.text, self.brand_profile.aspect_list)
# Оценка охвата и виральности
reach = estimate_reach(post)
mention = MentionEvent(
source=post.source,
url=post.url,
text=post.text,
author=post.author,
published_at=post.published_at,
sentiment=sentiment.label,
sentiment_score=sentiment.score,
aspects=aspects,
reach=reach,
priority=self.calculate_priority(sentiment, reach),
requires_response=self.needs_response(sentiment, post)
)
# Высокоприоритетные упоминания — немедленное уведомление
if mention.priority == "P1":
await self.alert_team(mention)
return mention
def needs_response(self, sentiment, post) -> bool:
# Негативные отзывы с вопросом или жалобой требуют ответа
return (sentiment.label == "negative"
and (post.has_question or post.is_complaint)
and post.author_followers > 100)
Аспектный анализ упоминаний
Общий sentiment «негативный» — мало информации. Аспектный анализ показывает: что именно критикуют. Для e-commerce: доставка, качество товара, служба поддержки, цены. Для банка: мобильное приложение, кредитные условия, отделения, конкретные продукты.
class AspectMention(BaseModel):
aspect: str
sentiment: str # positive / negative / neutral
quoted_text: str # цитата из оригинала
def extract_aspects(text: str, aspect_list: list[str]) -> list[AspectMention]:
prompt = f"""Проанализируй тональность текста по каждому аспекту.
Аспекты: {', '.join(aspect_list)}
Текст: {text}
Для каждого упомянутого аспекта укажи тональность и цитату."""
return llm.parse(prompt, response_format=list[AspectMention])
Обнаружение трендов
Тренды — аномальный рост числа упоминаний темы или изменение тональности. Алерты срабатывают при:
- Рост упоминаний > 3σ за последние 2 часа (кризисный паттерн)
- Резкое смещение sentiment в негативную сторону
- Вирусный пост с упоминанием бренда (охват > 100k)
Алгоритм: скользящее среднее + Z-score для детекции аномалий, ADTK (Anomaly Detection Toolkit) для временных рядов.
Конкурентное сравнение
Параллельный мониторинг конкурентов даёт relative sentiment — не просто «нас ругают», а «нас ругают меньше/больше конкурентов». Share of Voice: доля упоминаний бренда в общем числе упоминаний категории.
Дашборд и отчётность
Метрики в реальном времени: число упоминаний (сегодня vs вчера), sentiment распределение, топ-10 источников по охвату, динамика по аспектам. Еженедельный автоматический отчёт с executive summary, ключевыми инсайтами и рекомендациями для команды коммуникаций.







