Это SQL-версия отчета панели управления для Post Emotion.
Для работы этого отчета необходимо включить плагины Discourse AI и Sentiment Analysis.
Этот отчет панели управления показывает количество сообщений, классифицированных по одному из следующих эмоций, сгруппированных по уровню доверия автора, в указанном диапазоне дат:
- Грусть
- Удивление
- Страх
- Гнев
- Радость
- Отвращение
- Восхищение
- Развлечение
- Раздражение
- Одобрение
- Забота
- Путаница
- Любопытство
- Желание
- Разочарование
- Непризнание
- Смущение
- Волнение
- Благодарность
- Печаль
- Любовь
- Тревожность
- Нейтральность
- Оптимизм
- Гордость
- Осознание
- Облегчение
- Раскаяние
-- [params]
-- date :start_date = 2024-01-16
-- date :end_date = 2024-02-16
-- double :threshold = 0.30
SELECT
u.trust_level AS trust_level,
-- Базовые эмоции из исходного запроса
COUNT(CASE WHEN (classification->>'sadness')::float > :threshold THEN 1 ELSE NULL END) AS sadness,
COUNT(CASE WHEN (classification->>'surprise')::float > :threshold THEN 1 ELSE NULL END) AS surprise,
COUNT(CASE WHEN (classification->>'fear')::float > :threshold THEN 1 ELSE NULL END) AS fear,
COUNT(CASE WHEN (classification->>'anger')::float > :threshold THEN 1 ELSE NULL END) AS anger,
COUNT(CASE WHEN (classification->>'joy')::float > :threshold THEN 1 ELSE NULL END) AS joy,
COUNT(CASE WHEN (classification->>'disgust')::float > :threshold THEN 1 ELSE NULL END) AS disgust,
-- Дополнительные эмоции из второго запроса
COUNT(CASE WHEN (classification->>'admiration')::float > :threshold THEN 1 ELSE NULL END) AS admiration,
COUNT(CASE WHEN (classification->>'amusement')::float > :threshold THEN 1 ELSE NULL END) AS amusement,
COUNT(CASE WHEN (classification->>'annoyance')::float > :threshold THEN 1 ELSE NULL END) AS annoyance,
COUNT(CASE WHEN (classification->>'approval')::float > :threshold THEN 1 ELSE NULL END) AS approval,
COUNT(CASE WHEN (classification->>'caring')::float > :threshold THEN 1 ELSE NULL END) AS caring,
COUNT(CASE WHEN (classification->>'confusion')::float > :threshold THEN 1 ELSE NULL END) AS confusion,
COUNT(CASE WHEN (classification->>'curiosity')::float > :threshold THEN 1 ELSE NULL END) AS curiosity,
COUNT(CASE WHEN (classification->>'desire')::float > :threshold THEN 1 ELSE NULL END) AS desire,
COUNT(CASE WHEN (classification->>'disappointment')::float > :threshold THEN 1 ELSE NULL END) AS disappointment,
COUNT(CASE WHEN (classification->>'disapproval')::float > :threshold THEN 1 ELSE NULL END) AS disapproval,
COUNT(CASE WHEN (classification->>'embarrassment')::float > :threshold THEN 1 ELSE NULL END) AS embarrassment,
COUNT(CASE WHEN (classification->>'excitement')::float > :threshold THEN 1 ELSE NULL END) AS excitement,
COUNT(CASE WHEN (classification->>'gratitude')::float > :threshold THEN 1 ELSE NULL END) AS gratitude,
COUNT(CASE WHEN (classification->>'grief')::float > :threshold THEN 1 ELSE NULL END) AS grief,
COUNT(CASE WHEN (classification->>'love')::float > :threshold THEN 1 ELSE NULL END) AS love,
COUNT(CASE WHEN (classification->>'nervousness')::float > :threshold THEN 1 ELSE NULL END) AS nervousness,
COUNT(CASE WHEN (classification->>'neutral')::float > :threshold THEN 1 ELSE NULL END) AS neutral,
COUNT(CASE WHEN (classification->>'optimism')::float > :threshold THEN 1 ELSE NULL END) AS optimism,
COUNT(CASE WHEN (classification->>'pride')::float > :threshold THEN 1 ELSE NULL END) AS pride,
COUNT(CASE WHEN (classification->>'realization')::float > :threshold THEN 1 ELSE NULL END) AS realization,
COUNT(CASE WHEN (classification->>'relief')::float > :threshold THEN 1 ELSE NULL END) AS relief,
COUNT(CASE WHEN (classification->>'remorse')::float > :threshold THEN 1 ELSE NULL END) AS remorse,
-- Общее количество сообщений с любой эмоцией выше порога
COUNT(*) AS total_posts,
-- Общее количество сообщений, где хотя бы одна эмоция выше порога
COUNT(CASE WHEN
(classification->>'sadness')::float > :threshold OR
(classification->>'surprise')::float > :threshold OR
(classification->>'fear')::float > :threshold OR
(classification->>'anger')::float > :threshold OR
(classification->>'joy')::float > :threshold OR
(classification->>'disgust')::float > :threshold OR
(classification->>'admiration')::float > :threshold OR
(classification->>'amusement')::float > :threshold OR
(classification->>'annoyance')::float > :threshold OR
(classification->>'approval')::float > :threshold OR
(classification->>'caring')::float > :threshold OR
(classification->>'confusion')::float > :threshold OR
(classification->>'curiosity')::float > :threshold OR
(classification->>'desire')::float > :threshold OR
(classification->>'disappointment')::float > :threshold OR
(classification->>'disapproval')::float > :threshold OR
(classification->>'embarrassment')::float > :threshold OR
(classification->>'excitement')::float > :threshold OR
(classification->>'gratitude')::float > :threshold OR
(classification->>'grief')::float > :threshold OR
(classification->>'love')::float > :threshold OR
(classification->>'nervousness')::float > :threshold OR
(classification->>'neutral')::float > :threshold OR
(classification->>'optimism')::float > :threshold OR
(classification->>'pride')::float > :threshold OR
(classification->>'realization')::float > :threshold OR
(classification->>'relief')::float > :threshold OR
(classification->>'remorse')::float > :threshold
THEN 1 ELSE NULL END) AS emotional_posts
FROM
classification_results AS cr
INNER JOIN posts p ON p.id = cr.target_id AND cr.target_type = 'Post'
INNER JOIN users u ON p.user_id = u.id
INNER JOIN topics t ON t.id = p.topic_id
WHERE
t.archetype = 'regular' AND
p.user_id > 0 AND
cr.model_used = 'SamLowe/roberta-base-go_emotions' AND
(p.created_at > :start_date AND p.created_at < :end_date)
GROUP BY
u.trust_level
ORDER BY
u.trust_level
Пояснение к SQL-запросу
SQL-запрос работает следующим образом:
- Определение параметров:
:start_dateи:end_dateдля указания диапазона дат анализа.:thresholdдля установки минимального порога классификации эмоциональной окраски сообщений. Значение по умолчанию для:thresholdустановлено на 0.30, чтобы соответствовать отчету панели управления.
- Выборка и соединение данных:
- Запрос выбирает данные из таблицы
classification_results, содержащей результаты модели классификации эмоций, примененной к сообщениям. - Он соединяет таблицу
classification_resultsс таблицейposts, чтобы отфильтровать только те классификации, которые относятся к сообщениям (cr.target_type = 'Post'). - Далее он соединяется с таблицами
usersиtopics, чтобы получить уровни доверия пользователей и убедиться, что сообщения относятся к обычным темам (а не к личным сообщениям или другим специальным типам).
- Запрос выбирает данные из таблицы
- Фильтрация:
- Запрос фильтрует сообщения, созданные в указанном диапазоне дат (
p.created_at > :start_date AND p.created_at < :end_date). - Он гарантирует, что сообщения относятся к обычным темам (
t.archetype = 'regular'), созданы зарегистрированными пользователями (p.user_id > 0) и конкретно направлены на эмоциональные классификации (cr.model_used = 'SamLowe/roberta-base-go_emotions').
- Запрос фильтрует сообщения, созданные в указанном диапазоне дат (
- Подсчет классификаций:
- Для каждой эмоции (грусть, удивление, страх, гнев, радость, отвращение) запрос подсчитывает количество сообщений, классифицированных с интенсивностью выше указанного порога (
:threshold).
- Для каждой эмоции (грусть, удивление, страх, гнев, радость, отвращение) запрос подсчитывает количество сообщений, классифицированных с интенсивностью выше указанного порога (
- Группировка: Результаты группируются по уровню доверия пользователей (
u.trust_level), предоставляя разбивку эмоционального контента по уровням доверия пользователей.
Пример результатов
| trust_level | sadness | surprise | fear | anger | joy | disgust | admiration | amusement | … | emotional_posts | total_posts |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 12 | 8 | 5 | 15 | 20 | 3 | 18 | 25 | … | 78 | 120 |
| 1 | 35 | 42 | 18 | 29 | 64 | 12 | 57 | 82 | … | 245 | 310 |
| 2 | 67 | 85 | 32 | 48 | 112 | 23 | 124 | 156 | … | 487 | 520 |
| 3 | 45 | 63 | 24 | 37 | 95 | 18 | 102 | 124 | … | 326 | 380 |
| 4 | 21 | 36 | 14 | 18 | 53 | 9 | 67 | 72 | … | 175 | 210 |