世界を動かす技術を、日本語で。

20年間のチャットを分析しました

概要

Tim Urban の「Your Life in Weeks」に影響され、人生の充実度を数値化したいという動機 バイオメトリクス やイベント記録だけでは満足できず、感情や関係性の質を記録する試み SNSやチャットの履歴 を活用した個人CRMの構築プロセス ノイズ除去、名前解決、イベント抽出 など技術的課題とそのアプローチ 感情や関係性の変化 をデータから可視化し、気づきを得るまでの道のり

人生の週グリッドと記録への動機

  • Tim Urban の「Your Life in Weeks」画像が人生の有限性を意識させる契機
  • ただ週が過ぎるのを数えるだけでなく、 意味ある記録 を残したいという思い
  • バイオメトリクスやイベント記録は人生の充実度を表現しきれない課題
  • 感情や人間関係の質 を可視化したいという新たな目標
  • ジャーナリングや日記アプリ( Obsidian など)で記録を試行錯誤

デジタル履歴の活用と個人CRM構築

  • SNSやチャット履歴 (ICQ, IRC, VK, Twitter, Facebook, Instagram, Telegram等)を整理
  • GDPR 等のデータアクセス権を活用し、過去のメッセージやリアクションを取得
  • 各プラットフォームごとのデータ形式や仕様の違いに苦戦
    • 例: Instagram の文字コード問題、 Telegram のID不一致、 VK の全面的なアーカイブ
  • 統一フォーマット(TSV)へ変換し、 会話単位の日記、人物プロファイル、イベント年表 等の構造化を目指す

ノイズ除去と語彙の変化

  • 大量の会話データ の多くがノイズ(短文、絵文字、リンク、定型句など)
  • 短文の中にも重要なイベントが含まれるため、単純なフィルタリングは不十分
  • 頻出短語の手動レビューと保護リストを組み合わせてノイズ除去
  • 語彙の新規性 は20代前半でほぼ固定化、年々新しい単語の割合が減少

名前解決とイベント抽出の課題

  • 同一人物の複数プラットフォーム横断識別 (例:Alexander=Al, Alex, Sasha等)
  • ニックネームや言語ごとの変化、文脈依存の名前解釈
  • NERやヒューリスティクス では限界があり、 LLM による文脈解釈を導入
  • イベント抽出も単純なキーワードでは誤判定多発、 手動ラベル付きデータでの分類器訓練 も効果限定的
  • LLM を用いたメッセージ塊の解析で高精度の抽出を実現、JSON形式で構造化

プロンプト設計と品質管理

  • LLM用プロンプトファイル は誤判定の度に拡張・修正
  • 明示的な一人称表現がないとイベント認定しない等のガードルール追加
  • 機械的な検証スクリプトとランダムサンプリングで品質担保
  • 信頼性指標 としてモデルの自己申告信頼度は使わない方針

感情・関係性の分析

  • 通常の 感情分析 は会話全体の印象を単一ラベルで判定しがちだが、実際は発言者ごとの温度差が重要
  • 関係ごとのベースライン を把握し、そこからの逸脱を検出することが本質的
  • LLMで会話日ごとに「自分」「相手」「相互」の感情状態を18タグ×3方向で分類
  • 長期的な変化(例:playful→transactionalへの推移)を定量的に把握可能

データから見えた関係性の変化

  • メッセージ量の変化 は関係性変化の兆候となりうるが、必ずしも質的変化と一致しない
  • メッセージの 平均長語彙の重複率 など、多角的な指標で関係性を捉える必要
  • 長年のやり取りを通じて、関係性の形や質が変化していく様子をデータから発見

関係性の変化を可視化するデータ指標

  • Jaccard類似度 等を用いた語彙の重複率分析
  • 長期的な関係性の変化を 定量的に追跡 するアプローチ
  • データを活用することで、 主観的な気づき以上の洞察 を得られる可能性
  • 人間関係の質的変化 を見逃さないための新しい記録・分析手法の提案

Hackerたちの意見

2009年くらいにこれをめっちゃやりたかったんだ。MSNメッセンジャーのチャットやテキストをアーカイブして、いつか分析したり、自分を模倣するチャットボットを作れるかなって思ってた。でも、年が経つにつれてハードドライブや携帯電話を失ったり、うっかりデータを消しちゃったりして、結局実現しなかった。こうやって実現できたこの人、すごいね。

2001年から2004年くらいにMSNメッセンジャーの保存機能をオンにしてたことがあったけど、データは失わなかったんだ。10〜15年後に見返してみたら、恥ずかしさがすごくて結局全部消しちゃったけど。

