見出し画像

『感情』のスコア化方法|22年ライフログ研究(論文解説②)【第5話】

もし、自分の22年分の感情をグラフで可視化したら、
どうなるのでしょうか。

これまで、自身が22年間記録する日記・チャット等による、

 ・第1話では、人生を可視化する方法
 ・第3話では、学術論文を執筆投稿した話
 ・第4話では、「関心スコア」の変換方法
  (論文の裏側その1)

を記事にしました。

今回は、論文の裏側その2

この膨大なテキストデータを、どのように「感情スコア」に変換したのか
を整理します。


▼第3話(論文化した話)


■「感情スコア」とは?【本題】

「感情スコア」とは、
前話で説明した「関心スコア」とは異なる、ヒトの感情変化を可視化する数値です。

私がどうやって正の感情と負の感情スコア化したかというと、
東北大学の研究室が公開している、
日本語評価極性辞書」という辞書を使いました。

Author(s): Inui-Okazaki Laboratory, Tohoku University
Japanese Sentiment Dictionary (Volume of Verbs and Adjectives) ver. 1.0
Open Resources - 東北大学 乾研究室 / Inui Lab, Tohoku University

Tohoku University

この辞書は、感情表現にスコアをつけるためのものです。
「嬉しい」は+1点「悲しい」は−1点
そんなふうに、22年分のすべてのログに感情スコアを付けるイメージです。

私の1550万文字分のライフログは単語ごとに区切る処理(形態素解析)をしているので、
この「日本語評価極性辞書」と組み合わせることで、22年分の感情をスコア化することができます。
(語数:5,277語、総スコア:32,080点)
(※掲載素解析は第4話をご覧ください)

感情スコア(全5277語の抜粋)
・あがく(足掻く)   -1点  ・あこがれる(憧れる) +1点
・あきらめる(諦める) -1点  ・かなう(叶う)    +1点
・あきる(飽きる)   -1点  ・したう(慕う)    +1点
・あきれる(呆れる)  -1点  ・すすめる(薦める)  +1点
・あわてる(慌てる)  -1点  ・はかどる(捗る)   +1点

やること自体はさほど高度じゃないのですが
実際にやり始めると、まあ難しいです。

というのも、
 ・生ログ1550万字(3000万セル)もあるため、
  普通にやるとPCがフリーズする(プログラムの効率化必須)
 ・ログ量の多い日ハイスコアになりやすい(良くも悪くも)。
 ・時代特有のスラング語に対応してない。

などの課題があるためです。


・対応①:重くてPCがフリーズする問題

22年分のログは、普通に処理するとPCが固まります。
そこで私は、AIと壁打ちしながら、プログラムコードを細かく分割し、
複数に工程を分けることで無理やり対応しました。

# 実際に使用したコードの一部を掲載します(簡略化)。
import pandas as pd
import os
from collections import defaultdict
from tqdm import tqdm

df = pd.read_csv(log_file, encoding="utf-8", dtype=str).fillna("")
def calc_emotion_score(text):
    score = 0
    for word in emotion_words:
        if word in text:
            score += emotion_dict[word]
    return score
df["感情スコア"] = df["会話・日記統合"].apply(calc_emotion_score)

df.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"保存完了:{output_file}")

folder = r"C:\Users\●●\Python\Emotion"
log_file = os.path.join(folder, "●●.csv")
keyword_file = os.path.join(folder, "▲▲.csv")
output_file = os.path.join(folder, "■■.csv")

df_log = pd.read_csv(log_file, encoding="utf-8", low_memory=False)
df_kw = pd.read_csv(keyword_file, encoding="utf-8")

score_dict = defaultdict(set)
for _, row in df_kw.iterrows():
    genre = row["ジャンル"]
    word = str(row["キーワード"]).strip()
    if pd.notna(word) and word != "":
        score_dict[genre].add(word)

def calc_score(text, keywords):
    if pd.isna(text):
        return 0
    return sum(text.count(kw) for kw in keywords)

