Запросы по настроению сообщества и токсичности

Для тех, кто интересуется, как просмотреть базу данных результатов классификации для модулей «Community Sentiment» и «Toxicity», это можно сделать с помощью плагина Data Explorer и таблицы classification_results.

Это полезно для того, чтобы увидеть, как работает плагин ИИ на вашем сайте и как он классифицирует сообщения.

AI Sentiment

SELECT target_id as post_id,
model_used,
classification->'negative' as negative,
classification->'neutral' as neutral,
classification->'positive' as positive
from classification_results
WHERE model_used = 'sentiment'
order by id desc

AI Emotion:

SELECT target_id as post_id,
model_used,
classification->'neutral' as neutral,
classification->'sadness' as sadness,
classification->'surprise' as surprise,
classification->'fear' as fear,
classification->'anger' as anger,
classification->'joy' as joy,
classification->'disgust' as disgust
from classification_results
WHERE model_used = 'emotion'
order by id desc

AI Toxicity:

SELECT target_id as post_id,
classification->'toxicity' as toxicity,
classification->'severe_toxicity' as severe_toxicity,
classification->'obscene' as obscene,
classification->'identity_attack' as identity_attack,
classification->'insult' as insult,
classification->'threat' as threat,
classification->'sexual_explicit' as sexual_explicit
From classification_results
WHERE classification_type = 'toxicity'
order by id desc

Можно ли добавить фильтр к этому запросу, чтобы получать посты из конкретной ветки? Сейчас, похоже, извлекаются посты со всего сообщества, что удобно, но затрудняет поиск нужного поста или ветки, не говоря уже о том, что вы упрётесь в лимит строк для этого.

Привет @Samantha_O :wave:

Это работает для конкретных тем? Вам нужно указать ID темы в параметрах.

-- [params]
-- int :topic_id = 

SELECT cr.target_id as post_id,
cr.model_used,
cr.classification->'negative' as negative,
cr.classification->'neutral' as neutral,
cr.classification->'positive' as positive
FROM classification_results cr
JOIN posts p ON p.id = cr.target_id
WHERE cr.model_used = 'sentiment'
AND p.topic_id = :topic_id
ORDER BY cr.id DESC
-- [params]
-- topic_id :topic_id

SELECT 
    cr.target_id as post_id,
    cr.model_used,
    cr.classification->'negative' as negative,
    cr.classification->'neutral' as neutral,
    cr.classification->'positive' as positive
FROM classification_results cr
  JOIN posts p ON p.id = cr.target_id
WHERE cr.model_used = 'sentiment'
  AND p.topic_id = :topic_id
ORDER BY p.id

Ах, ты меня опередил. :slight_smile:

Но вот ещё один запрос для конкретного поста, чтобы ответ не казался пустой тратой времени:

-- [params]
-- topic_id :topic_id
-- int :post_number

SELECT 
    cr.target_id as post_id,
    cr.model_used,
    cr.classification->'negative' as negative,
    cr.classification->'neutral' as neutral,
    cr.classification->'positive' as positive
FROM classification_results cr
  JOIN posts p ON p.id = cr.target_id
WHERE cr.model_used = 'sentiment'
  AND p.topic_id = :topic_id
  AND p.post_number = :post_number

topic_id и post_number можно найти в URL, так что это довольно удобно для пользователя.

Topic_id:

https://meta.discourse.org/t/community-sentiment-and-toxicity-queries/275741/4

Post_number:

https://meta.discourse.org/t/community-sentiment-and-toxicity-queries/275741/4

Я думаю, что здесь должен использоваться идентификатор категории:

-- [params]
-- int :category_id = 

SELECT cr.target_id as post_id,
cr.model_used,
cr.classification->'negative' as negative,
cr.classification->'neutral' as neutral,
cr.classification->'positive' as positive
FROM classification_results cr
JOIN posts p ON p.id = cr.target_id
JOIN topics t ON t.id = p.topic_id
WHERE cr.model_used = 'sentiment'
AND t.category_id = :category_id
ORDER BY cr.id DESC

Спасибо вам обоим! Когда я запускаю это, старые темы/ID тем не находятся. Интересно, проводится ли анализ тональности только для новых постов?

отредактировано для ясности

@JammyDodger, вероятно, знает лучше, но да, я думаю, что анализ тональности работает с новыми постами. Чтобы заставить его обрабатывать старые посты, скорее всего, потребуются команды Rails для прогона их через модель анализа тональности и записи результатов в таблицу classification_results (туда же, куда попадают результаты анализа новых постов).

Это работает на новых постах, как только оно включено. :+1: Не уверен, есть ли опция заполнения задним числом для этого?

Только новые посты с этого момента. Мы можем рассмотреть возможность заполнения этой информации после того, как начнем отчетность по данным и подтвердим их достоверность.

Не мог бы кто-нибудь из вас (или другой гениальный специалист по запросам) помочь мне немного доработать это? Я хотел бы добавить параметры для дат, которые соответствовали бы дате публикации. Конечная цель — иметь возможность отслеживать изменения со временем, пока мы ждём, появится ли такая функция в панели управления в будущем :crossed_fingers:

Привет, Саманта,

Если ты хочешь уточнить эти запросы, добавив параметры даты начала и окончания, можно использовать такой запрос:

-- [params]
-- date :start_date = 2023-01-01
-- date :end_date = 2024-01-01

SELECT 
p.created_at,
cr.target_id as post_id,
cr.model_used,
cr.classification->'negative' as negative,
cr.classification->'neutral' as neutral,
cr.classification->'positive' as positive
FROM classification_results cr
JOIN posts p ON p.id = cr.target_id
WHERE cr.model_used = 'sentiment'
AND p.created_at BETWEEN :start_date AND :end_date
ORDER BY cr.id DESC

Пример результатов:

created_at post model_used negative neutral positive
2023-11-08T21:21:23.913Z post_id sentiment 58 38 2

Ключевое изменение здесь — соединение таблицы posts с таблицей classification_results, чтобы можно было добавить:

AND p.created_at BETWEEN :start_date AND :end_date

в условие WHERE для фильтрации записей по дате их создания (created_at).

Поскольку запросы для классификации по эмоциям (emotion) и токсичности (toxicity) аналогичны, ты можешь внести это же изменение и в них, чтобы также добавить параметры даты начала и окончания. :slightly_smiling_face:

Добавляю сюда и этот:

Я попробовал использовать этот запрос (настройка тональности у нас уже настроена), но он не возвращает никаких результатов. Что можно попробовать для устранения проблемы?

Я обновил руководства по ссылкам Dashboard Report - Overall Sentiment и Dashboard Report - Post Emotion. Попробуйте снова с обновленными запросами.