Pull to refresh

Пятифакторный тест личности — бот в Телеграм

Level of difficultyEasy
Reading time3 min
Views3.2K
5-Factor Model of Personality
5-Factor Model of Personality

В качестве повышения собственного уровня в программировании я решил написать бота в Телеграм, который проводит тестирование по 5-Factor Model of Personality. Простыми словами, это тест, в котором участники отвечают в формате от «Полностью согласен» до «Полностью не согласен» на ~50 вопросов, на подобие «я душа компании» или «я часто беспокоюсь». На выходе, мы получаем результаты от 1 до 100 по пяти факторам — Открытость к опыту, Сознательность, Экстраверсия, Доброжелательность, Невротизм (эмоциональная стабильность).

Интерпретировать результаты можно таким нехитрым способом. Например, мы получаем 70 по экстраверсии — это означает, что, если бы в комнате находились 100 человек, расположенных в порядке возрастания их экстраверсии, то мы стояли бы на 70 месте. То есть, мы были бы более общительны, чем 70% людей в комнате. Надеюсь, что звучит нетрудно.

Думаю, что выбор языка python для написания бота в Телеграм является незамысловатым решением, так как большинство ботов написаны на питоне и обилие библиотек на питоне для работы с API Телеграм сильно упрощает работу и позволяет сконцентрироваться на предмете работы. Библиотеку использовал python-telegram-bot.

Правильность подсчета результатов является основой любого теста. Для данного бота я взял эти данные. Там содержатся более миллиона итогов прохождений данного тестирования другими людьми. Что нам нужно, это:

  1. получить результаты для каждой записи из этой базы

  2. посчитать показатели по каждому фактору

  3. сохранить их

  4. позже использовать как основу для подсчета результатов в Телеграм боте

Быстро пробегусь по каждому пункту.

import pickle as pkl
import numpy as np
import pandas as pd
  1. pd.read_csv('data.csv')

  2. Каждый вопрос добавляет баллы в зависимости от ответа (не согласен — 1, согласен — 5). Все ответы по каждому фактору суммируются и делятся на количество вопросов. Также, есть вопросы, которые нужно «нормализовать», то есть вычесть ответ из 6. Например, «я общителен» — ответ со значением 5, «я люблю одиночество» — 1. Здесь мы должны вычесть из 6 значение второго ответа, чтобы получить средний балл 5 по экстраверсии ((5+5)/2).

  3. С помощью библиотеки pickle, надо сделать dump данных, чтобы не высчитывать эти данные каждый раз при использовании бота.

model_file_name = 'test.pickle'
pkl.dump(df, open(model_file_name, 'wb'))
  1. Высчитываем процентиль.

model_file_name = 'test.pickle'
df = pkl.load(open(model_file_name, 'rb'))

extraversion = pd.Series(df['extraversion'])

# по сути, мы повторяем пункт 2 для ответов пользователя
# случайные значения
user_values = [2.1, 3.2, 3.4, 4.1, 2.8]

# здесь мы берем первое значение (только для примера)
extraversion_quantile = (
  ((extraversion < user_values[0]).sum())/extraversion.count()
) * 100

Сама механика общения с ботом построена на ConversationHandler. Ответы сохраняются в контексте коллбэков, а по итогу, считаются средние значения пользователя и соотносятся со значениями с модели выше. Здесь я не буду вставлять код, но его можно посмотреть github.

Переводы вопросов, а также интерпретацию результатов, а именно, что означает высокий/средний/низкий показатель по тому или иному фактору, я доверил Chat-GPT.

Попробовать бота можно тут.

Другие боты можно глянуть на моем сайте.

Спасибо за прочтение.

Tags:
Hubs:
Total votes 4: ↑2 and ↓20
Comments6

Articles