for genre, keywords in tqdm(score_dict.items(), desc="ジャンル別スコア処理"):
    new_col_name = f"{genre}_スコア"
    df_log[new_col_name] = df_log["会話・日記統合"].apply(lambda x: calc_score(str(x), keywords))

df_log.to_csv(output_file, index=False, encoding="utf-8-sig")
print("スコア追加完了!保存先:", output_file)


・対応②:ログ量によるスコア差問題

たくさん書いた日(熱量が大きい日)が単に高スコアになるのを防ぎ、
一行に込められた『感情の純度』を正しく評価するために、
自然対数による補正を加えました。
補正前(生値)では、文字数と感情スコアの傾向が一致していましたが、
補正によりバランスが取れた結果となりました。
さらに、各週の生ログを逆参照(トレーサビリティ)を行うことで、
当該週の「スコアと実際の感情が概ね一致していること」も確認しました。

(図)感情スコア生値・自然対数補正後/週別)、生ログ文字数(週別)

・対応③:スラング語未対応問題

これは正直どうしようもないので、自身の過去ログ(黒歴史含む)と向き合って、ログに使用されているスラング語をスコアを感情極性辞書に追加しました。
 (追記ワード例:草(+1点)、ワロタ(+1点)、詰んだ(-1点)など)

(図)感情極性辞書にスラング語を追加するイメージ(実際はデータ)

■「感情スコア化」結果(最低・最高)

22年分の「感情スコア化」の最低・最高スコアを紹介します。

・最低スコア:2020年6月21~27日

(スコア-17、偏差値22)

最低スコアは2020年6月頃(コロナ初年度)。
この週のログを見返すと、

2020年
は、コロナ禍初年度で、職場異動もあり、昇進プレッシャーもあり、かなり疲弊していた時期だったようです。

また、仕事の疲労の影響で、
プライベート時間もあまり確保できていなかったようです。
(細かいことは覚えていませんが、辛かった印象は残っています)

【感情スコア最低(偏差値22 )の週のログ抜粋(2020/6/21~27)】
・今月の残業が●●時間を超えそうだ。
・コロナ対応もあり、マジで疲れたぞ。
・いやとにかく疲れた。
・部屋があまりにも汚くて大掃除をした。
 多少マシになったけどまだ汚い・・・
・●●(娘)と一緒にマリオしたけと仕事で疲れて途中から眠かった。。
・●●について悩んでいたけど個人的には●●をするつもり。
・休み明けの仕事で非常に疲れた・・・
・帰宅して●●(ゲーム)をやったけどいつの間にか寝落ちしていた。。
・最近は娘の口が達者になり、今日は奥さんとピアノで口喧嘩している。
・仕事とゲームやりすぎて目が悪くなりそう。

※匿名加工済


続いて、最高スコアです

・最高スコア:2023年4月30~5/6

(スコア+30、偏差値119)

最高スコアは2023年4月末頃(コロナ明け)。
この週のログを見返すと、

 コロナが明けて初のGWということで、とても充実していたようです。
 (断片的にしか覚えていないですが)

【感情スコア最高(偏差値119)の週の
 ログ(2023/4/30~5/6)】 ※抜粋


・コロナが明けてから初めてのGW。
 混雑しそうなので、今年は近場で遊ぼう
・今日は●●のボーリングに行った。
・●●ちゃん(娘)と一緒にゲームをした。
 マリオ3Dワールドとファイアーエンブレムのゲームを一緒にやって、●●君(息子)はそれを面白そうに見ていた。
・コナンの映画(黒鉄の魚影(くろがねのサブマリン))を見に行った。コナン映画は毎年見てるけど、今回もかなり面白かった
・●●ちゃん(娘)と一緒に幻想水滸伝1と2の小説読んでいる。今日は●●のあたりまで進んで、面白くなってきたぞ。
・とって大規模な衣替えをした。
 超大変だったけどやった甲斐があった。
・●●(ペットの犬)を連れて●●に行って、大喜びだった。
 遅くなったので、そのあとサイゼリアで夜ご飯を食べた。安くていいね
・●●ちゃん(娘)が●●の発表会で●●を演奏した。
 上手に弾けてよかった。その後に●●のレストランにいったんだけど、みんな喜んでいた
