- BrainTools - https://www.braintools.ru -
Я проанализировал [1] 20 лет своей переписки и превратил 1,2 миллиона сообщений в структурированное хранилище своей жизни — чтобы завоёвывать друзей и влиять на людей. Вместо этого я узнал кое-что о своём эмоциональном состоянии, циклах привязанности и периодах полураспада дружбы.

В 2014 году Тим Урбан из WaitButWhy опубликовал «Ваша жизнь в неделях» — сетку, где каждый квадратик — это одна неделя жизни, и большая часть сетки уже заполнена. Это изображение беспокоило меня годами. Я начал отслеживать события отчасти из-за него — я хотел, чтобы сетка что-то значила, а не просто отсчитывала время. Но биометрические данные — это странное представление того, насколько насыщенной была моя жизнь. Сетка предполагает, что важны события — работа, поездки, учёба, браки — и их легко отметить. Но они едва ли отражают то, как я себя чувствовал в течение этих недель, или каким я был для окружающих меня людей. Вот что я хотел измерить.
Поэтому я попробовал вести дневник. Сначала на бумаге, затем в текстовых файлах, а потом — ежедневные заметки в Obsidian. Дневник запечатлел то, что я считал важным в день написания. В нём не было ни разговоров, которые я забыл записать, ни медленно развивающихся закономерностей, которые я не мог заметить в то время.
Устав от неумения поддерживать отношения и желая компенсировать это данными, я отправился на поиски своего рода личной CRM-системы, основанной на записях, а не на памяти [2] — благодаря следам, оставленным моим многолетним бесцельным времяпрепровождением в интернете за последние несколько десятилетий.
Моё присутствие в сети примерно делится на три эпохи:
ICQ, IRC, DC++ в 2000-х: ночные каналы для начинающих хакеров и шуток — всё это исчезло, и, вероятно, к лучшему. Десятилетнему ребёнку, которым я был в этих чатах, не нужен структурированный архив.
VK, Twitter, Facebook** в 2010-х: школа, университет, начало карьеры — равномерное распределение.
Instagram** и Telegram в 2010-2020-х годах: как ни странно, несмотря на то, что я не так часто публикую что-либо в Instagram, часто проще общаться с людьми в личных сообщениях, и всё больше людей меняют WhatsApp** на Telegram.
Вооружившись GDPR и законами о доступе к данным, я создал архив со всеми своими сообщениями, реакциями и социальными графами.
Архивы данных
Разбор множества JSON и HTML-файлов был несложным, но и не доставлял удовольствия. Instagram дважды кодирует кириллицу через латиницу. Telegram присваивает разные внутренние идентификаторы сообщений между экспортами, сделанными в разные даты. Facebook в какой-то момент ввёл сквозное шифрование, поэтому одни и те же сообщения отображаются в трёх разных папках. Telegram позволяет экспортировать групповые чаты или только свои собственные сообщения. VK экспортирует всё без запроса. Instagram вообще не различает трансляции и личные чаты.
После преобразования в единый формат с разделителями-табуляторами пять экспортов дают разные типы сигналов. Telegram и VK — это в основном личные сообщения. Instagram добавляет взаимодействие в историях и график подписчиков. Twitter — это отдельная категория: отдельные твиты представляют собой корпус публикаций, личные сообщения — это наполовину запросы в службу поддержки, наполовину координация конференций, поэтому мне нужен был график ответов/упоминаний, чтобы улавливать реальные сигналы.
Я хотел зафиксировать ежедневную заметку по каждому разговору, профиль каждого человека, заготовку по каждому месту, хронологию жизни и все остальное, что всплывает — рецепты, коктейли, заметки о встречах.
Утопая в шуме
Прежде чем беспокоиться о классификации, нужно учитывать тот факт, что большая часть данных — это шум.
В моей самой длинной переписке — более 486 000 сообщений с моим партнёром за десять лет — контент содержит 2,4% ссылок, 9,1% медиафайлов, 1,5% сообщений только с эмодзи, 28,4% коротких фраз и 58,7% содержательного текста. Это означает, что 41% — это шум для целей этого упражнения. Фильтровать эмодзи, ссылки и медиафайлы было легко, но выявить слова-паразиты в разговорной речи — короткие слова, которые кажутся содержательными, пока вы не увидите их сотни раз в месяц, — сложнее.
Моя первая идея заключалась в фильтрации всех сообщений короче трёх слов, но многое можно сказать и двумя (он умер, мы проиграли и т. д.). Создание списка запрещённых слов из «ха-ха-ха» и других подобных выражений тоже не сработало, особенно на разных языках.
Решающим моментом стало использование выборки из пяти смещённых позиций в чате, подсчёт частоты каждого короткого слова, ручной просмотр 80 самых популярных и сопоставление списка запрещённых слов с защищённым набором коротких сообщений, относящихся к жизненным событиям.
На всех платформах и за все годы очищенный корпус содержит примерно 52 000 уникальных лемм. Показатель новизны — доля слов, которые я раньше не использовал ни в одном чате, — снижается с 2008 года и стабилизировался на уровне 6% шесть лет назад. Большая часть моего словарного запаса сформировалась в начале моих 20-х годов.
После фильтрации шума очищенные сообщения нуждаются в классификации: что является важным событием в жизни, что — шуткой, кто упоминается, каков эмоциональный настрой. Но прежде всего, есть более фундаментальная проблема.
Какой Саша
Большинство людей, с которыми я общаюсь, используют более одной платформы и часто не используют одни и те же имена пользователей на всех. Если бы я вёл профиль для каждого знакомого мне человека, мне пришлось бы сопоставлять их (и упоминания о них) во всех чатах.
Итак, появляются уменьшительные имена и прозвища: один и тот же Александр может превратиться в Эл, Алекс, Ксандер, Сэнди и Аlec(k). Это также может быть Саша, если он из Восточной Европы — а в славянских языках Саша — гендерно-нейтральное слово. Морфологические анализаторы помогают с падежным склонением, но не справляются со сленгом, и «Саша» в моих чатах означает несколько разных людей в зависимости от того, когда было отправлено сообщение и с кем я разговариваю.
Эвристические методы и модели NER не подойдут для тысяч упоминаний только по имени в групповых чатах. Классификатор, обученный на содержании сообщений, мог бы сработать, но обучающий набор данных пришлось бы размечать вручную из моих собственных чатов — именно ту работу, которой я пытался избежать.
Та же проблема возникает с классификацией того, что действительно важно.
Очевидный подход — это сопоставление ключевых слов с глаголами первого лица (купил, переехал, подписал), пропущенное через NER для извлечения имен и мест, но он даёт много ложных срабатываний. «Я переехал» в сообщении маме означает переезд, «Я переехал» в чате с друзьями — это дизайн интерьера, а «Я переехал» после расставания — это эмоциональный этап.
Тонкая настройка классификатора на сообщениях, размеченных вручную, дала бы мне в лучшем случае точность ~70-80% — а при 1,2 миллионах сообщений даже 1% ложноположительных результатов означает 12 000 фиктивных событий в хранилище.
Поэтому я в итоге использовал LLM как для разрешения имен, так и для классификации. При сравнении с контрольным набором из 200 событий частота ложноположительных результатов составила менее 1% при обработке фрагментов менее 6000 сообщений.
LLM не записывает данные в хранилище. Программа считывает фрагмент сообщений и создает структурированный JSON-манифест — ежедневные заметки с датами и тегами настроения, факты профиля сущности, события жизненного цикла, обновления мест и список неоднозначностей, которые она не смогла разрешить («msg 833006: ‘John’ without surname - which John?»). Детерминированный скрипт считывает этот JSON и внедряет в него заметки. Каждая заметка содержит маркер происхождения (chat::tg/chat_NNN) (msg::730372 - 730650), указывающий на источник. Хранилище происхождения SQLite отслеживает каждую выходную заметку до исходного сообщения, поэтому некорректную сессию можно аккуратно отменить. Все детерминированные операции — парсинг, фильтрация, дедупликация, отслеживание происхождения — выполняются на Python, поэтому сами сообщения не попадают в хранилище, но я всегда могу отследить их содержимое, используя оригинальные архивы в качестве источника достоверной информации.
Обучение [3] модели обработки запросов
Файл запросов, определяющий поведение [4] LLM, изначально имел размер 8 КБ, но быстро увеличился в десять раз, в основном из-за ошибок.
Например, модель прочитала ветку обсуждения, где я объяснял другу расчёты цен в рамках программы обновления iPhone, и добавила событие покупки в жизненную хронологию, поэтому мне пришлось добавить проверку на принадлежность от первого лица — классификация жизненных событий без явных маркеров от первого лица в исходном тексте невозможна («Я купил», «Я подписал»).
Защитный механизм — скрипт проверки, который запускается перед тем, как отметить любой чат как завершённый, — механически обнаруживает некоторые из этих ошибок: «осиротевшие» вики-ссылки, дублирующиеся цитаты, языковое смешение. Но он не может обнаружить конфабуляцию, поэтому я добавил выборку: после каждой партии случайным образом выбираются 5-10 результатов, которые затем проверяются по исходному тексту. Самооценка уверенности модели никогда не должна быть показателем качества.
Направленная тональность
На этом этапе у меня были структурированные данные — люди, места, события, хобби, рецепты. Но мне также хотелось понять, какие чувства вызывают мои отношения.
Стандартный анализ настроений присваивает каждому сообщению одну полярность: позитивную, негативную, нейтральную. Если один человек полон энтузиазма, а другой отвечает односложно, VADER пометит разговор как позитивный, но в реальности всё асимметрично: одна сторона настроена тепло, другая — нейтрально, и именно эта разница делает разговор интересным.
Можно было бы выстроить всё с помощью классического машинного обучения — классификация эмоций [5] для каждого говорящего, а затем объединение в пары, — но близкие дружеские отношения по умолчанию тёплые. Сигнал — это не абсолютная эмоция [6], а отклонение от базового уровня. Сообщение, помеченное как «радость», ничего не значит, если каждое сообщение в этих отношениях помечено как «радость». Модель должна понимать, как выглядит норма для этой конкретной пары, иначе вы получите дружескую перепалку, помеченную как «флирт».
Большая ошибка [7], которую я здесь совершил, заключалась в том, что я сказал LLM: «Эй, иди и пометь каждый разговор по настроению». После обработки примерно 9000 дней переписки я получил множество сентиментальных данных в свободной форме — более 5700 уникальных значений, таких как WWDC-binge-mode и garden-prep.
В итоге я переделал данные, добавив 18 тегов и три префикса направления (моё эмоциональное состояние, состояние собеседника и взаимное):
Учитывая, что в основном это друзья и родственники, ожидалось 66% M:warm. Интересные данные — это изменение со временем. Дружба, переходящая от M:playful к M:transactional за 18 месяцев, — это дрейф, и я не думаю, что смог бы заметить это в отдельной переписке.
Но заметил ли я что-нибудь ещё? Наиболее очевидным кажется объём сообщений — в данный момент это может быть менее очевидно, и иногда случаются жизненные обстоятельства, работа или праздники, но, безусловно, снижение должно что-то значить.
Интересно, что количество сообщений может уменьшиться, но их средняя длина может также увеличиться — так что дружба не умирает, она просто меняет форму.
Если не сообщения и их длина, то что? Рассмотрим совпадение словарного запаса — в некоторых моих отношениях оно увеличилось с 69,5% общих слов до 8,7%. Теперь мы используем почти исключительно непересекающийся словарный запас. Случайное сообщение от любого из нас можно легко идентифицировать по одному лишь выбору слов.
Значит ли это, что мы больше не друзья? Не обязательно, но это означает, что наши интересы гораздо больше различаются, чем раньше — что тоже может быть хорошо.
Ещё один интересный показатель — это количество сессий по сравнению с количеством сообщений за сессию. Взаимодействие с моим партнёром распадается на тысячи микро-проверок (количество сессий увеличивается, количество сообщений за сессию уменьшается), в то время как чаты с другим близким другом сжимаются из множества небольших сессий в день в содержательные беседы несколько раз в месяц (количество сессий уменьшается, количество сообщений за сессию увеличивается).
Я также посмотрел время ответа, но оно больше говорит о привычках использования телефона, чем о чувствах человека. Разница между чатами невелика и увеличивается с длиной ответа — лучшим показателем было бы время от получения сообщения до его прочтения, но ни один из экспортированных графиков данных этого не предоставляет.
По иронии судьбы, в среднем я отвечаю на первое сообщение в сессии с большой задержкой, но затем отвечаю на все последующие сообщения быстрее, чем любой другой человек в моей выборке отвечает мне — у меня слишком много времени или мне больше нечем заняться? Разница незначительна для моего партнёра и ближайших друзей и увеличивается для второстепенных контактов.
В большинстве разговоров, когда один человек пишет длинное сообщение, другой отвечает ему тоже длинно — это называется языковой адаптацией. Я обнаружил несколько чатов, в которых происходило обратное: чем длиннее я писал, тем короче они отвечали.
Я не обнаружил никакого эмоционального заражения между разговорами — общение с одним человеком не оказывало заметного влияния на настроение моего следующего разговора в тот же день. Грусть не проникает сквозь чаты, но и теплота тоже, поэтому все разговоры идут по своим независимым путям.
Существует теория, что количество вопросов уменьшается по мере развития романтических отношений — вы перестаёте спрашивать, потому что уже знаете ответ. Данные по моему партнёру немного подтверждают это (с 8,8% до 8,3% за девять лет). Но данные по моей близкой подруге и матери показывают обратное: количество вопросов увеличилось с 11% до 18,5% и с 8,5% до 17,3% соответственно, по мере того как эти разговоры становились реже. Когда вы общаетесь с кем-то лишь изредка, большая часть ваших сообщений — это поиск информации. Частота вопросов является обратным показателем пропускной способности отношений.
Многие люди, которые пытались анализировать свои чаты раньше, создавали облака тегов — то, что, я надеюсь, мне больше никогда не придётся видеть, — поэтому я сосредоточился на частоте ласковых обращений. Это хорошо работает с чатом с партнёром — есть три чётких этапа в лексике, каждый из которых отслеживает определённые стадии отношений и условий проживания:
Тоска и признания в любви сменяются уменьшительными и ласковыми словами, а затем — сигналами одобрения и шутками. Когда вы находитесь врозь, эмоции передаётся текстом, но когда вы вместе, в основном фиксируются логистические моменты, поскольку эмоциональные вещи обсуждаются лично.
Изучив свой близкий круг общения, я расширил его и посмотрел на ежегодное сокращение контактов — количество контактов, которые прекращаются после каждого года. Переезд в другой город (2016) или за границу (2017) в мои 20 лет стал более значительным событием, приведшим к исчезновению дружбы, чем переезд в другой город (2023) или за границу (2025) в мои 30 лет. Без переездов я теряю около 20 человек в год.
Медианная продолжительность дружбы в наборе данных составляет три года, но 41 человек замолчал на 3+ года, а затем снова появился.
Тем не менее, большинство этих контактов не обязательно являются друзьями. Британский антрополог Робин Данбар обнаружил корреляцию между размером мозга [9] приматов и средним размером социальной группы, а затем экстраполировал это, предположив, что люди могут комфортно поддерживать 150 стабильных отношений. Затем он подсчитал, что люди поддерживают отношения концентрическими слоями — примерно 5 человек, которым вы позвоните в кризисной ситуации, 15 близких друзей, 50 постоянных контактов и 150 активных знакомых.
Моя группа поддержки и активная сеть со временем сокращаются. Но общее количество дней общения в год оставалось практически неизменным на уровне ~360 в течение шести лет подряд — пандемия тоже не изменила этого, хотя казалось, что они должны были бы увеличиться, учитывая количество координации для пьяных посиделок по Zoom. Даже несмотря на то, что за годы я потерял 75% своей сети, я не освободил ни одного дня общения, а просто продолжал перераспределять те же ~360 дней между меньшим количеством людей.
Разговоры с близкими друзьями эмоционально разнообразны — на диаграмме рассеяния эмоционального разнообразия и концентрации доминирующих эмоций большинство людей группируются в левом нижнем углу (одна доминирующая эмоция, низкое разнообразие). Мой партнёр и близкие друзья находятся в правом верхнем углу (много эмоций, ни одна не является доминирующей). Деловые разговоры с коллегами расположены в самом левом нижнем углу.
Я бы описал себя как «поддерживающего друга». Данные говорят, что я в равной степени «друг, дающий советы» — наставничество (50 асимметричных дней) почти соответствует поддержке (59). Если когда кому-то нужна моя помощь, я рефлексирую и пытаюсь объяснять, а не слушать. Я этого не знал.
Когда я путешествую, разговоры со всеми становятся более тёплыми (69,8% против 65,9% дома) и менее формальными (9,3% против 13,2%) — скорее всего, потому что мне не нужно думать о работе.
Я также могу чётко определить период моей жизни, когда я работал с 9 до 5: пик активности в переписке сместился с полуночи на полдень.
Люди, активные вечером, как правило, имеют больше друзей, но более низкого качества. В «ночные» годы у меня было около 300 активных контактов, но в «дневные» годы их число упало до ~60.
Моя социальная жизнь за два десятилетия умещается в 70 МБ — меньше, чем одна серия фотографий на iPhone.
Я начал это делать, потому что сетка Тима Урбана меня раздражала своей пустотой: школьные годы, каникулы, работа, отмеченные на конечной временной шкале, не вызывали у меня чувства удовлетворения от жизни. Каждый квадратик — это одна неделя, и в большинстве моих квадратиков ничего не было написано.
Теперь она прописана, но не в формате «переехал в Лондон» или «женился» — я бы и без посторонней помощи это запомнил. Первое сообщение от человека, который позже стал одним из моих самых близких друзей, или ночь, когда групповой чат не давал всем уснуть от смеха, или рецепт, которым кто-то поделился вскользь, и который я до сих пор использую каждую неделю.
Я понял, что моя жизнь никогда не была пустой. Моя память просто была очень избирательной.
Визуализация графа в Obsidian 2D плохо работала с 7000 узлами, поэтому я перевёл его в трёхмерное пространство в Vision Pro.
Это интересная техническая задача — представьте себе, как сократить количество вычислений с 26 миллионов в тике до 50 тысяч с помощью алгоритма, заимствованного из моделирования столкновений галактик, чтобы достичь 60 кадров в секунду, — но это заслуживает отдельного поста.
Это исследование не изменило того, как я общаюсь с людьми. Я по-прежнему склоняюсь к даче советов, когда кому-то нужно, чтобы его выслушали, по-прежнему показываю разным людям разные стороны себя, по-прежнему оставляю половину своих бесед непрочитанными на несколько дней. Но я погрузился в ностальгическую кроличью нору, которой не ожидал, и узнал о своих отношениях то, чего не мог бы увидеть, общаясь по одному чату за раз. Теперь я знаю, как выглядят мои модели поведения [10] со стороны — предполагая, что кто-то другой удосужится провести свои чаты по тому же десятиэтапному алгоритму и поискать меня.
В качестве побочного эффекта, теперь у меня есть всё необходимое, чтобы быть лучшим другом — даты последнего контакта и динамику настроений, их надежды и страхи, имена их питомцев (часто) и детей (иногда), аллергии и любимые блюда. Эта работа ответила на множество вопросов, о существовании которых я даже не подозревал.
А я плохой друг? Я думал, что мне придется спросить 400 человек, чтобы это выяснить — оказывается, достаточно было десяти.
Meta Platforms*, а также принадлежащие ей социальные сети Facebook**, WhatsApp** и Instagram**:
* — признана экстремистской организацией, её деятельность в России запрещена;
** — запрещены в России.
Автор: maybe_elf
Источник [11]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/30948
URLs in this post:
[1] проанализировал: https://habr.com/ru/news/1039114/
[2] памяти: http://www.braintools.ru/article/4140
[3] Обучение: http://www.braintools.ru/article/5125
[4] поведение: http://www.braintools.ru/article/9372
[5] эмоций: http://www.braintools.ru/article/9540
[6] эмоция: http://www.braintools.ru/article/9387
[7] ошибка: http://www.braintools.ru/article/4192
[8] реакции: http://www.braintools.ru/article/1549
[9] мозга: http://www.braintools.ru/parts-of-the-brain
[10] поведения: http://www.braintools.ru/article/5593
[11] Источник: https://habr.com/ru/articles/1040784/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1040784
Нажмите здесь для печати.