Как показать релевантный текст для пользователя? Собрать данные, написать разные тексты, а потом написать кучу IF'ов?
В докладе я расскажу, как мы, в Welltory, делаем настройку контента под пользователя.
Поведаю о том, как content writer'ы могут писать 100 вариантов текстов на одно событие в системе.
И конечно, расскажу с чего начать вам.
Докладчик: Александр Сапронов
Видео: https://youtu.be/sG6kUxq6gDY
2. Хто я такой?
● Пишу код за деньги в Welltory
○ В основном на Python
● Делаю:
○ Python Дайджест
○ Сообщество PyNSK
● Делал PyCon Siberia 2016
2
3. ● Стартап (проекту 1.5 года)
● Изучаем образ жизни людей
● Учим соблюдать баланс эффективности и здоровья
● Рисуем красивые дашбоарды и графики
● Строим рекомендательную систему
Welltory - приложение для управления стрессом, продуктивностью
3
4. ●
●
● Учим соблюдать баланс эффективности и здоровья
●
●
Welltory - приложение для управления стрессом, продуктивностью
4
27. 27
Важная фича Welltory - замер вариабельности сердечного ритма (ВСР)
Замер
По ВСР можно оценить:
- Стресс
- Энергию
- количество и динамику
- на что тратит организм
- Здоровье в целом
- наличие некоторых хронических болезней
- Приближающуюся болезнь (проверял на себе)
- Тренированность и готовность к нагрузкам
- физическая, интеллектуальная, психологическая
- Влияние веса
- Тип регуляции (фенотип)
- ...
31. 1 этап - таблицы контента
31
Как внедрить
● Создаем таблицы
○ X -> Text
○ X, Y -> Text
● Из таблиц достаем нужный текст
Таблица контента - соответствие контента и значения параметра
32. 1 этап - таблицы контента
32
Плюсы
● Простота использования
● Легко тестировать код
○ Если X и Y, то Text
Таблица контента - соответствие контента и значения параметра
33. 1 этап - таблицы контента
33
Плюсы
● Простота использования
● Легко тестировать код
○ Если X и Y, то Text
Минусы
● Кол-во параметров = размерность таблицы
● Условие выборки находятся в коде
Таблица контента - соответствие контента и значения параметра
36. Если
Есть давление и
Индекс Кердо меньше -15
То
Ваша нервная система находится в очень
спокойном состоянии. Это может быть связано с ….
Комбинация условий
36
40. 2 этап - объекты-комбинаторы
40
Создаем модели
● Текст
● Параметр
● Условие
41. 2 этап - объекты-комбинаторы
41
Создаем модели
● Текст
● Параметр
● Условие
Контент на двух языках
42. 2 этап - объекты-комбинаторы
42
Создаем модели
● Текст
● Параметр
● Условие
Контент на двух языках
Способ получения значения
● Из какой модели какое поле достать
● Функция расчета параметра
43. 2 этап - объекты-комбинаторы
43
Создаем модели
● Текст
● Параметр
● Условие
Контент на двух языках
Способ получения значения
Комбинатор
● Сравнивает значение параметра
с настройками
44. Модель условия
44
class Condition(models.Model):
text = models.ForeignKey(Text)
type = models.IntegerField(choices=CONDITION_CHOICE,
default=CONDITION_RANGE)
argument1 = models.CharField(...)
argument2 = models.CharField(...)
argument3 = models.CharField(...)
Храним
тип оператора и
операнды
45. Метод сравнения
45
def compare(self, value):
if self.type == CONDITION_GT:
return value > float(self.argument1)
elif self.type == CONDITION_RANGE:
return float(self.argument1) <= value <= float(self.argument2)
elif self.type == CONDITION_FUNCTION:
function = getattr(transcript_condition_functions, self.argument3)
return function(value)
...
Принимаем значение
параметра и
проверяем условие
46. Как использовать
1. Создаем объект Параметра
a. Определяем способ получения значения
2. Создаем объект Текста
3. Создаем объект Условия
4. Связываем одно с другим
a. Тексты с Параметрами
b. Параметры или Тексты с условиями
5. Выгружаем тексты
6. Для каждого текста получаем список его Параметров и Условий
7. Проверяем каждое условие на истину
8. …
9. Profit 46
50. 2 этап - объекты-комбинаторы
50
Плюсы
● Рабочий метод
● Можно комбинировать условия
● Все управляется через админку
51. 2 этап - объекты-комбинаторы
51
Плюсы
● Рабочий метод
● Можно комбинировать условия
● Все управляется через админку
Минусы
● Мутная реализация и поддержка
● Тяжело переиспользовать для разных фич
● Сложно тестировать
● Логика “И”/ “ИЛИ” / “НЕ” требует лишних объектов в БД
● По опыту: тип параметра жестко завязан на набор условий для него
54. 3 этап - гибкие условия
Хочется
● Можно комбинировать условия через ИЛИ / И / НЕ
● Можно переиспользовать условия
● Вычисление значения и обработка лежат в одном месте
● Добавление параметра = добавить класс
54
56. django-conditions
56
Инструмент переноса гибкой логики в Django Admin
● JSONField на стероидах
● Можно комбинировать условия через И / ИЛИ / НЕ
● Поддерживает условия
○ True/False без выбора аргумента
○ True/False с выбором аргумента
○ Сравнение значений
● Логика проверки условий = Python класс
62. Пример условия
class UserDaysFromSignUpCondition(CompareCondition):
condstr = 'USER_DAYS_FROM_SIGN_UP'
cast_operand = int
def eval_operand(self, user, **kwargs):
return (datetime.now() - user.created_at).days
62
Условие на
сравнение
Обработчик
Тип операнда
int и float автоматически
поддерживают операции > >= <= < ==
64. Как использовать
1. Создаем условия
2. Создаем модель с полем
from super_app import condition_types
...
conditions = ConditionsField(definitions=conditions_from_module(condition_types))
3. Создаем объекты модели
4. Проверяем условия в коде
64
65. Как проверять условия
from conditions import eval_conditions
"""
user - User object
data - Словарь данных. Содержит предварительно посчитаные данные
queryset - QuerySet модели с полем conditions
"""
for item in queryset:
val = eval_conditions(item, 'conditions', user, **data)
if val:
print("Match!!!")
return item
65
66. 66
Плюсы
● Можно комбинировать условия (И / ИЛИ / НЕ)
● Легко добавлять новые условия
● Можно переиспользовать для разных фич
Минусы
● Требует дисциплины
○ Нейминг условий
○ Способ написания условий (пишите атомарные условия)
● Тяжело расширить интерфейс управления
● Одним запросом не получится получить релевантный тексты
3 этап - гибкие условия