・●時●●分から●●で●●の映画を見てまあまあ面白かった
 そのあとお昼にお好み焼きを食べて、帰宅後はみんなで公園で大縄跳びをし足りして遊んだ。家に帰った後は少しだけ仮眠をとって、●●ちゃん(娘)と一緒にフィナンシェを作ったりした。
 ※GW中のため仕事関係のログほぼ無し。

※匿名加工済

改めて昔のライフログを読み返すと、
最低スコアの週は、読んでいても重苦しい感じが伝わってきます。
逆に最高スコアの週は、ログ全体が光っているようにすら感じます。

(図)最低スコア/最高スコアの週



■感情偏差値100以上は22年間で10回

感情スコア(週別)を偏差値グラフにしたところ、
22年間で感情偏差値が100を超えた週は10回登場しました。

これらは、自身の人生のハイライトとも言えるのではないでしょうか。

逆に、感情偏差値が極端に低い時期は2013~2014年頃でした。

この時期は環境省(本省)に出向中で、
東日本大震災の災害廃棄物(災害ガレキ・放射性廃棄物)処理対応等に従事していました。

年間残業は1000時間を超えており、ログ自体がほとんど残せない期間ということも相まって、
ログ欠損とメンタル疲弊の両面が要因で、スコアが低くなりました

感情偏差値(週別)

■「感情スコア」と「関心スコア」のシナジー

この「感情スコア」と、
関心スコア(第4話)」を組み合わせれば、例えば、
 ・子どもへの関心が高く楽しかった日 や
 ・仕事への関心が高いけど辛かった日

などがわかります(組み合わせは無限です)。
さらに、生ログで逆参照(トレーサビリティ)すれば、
その要因を分析することも可能なんです。

このシナジーについて、私は大きな可能性・ポテンシャルを感じています。

具体的には、RAG(Retrieval-Augmented Generation)やAIエージェントの進展に伴い、(本人同意が大前提の下で)ライフログの保存が半自動化され、それをAIが文脈ごとに引き出し、再提示することが可能になり得ます。

例えば、将来的にAIが
 「あなたが最も成長していた時期はこの3ヶ月です。その根拠は、仕事への関心が高い、感情スコアも高い、生ログにも“熱中”の記述が多いからです。」
 といった感じに、自身の人生データをAIが提示しながら会話してくれるような未来が来るかもしれません。

心理学的には、リマインダー効果、ノスタルジア効果、ナラティブ再構成、自己効力感上昇などが期待できそうです。

行政施策面では、将来的に、福祉(ケア)、地域活動活性化、フレイル予防、ウェルビーイング向上などに活用できる可能性があります。

つまり、ライフログは単に過去を振り返るためだけの物ではなく
(AI等の進化により)未来の自分を支える「財産」になり得る。
という可能性を期待しています。

(図)感情スコアと関心スコアのシナジー


22年間にわたるライフログから抽出された
「感情偏差値100超」のピークは、
記憶に残ってない人生のハイライト
客観的な証拠と言えます。

逆に、スコアがどん底だった東日本大震災対応時のあの日々も、
今の自分を構成する不可欠なデータ群として、
数値を通じた再評価が可能となりました。

ライフログは、過去の自己理解を深める参考文献であり、
将来的には、未来の意思決定を支援する「生体データ」にもなり得ます。
この「人生の可視化」がもつ社会的なポテンシャルの実証こそが、
「日本ライフログ研究所」を立ち上げた主要な動機の1つです。


こうした研究を今後も少しずつ続けていこうと思います。
もしよろしければ「フォロー」と「スキ」をいただけると、
とても励みになります。

▼論文挑戦の裏話【第6話】

▼本シリーズの起点【第1話】
 https://note.com/lifelog_lab/n/n2f55c09c19bb


▼日本ライフログ研究所 │ 公式サイト

・公式サイトURL:
 https://wide-spirit-498.notion.site/346b4484a04880e8b4b7dbd94f9e602a



いいなと思ったら応援しよう!