MSNのログや古いデータをパスワードを忘れた暗号化ハードドライブに保存してるんだ。パスワードを思い出すための神の啓示を待ってるか、量子コンピュータが来るのを待ってる。自分だけじゃなくて、実際に失った人がいるって聞いてちょっと安心したよ。

AIMでログを取ってたんだけど、当時の90年代後半のバージョンは面倒だった。チャットを手動で保存しなきゃいけなかったからね。それで、家にいない時にクレイマーみたいな友達が来て、俺のパソコンに入って保存したチャットを全部消しちゃったんだ。OPと同じような自己分析のためにログを取ってたけど、友達はそれが自分のことをファイルにまとめてると思って、すごく嫌がってた。

僕は主にSignalで消えるメッセージを使ってテキストしてるから、これをやるのは無理だな。大体の人は4週間で消えるメッセージで満足してるけど、中にはチャットをずっと残しておきたい人もいるよね。

おすすめや住所みたいなことのために別にメモを取ってる?僕はよくチャットを掘り返して探してるよ。

Signalデスクトップからチャット履歴を抽出するツールがあるよ。それをPCで定期的に動かせば、プレーンテキストと添付ファイルのアーカイブを作れるよ。前回の実行から新しいチャットを追加してくれる。

正直、すべてのメッセージアプリがこういう風に動いてくれたらいいなと思う。こういうチャートを作るのはちょっとクールだけど、会話を永遠に保存することのプライバシーの問題はかなりひどいよ。IMアプリでのデータ漏洩は、最も壊滅的な漏洩の一つになるだろうし、全履歴を保存する正当な理由はそんなに多くない。誰かが大事なことを教えてくれたら、その情報を連絡先やメモに移す努力をすればいいんだ。

何十人から何百人もの人と意味のある連絡を取り続けられてるのが羨ましい。

正直、疲れそうだね。人それぞれってことかな…

くそ、これって10年前に誰かに送ったプライベートチャットもAIに収集される可能性があるっていう良いリマインダーだね。

テレグラムのデータダンプを使って、似たようなチャート作成をしてるよ。「テレグラムライト」のデスクトップアプリからはまだダンプが取れるし、メインアプリからエクスポート機能が消えたけどね。ノイズを取り除くには、投稿で説明されてた手動の方法じゃなくてTF-IDFを調べてみるといいかも。これは、全体のコーパスで共通する単語をノイズとして、特定のチャット内で全データセットよりもずっと多く出現する単語を面白いものとして探すんだ。非対称に使われるフレーズを見つけるのも楽しいよ。例えば、会話の中で一人が他の人よりも多く使っているとか、時間が経つにつれて変わるとかね。人ごとのワードクラウドも面白いよ!

