В качестве повышения собственного уровня в программировании я решил написать бота в Телеграм, который проводит тестирование по 5-Factor Model of Personality. Простыми словами, это тест, в котором участники отвечают в формате от «Полностью согласен» до «Полностью не согласен» на ~50 вопросов, на подобие «я душа компании» или «я часто беспокоюсь». На выходе, мы получаем результаты от 1 до 100 по пяти факторам — Открытость к опыту, Сознательность, Экстраверсия, Доброжелательность, Невротизм (эмоциональная стабильность).
Интерпретировать результаты можно таким нехитрым способом. Например, мы получаем 70 по экстраверсии — это означает, что, если бы в комнате находились 100 человек, расположенных в порядке возрастания их экстраверсии, то мы стояли бы на 70 месте. То есть, мы были бы более общительны, чем 70% людей в комнате. Надеюсь, что звучит нетрудно.
Думаю, что выбор языка python для написания бота в Телеграм является незамысловатым решением, так как большинство ботов написаны на питоне и обилие библиотек на питоне для работы с API Телеграм сильно упрощает работу и позволяет сконцентрироваться на предмете работы. Библиотеку использовал python-telegram-bot.
Правильность подсчета результатов является основой любого теста. Для данного бота я взял эти данные. Там содержатся более миллиона итогов прохождений данного тестирования другими людьми. Что нам нужно, это:
получить результаты для каждой записи из этой базы
посчитать показатели по каждому фактору
сохранить их
позже использовать как основу для подсчета результатов в Телеграм боте
Быстро пробегусь по каждому пункту.
import pickle as pkl
import numpy as np
import pandas as pd
pd.read_csv('data.csv')
Каждый вопрос добавляет баллы в зависимости от ответа (не согласен — 1, согласен — 5). Все ответы по каждому фактору суммируются и делятся на количество вопросов. Также, есть вопросы, которые нужно «нормализовать», то есть вычесть ответ из 6. Например, «я общителен» — ответ со значением 5, «я люблю одиночество» — 1. Здесь мы должны вычесть из 6 значение второго ответа, чтобы получить средний балл 5 по экстраверсии ().
С помощью библиотеки pickle, надо сделать dump данных, чтобы не высчитывать эти данные каждый раз при использовании бота.
model_file_name = 'test.pickle'
pkl.dump(df, open(model_file_name, 'wb'))
Высчитываем процентиль.
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.
Другие боты можно глянуть на моем сайте.
Спасибо за прочтение.