Obisidianで書いた日記を感情分析する

AI要約

Obsidianに移行した日記4ヶ月分を感情分析モデルで解析した結果、全体の半数がネガティブで日曜日だけ若干改善する傾向が判明した。

はじめに

フィクションで、死期の近づいた人物が急に日記をつけ始めるシーンがある。日記とは習慣であり、今まで何も書いてこなかった人間が急に物を書き始めることなどありえないと思っていた。最近になって考えを改めた。孤独と向き合い、何かを残したいと願って創作を行うのなら、日記はもっとも手軽な手段となる。読むのが自分一人しかいないとしても、日記とは過去の自分から未来の自分に向けた伝承だ。孤独と向き合うためには有効な手段だと思う。


日記を感情分析するのは2023年の年末にもやっていた。

Blog Postcontradiction29.hatenablog.com排便行為としての日記 : Notionで書き溜めた日記をjarvisx17/japanese-sentiment-analysisで感情分析する - 現実モデリングcontradiction29.hatenablog.com

当時はNotionで日記を書いていた。

  • Notionの本文部分はブロックベースで書いてあるので、本文テキストの抽出が面倒である
  • NotionはSaaSであり、テキストが完全に向こう側に保持されるので、API経由でテキストデータをダウンロードする必要がある

つまりNotionは感情分析するのに向いていない。

なので、去年(2024年)の8月から日記を書くツールをObsidianに切り替えた。

External Linkobsidian.mdObsidian - Sharpen your thinkingobsidian.md

  • Obsidianのファイル形式はマークダウン形式のテキストファイルなので、抽出が簡単である
  • ファイルもローカルに保存されるので、気軽にテキスト解析ができる

感情分析をやっていく。本当は2024年のうちにやっておきたかった。

やってみる

全体的な方針としては以下の通り

  1. PythonでObsidianの保存ディレクトリにアクセスし、テキストデータを構造化しながら抽出し、感情分析する
  2. Streamlitで分析する

昔はJupyter Notebookで分析するだけだったが、今回はStreamlitでインタラクティブに遊んでみることにした。

期間はObsidianを使い始めた2024年9月から12月までとする。

Obsidianのテキストデータを抽出して感情分析する

普通の日記は以下のような形式で書いている

---
ジムメニュー:
  - チェストフライ3.75kg 10*3回
  - 懸垂 10回
  - ベンチプレス(パワーラック)42.5kg
  - バーベルスクワット(パワーラック)42.5kg
  - アームカール(パワーラック)20kg * 8回 * 3セット
  - ペクトラルフライ 33kg 10*3回
  - トーソローテーション35kg 10*3回
  - アブローラー(立ちコロ・肩まで) 5回 * 3セット
  - ウォーキング30min(6.5km/h)
作成日時: 2024-12-27 22:18
最終編集日時: 2024-12-27 22:18
tags:
  - daily
---
6時半に起きる。15分遅れて起きた。豆乳を飲む。ジムに行く。
- ベンチプレスをする前にウォームアップをしっかり入れた(チェストフライ、懸垂、ベンチプレス20kg)。体が温まってしっかり動けた。
- ペクトラルフライの調整方法を学んだ
ジムから帰る。
仕事をする。今日は集中力があまりなかった。
仕事を切り上げる。カニ鍋を作る。アークナイツのイベントをやる。

昨日のエントリ:[[2024-12-26]]
翌日のエントリ:[[2024-12-28]]
先週のエントリ:[[2024-12-20]]
来週のエントリ:[[2025-01-03]]
先月のエントリ:[[2024-11-27]]
来月のエントリ:[[2025-01-27]]
  • フロントマター

    • 「ジムメニュー」がリスト形式で格納されていて、ジムでやったことが記録されている
    • 「作成日時」で作成日時を記録(今回は使わない)
    • tagsでタグが格納(今回は使わない)
  • 本文:日記の中身

  • 本文後のリンク:昨日や先月のページに飛べる

フロントマターはyamlなので、Pythonの標準ライブラリyamlを使えばパースできることに気づいた。フロントマターから抽出した情報は感情分析には使わないが、何かに使えそうなので取っておく。

感情分析のモデルにはtabularisai/multilingual-sentiment-analysisを使う。

External Linkhuggingface.cotabularisai/multilingual-sentiment-analysis · Hugging Facehuggingface.co

最終的な成果はCSVファイルで出力しつつ、duckdbに保存する。

プログラムは以下のようになる。

Repositorygithub.comobsidian-diary-visualizer/main.py at main · sora32127/obsidian-diary-visualizersora32127 / obsidian-diary-visualizer

Streamlitで分析する

去年はCSVファイルをそのままGoogle Colab上でPythonで分析していたが、Streamlitでやる方がスマートな気がしたのでそっちでやる。

Repositorygithub.comobsidian-diary-visualizer/diary_analysis.py at main · sora32127/obsidian-diary-visualizersora32127 / obsidian-diary-visualizer

分析結果

まずは全体的な分析をする

  • 日記を書いた日の割合は98.4%であり、ほぼ100%

    • トータルで120の日記がある
    • 2023年の分析で「日記を書くこと=排便」だと結論付け、とにかく日記を書き続けることが重要であると認識したため、充足率は高い
  • 全体的にネガティブな傾向を示している

    • 日記のうち半分はネガティブな傾向がある
    • ネガティブ:ポジティブ:どっちでもない=5 : 2 : 3

感情分布の割合

感情分布の割合

次に月別の分析をする

  • 月ごとに区切った場合、全体的な傾向に変化は見られなかった

月別の感情の時系列推移

月別の感情の時系列推移

  • ポジティブ/ネガティブの割合を示す「Positivity Ratio」は全体的に低めのまま推移している

月ごとの感情バランスの推移

月ごとの感情バランスの推移

最後に、週別に分析をする

  • 金曜日にちょくちょく日記を書き忘れることがあるっぽい。仕事終わりで疲れているからだろう。

週別充足率

週別充足率

  • 日曜日に限定してメンタルの改善傾向が見えた。やはり休日は身体にいい。

曜日別感情バランス

曜日別感情バランス

結論

  • 全体的にネガティブな傾向を示している
  • 日曜日だけ多少はマシになる

救いがない…