これは“華やかな結果”より、そこへ至る“泥くさい途中経過”の実験ノートです。

記事のポイント: ChatGPTログを感情分析・可視化するまでの「泥沼」を全公開!
この記事は、12,000行ものChatGPT対話ログをPythonとJupyterを使って感情分析・可視化するまでの、”開発過程でぶつかった数々の課題と解決策を記録した「実験ノート」”です。
華やかな分析結果の裏側には、Pythonのバージョン衝突、シェル環境の違い、文字化けとの格闘など、”リアルな「つまずきポイント」”が満載。感情分析モデルの限界や、可視化が単なるゴールではなく「思考の鏡」となるまでの気づきも包み隠さずお伝えします。
AI×セルフリフレクションの最前線で何が起こったのか、具体的な手順と失敗の汗を追体験できます。
“それっぽさ”の殻を破る序章
前回の記事は、12,000 行の ChatGPT ログを使った語彙・感情分析を “科学っぽく” まとめました。けれども私は書き終えたあと、胸のどこかがざわついていました。
「達成感がない…」「グラフの意味わかりにくいか?」「体験記録として薄くサイエンスに触れたただの日記か?」
- 抽象的すぎた。 具体的な手順や失敗の汗がこぼれ落ちている。
- 再現性が弱い。 読者が実験を追体験できる導線がない。
セルフリフレクションの背景には、”そもそも感情分析モデルとは何か?”、”感情分析可視化から垣間見える限界とは何か?”といった疑問符の芽が点在している。
今回は、「ログ抽出→整形→Python撃沈→可視化→気づき」に至るまでの リアルタイムの足跡 を全部ここに記録します。
ChatGPT対話をデータ採掘する
ChatGPTとの対話ログを私のPCに取り込み、htmlファイル、JSONファイルを開いた瞬間の第一声。
「うわっ!長っ!」
でした。
- ログ採取
- ChatGPT の 設定 › データコントロール › データをエクスポート を実行 →
chatgpt_export_<date>.zip
を取得。 - ZIP 内の
conversations.json
を抽出し、ログサイズは 12,046 行・1.4 MB。
- ChatGPT の 設定 › データコントロール › データをエクスポート を実行 →
- 粒度の決定
- メッセージ単位に分割 → ID, role, timestamp, text の 4 列構造へ変換(Python スクリプトで自動化)。
- 前処理の泥沼
- 改行コードのそぐわない (
\r?\n
) を統一。 - Unicode 絵文字が感情分析ライブラリで文字化け →
emoji
パッケージで除去。
- 改行コードのそぐわない (
⏰ 所要 2.5 時間 —— 実験は「掃除」から始まると痛感。
バージョン地獄とシェル沼からの脱出
障害 | 症状 | 処方箋 |
---|---|---|
①バージョン競合 | Python 3.12.3 と 3.13.5 の併存で PATH 混乱 | pyenv や明示的な PATH 指定で一時対応 |
➁シェルごとの挙動差 | PowerShell と Git Bash で仮想環境が異常動作 | シェルごとに PATH 表示・実行確認を徹底 |
③Jupyter 環境の刷新 | Notebook ではなく Lab に移行されていた | jupyter lab を前提に再設定・起動 |
④JSON生成の落とし穴 | コード自作による語彙・感情分析用 JSON 整形 | message 粒度、key構造の調整に試行錯誤 |
①Pythonバージョン衝突事件
Pythonは約1年ほど触れていなかったので、この機会に最新バージョンPython3.13.5を利用することを決意しました。
Pathはインストール時に作成するよう、チェックを入れたのですが…
>python –version
python 3.12.3
???
システム環境変数のPATHを確認しますが、間違いなくPython3.13の設定になっています。PATHにはPython3.12は存在しますが、優先順位はPython3.13です。
何が問題か?
これだけでも私の脳内はジェットコースターのように???が駆け回ります。
バージョン競合の問題解決につまずいた根本原因
根本となる原因は、実際に配置されたディレクトリがPython3.12.3と、Python3.13.5で違ったことでした。
システム環境変数優先順位の変更だけでは解決できない本質とは、
【Python3.12】→【C:\Python312】
【Python3.13】→【C:\Users\User\AppData\Local\Programs\Python\Python313】
しばらく、Python3.12.3は利用しません。
システム環境変数から、Python312を除外しました。
➁シェルごとの挙動差による派生問題
バージョン競合の問題から派生した因子として、シェルの違いにも触れます。
これは、PowerShellとGitHub Bashシェルを同等に考えていた私にありました。
PowerShellとbashシェルの違い|Python代表的な作法の違い
シェル | コマンド | 出力結果 |
---|---|---|
PowerShell | python –version | python 3.13.5 |
コマンドプロンプト | python –version | python 3.13.5 |
bash | python –version | python 3.13.5 |
コマンドが同じで出力結果が同じという観念から、いずれも私の脳内ではイコールで結びがち。
ところが、バックグラウンドで動作している挙動の違いから、Path表記の作法が違います。
シェル | Path表記の作法 | 例 |
---|---|---|
PowerShell | Windows標準の\使用 | C:\data.txt |
bash | UNIX/Linux流の/使用 | /c/data.txt |
PowerShellと同等の扱いで、bash操作をすると、エラーになります。
使用シェルの違いによる派生因子|Pythonあるある代表因子
ここで、Pythonあるあるの代表的なエラーの派生因子を挙げましょう。
pip install … というコマンドで狙ったライブラリやパッケージのインストールしたが、利用しているPythonのバージョンに反映されない問題。
特徴 | PowerShellのPATH解釈 | BashのPATH解釈 |
---|---|---|
参照の仕方 | Windowsシステム全体のPATHを参照する | WindowsのPATHを参照しつつ、自身の設定ファイル(.bashrcなど)で定義されたPATHを積み重ねてしまう |
優先順位 | Windowsシステム設定が優先する場合が多い | Bashの独自設定がWindowsのシステム設定より優先する場合がある |
問題例 | WindowsのPATHで登録された古いPythonのpipを意図せず使ってしまう | Bashの設定で指定されたPythonのpipを使ってしまう |
問題例にフォーカスし、さらに噛み砕いた解説をすると──
使用シェル | PowerShellで最新のpip設定 | Bashシェルで最新のpip設定 |
---|---|---|
PowerShell | 最新のpipを参照 | 参照しない |
Bash | 参照しない | 最新のpipを参照 |
すなわち、使用するシェルは一定に保つことで、予期せぬエラーを回避できるとも言えます。
現実的に、プロジェクトや目的によって使用するシェルを使い分けるケースはありますが…
③Jupyter Lab 初体験メモ
しばらく、Pythonに触れていなかったこと、Python使用時のPCが違っていたこともあり、Jupyter Notebookを再インストールのためにWEBリサーチ。
すると、見慣れた”Jupyter Notebook”よりも、”Jupyter lab”というワードが目に留まります。
Jupyter Notebookだけでも十分ですが、新しいものを試したいということで、”Jupyter lab”をインストール。
Jupyter NotebookとJupyter labの違い
特徴 | Jupyter Notebook | JupyterLab |
---|---|---|
💻 UIのタイプ | 単一ドキュメントビュー | タブ&パネルによる複数ファイル表示 |
🧩 拡張性 | 限定的(nbextensions で追加可能) | 高度な拡張性(JupyterLab Extensions) |
📂 ファイル管理 | 外部ツールで行うことが多い | 統合されたファイルブラウザを搭載 |
🖼️ 表示の柔軟性 | 基本的にセル単位で処理 | Markdown・コード・画像・ターミナルなど多様 |
🔄 複数ウィンドウ | 不可 | 可能(複数のビューを並べて表示できる) |
📊 開発スタイル | シンプルな解析やメモに向いている | 本格的な開発やデータ分析に向いている |
④”文字化け祭り”と戦う
コードはざっくりと、おぼろげな記憶を手繰り寄せながら書いてみたものの、タイプミス多発でエラーの嵐でした。
JSONファイル生成はできたものの、対話ログ12,000行の(もはや文字数は測り知れない…)
一見contentの文字列は問題ないと思われる。


──Pythonスクリプトでグラフを生成するが、語彙の抽出に問題発生。
グラフの要素が化けてしまう。(エンコードの問題だと思われる)
──ひとまず、正規トークンを抽出するようにスクリプトを修正。
しかし、エラー。
──そのままChatGPTに投げて、スクリプトを修正。
グラフが生成されるが、語彙ではない要素が抽出されている…
このような微調整を繰り返し、グラフを形にしていきました。
NRC & VADER で見えた限界|NRCとは?VADERとは?
- モデル: NRC + VADER (ネガポジ)
- 違和感: ネガポジ 0.05 でも「焦り」や「必死」は拾えない。
- 対処: グラフ読解時に《主観メモ》を同時記録 → 数値×エピソードで補完
結論:数値だけでは感情の“色相”は見えない。主観を重ねて初めて立体になる。
グローバルな設計とは別に、個別でローカルな設計(例えば──日本、男女、年齢層など)を考慮する余地がありかもしれない。
特に島国である日本国では、グローバル視点とは違う。
日本語(国語)は、”漢字&ひらがな”という文字列が存在し、且つ”ひとつの言葉”に”複数の意味”を持たせる特徴がある。
語彙から感情スコアを数値化するという点において、言葉は文脈や背景で変化したり、”行間を読む”という日本独自の文化が文字列に隠れた感情を拾えない。
感情分析モデル|NRCとは?
NRC:NRC Emotion Lexicon(NRC感情辞書)の略称。NRC(Nationnal Research Council Canada)。
カナダ国立研究評議会が開発した感情分析用の辞書。
8つの基本感情に分類される。
- 喜び(joy)
- 信頼(trust)
- 恐れ(fear)
- 驚き(surprise)
- 悲しみ(sadness)
- 嫌悪(disqust)
- 怒り(anger)
- 期待(anticipation)
NRC Emotion Lexicon(NRC感情辞書)の詳細
感情分析モデル|VADERとは?
VADER:Valence Aware Dictionary and sEntiment Reasoner の略称。感情分析に特化した辞書+ルールベースのモデル。
- ポジティブ、ネガティブ、ニュートラルの分類+複合スコア(compound)を算出
- 絵文字、スラング、感嘆符、大文字強調なども感情スコアに反映
- 否定語(not, n’t)や文脈反転(butなど)も対応
VADERの出力形式は、ネガティブ(neg)、ニュートラル(neu)、ポジティブ(pos)、総合スコア(compound)。
neg、neu、pos、の値は0~1の範囲で、3つの合計値は1.0になるように正規化されている。
compoundの値は-1.0~1.0の範囲で、全体の感情を1つの値で表す。
分類 | compoundの範囲 |
---|---|
ポジティブ(pos)の”しきい値” | ≧+0.05 |
ニュートラル(neu)の”しきい値” | >-0.05 and<+0.05 |
ネガティブ(neg)の”しきい値” | ≦-0.05 |
語彙頻度が暴いた“問い中毒”


- Top20 には
image / canvas / xaml
が並ぶ — 業務の痕跡 - 同時に
why / how / if
が上位
示唆:問い語の頻度は “思考の温度” を映すバロメータになるのでは?
問いを発する瞬間、それは自身が持つ”探求心”、”好奇心”が感情を揺さぶり、ある種の”問い中毒”の状態に陥っているのかもしれない。
可視化はゴールではなく鏡だった
Python グラフから得た一番大きな収穫は「線」ではなく「跳ね返り」だった。
- グラフ → 記憶を呼び水 → 体感と照合 → 新たな疑問が浮上
- 可視化は 思考を循環させるインタラクション装置
グラフに投影された感情分析は、輪郭を持たない”こころ”を映し出しているかもしれない。
付録|Notebook & レシピ(近日公開)
- コード全文 + サンプルログ
- つまずきポイント即席 FAQ
- PDF: “語彙・感情分析クイックレシピ”
予告|体験できる Web アプリ計画
Next.js × TS × Tailwind で、以下の機能を実装予定。
- 対話ログ貼り付け → 語彙 & 感情グラフ即生成
- 《主観メモ欄》 付き — 数値と感情を同時入力
- 配布予定の日記アプリと連携した感情グラフ生成
コメント