へぇ、Telegram Desktopのエクスポート機能(https://github.com/telegramdesktop/tdesktop/)まだ残ってるんだね。チャット中に三つの点をクリックして、エクスポートすればいいよ。

エクスポート機能が削除された理由について、何か説明はあったの?

質問の頻度を見つけるのが一番興味深い部分だね。それに、プラットフォームによる影響も大きい。親しい友達が音声やビデオに移行した時、テキストの質問率はゼロになったけど、実際に質問すること自体は減らなかった。だから、アドバイスをくれる友達のサインは、実際には「まだ一緒にタイプしてる人」って感じだね。著者はそれをテストするデータを持ってるかもしれないけど、投稿には書いてないね。

15人の親しい友達、50人の普通の連絡先、150人のアクティブな知り合い たくさんいるように思えるね。俺の場合は、親しい友達0人、普通の連絡先0人、アクティブな知り合い0人だ。友達や知り合いを作ったり維持したりするための有用な社交スキルを全然身につけなかったんだと思う。人生で出会った人たちと、少なくとも何人かは(なんとか)連絡を取り続けておけばよかったな。今までの人類の歴史の中で、連絡を取り続けるのがこんなに簡単だったことはないのに、俺はみんなを無視してしまった。29回の太陽の周りの回転を経て、ようやくその虚無的な優越感が何の役にも立たなかったことに気づき始めた。失ったものへの微かな後味が、タールのように俺にくっついて離れない。洗い流すことができないんだ。

まだできるよ。ほとんどの人は人生の中で社交的な時期とそうでない時期があるからね。俺の友達には、40代や50代でめちゃくちゃ社交的な人もいるけど、20代の頃はそうじゃなかったりする。逆もあるし。人生は長いし、多くの人が内向的な時期を必要としている一方で、外向的な人もいるんだ。

俺のアドバイスは、どこかに実際に行って、そこに継続的に通うことだよ。クラブやミートアップ、ボランティア活動など、何でもいい。インターネットは社交のファーストフードみたいなもので、手軽だけど質が悪い。定期的に同じ部屋にいて、顔を合わせて話すだけで、リアルな友達ができるよ。

(対面で)脆弱な人を助けるボランティア活動が、虚無的な優越感を和らげてくれたよ。運が悪いだけの素晴らしい人たちに出会ったんだ。君の投稿は、正しい方向に進んでいることを示していて、次のステップを踏む準備ができているかもしれないね。

「ZpJuUuNaQ5」って名前だと、カジュアルにおしゃべりしたり友達に紹介したりするのが難しくなるのかな?

大切に思える人を見つければ、その価値を感じるよ。

自分で言った通り、スキルを身につけてないじゃん。学ぶには時間がかかるけど、学べるスキルだよ。全くできないことを始める勇気が必要で、毎日一つずつやってみることが大事。32歳の時、俺も同じような感じだったけど、4年後には全然違う話になってるよ。

過去のコメントを見てみると、「空虚な優越感」を持ってるっていうのには同意するよ。その自己洞察は貴重だね。だから、ネット上で自分が全てを理解してるふりはやめた方がいいんじゃない?

じゃあ、今すぐ始めよう。アルゴリズムみたいに考えて、テキストやメール、電話、フォローアップのリマインダーを設定してみて。俺はADHDがあって大変だった。人のことを忘れちゃうんだ、別に気にしてないわけじゃないのに。それで罪悪感を感じて、さらに遅れちゃう。とにかくやってみて。親しい人となら自然に感じるかもしれないけど、それ以外はなかなかそうならないかも。それでも大丈夫。友達を作ること自体が目的じゃないからね。お互いに興味を持って、経験や共通の興味を共有し合って学ぶことが大事だよ。

「今になってやっと、あの空虚な優越感がどこにも導いてくれなかったことに気づき始めた。遅くはないけど、早くやってればもっと楽だったかも。」

参考までに、連絡を取り合うのに遅すぎるってことはないよ。連絡を取りたかったって言ってたけど、もしできるなら連絡してみたら? しばらく連絡してなかったからって気にする人はいないし(みんな同じだし)、ほとんどの人はあなたのことを考えてくれて嬉しいと思うよ。

2001年からのハードドライブを全部保存してるおかげで、チャットログも全部残ってるんだ。去年の秋、友達の40歳の誕生日のために写真を探してた時に、HDアダプターに投資することにしたんだけど、奇跡的に全部のドライブが動いたよ。ただ、いくつかはランダムに電源が切れたりしたけどね。昔のIRCチャットを見返してみたんだけど、ニックネームだけで30%くらいの人が誰か分からなかった。20年ぶりに見るニックネームだったから。そこで、全部の生チャットをLLMに突っ込んで、モデルが名前とニックネームをつなげられるか試してみたんだ。意外と上手くいったよ!多くのチャットは個人的なものじゃなくて、チャンネルからのだった。私の一番活発なチャンネルは小さな町のローカルグループだったから、名前も自然とそこにあったけど、膨大なチャットやテキストを掘り下げるのは面倒だった。で、2000年代中頃にMSN Messengerが流行ったから、ほとんどのチャットはそこでやってた。アメリカの人とチャットする時はICQを使ってたしね。それから2009年か2010年頃にFacebookがスタンダードになった(私のアカウントは2007年に作ったみたいだけど)、ほとんどのチャットはメッセンジャー経由だね。

いいアイデアだね!コストが今すごく手頃だから、openrouterでやろうと思ってたんだけど、他の人がやってるのを見ると、WhatsAppやiMessages、Facebook、散らばったIRCログでもできるなって思った。メールの感情分析も面白そうだし。

オープンルーターのプロバイダーにチャットを送るのはおすすめしないよ。個人的には、この種のデータにはローカルモデルだけを使うべきだと思う。

なんでみんなチャットを残してるの?私は全く残してないし、古いのは6ヶ月前のもので、その時にチャットアプリを削除するように設定したんだ。メールも同じ。こんなものを残しておく理由が本当に分からない。再読することなんて絶対ないし。

言うまでもないかもしれないけど、古いチャットを残しておくことでできることの一つは、TFAが行った分析だよね。

なんでチャットを削除したいの?スペースを節約するため?無制限のストレージがあったら、それでも削除する?

著者はチャットを残してなかったけど、やり取りしている会社は残してたんだ。>「GDPRやデータアクセス法を駆使して、全てのメッセージや反応、ソーシャルグラフを含むアーカイブを手に入れた。」

高校の年鑑って取ってる?

友達と14年以上のグループチャットがあって、たまに酔っ払って遡って自分たちを笑ったりしてるよ。やる価値あり!