Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

文章の恐怖度合を定量化する(感情判定)

文章の感情判定を行います。ある感情(ここでは恐怖)を表現する単語が文章中にいくつあるかをカウントし、文章の文字数で割って定量化します。

準備

判定には感情を表現する単語のリスト・辞書が必要となります。そこで長岡技術科学大学 自然言語処理研究室のウェブサイトで掲載されているSNOW D18:日本語感情表現辞書を使わせていただきます。概要は以下の通り。

・約2,000表現を収録し、各表現に対して我々が独自に定義した48分類の感情を付与しています。
・感情リスト)安らぎ、楽しさ親しみ、尊敬・尊さ、感謝、気持ちが良い、誇らしい、感動、喜び、悲しさ、寂しさ不満、切なさ、苦しさ、不安、憂鬱、辛さ、好き、嫌悪、恥ずかしい、焦り、驚き、怒り、幸福感、恨み、恐れ(恐縮等の意味で)、恐怖、悔しさ、祝う気持ち、困惑、きまずさ、興奮、悩み、願望、失望、あわれみ、見下し、謝罪、ためらい、不快、怠さ、あきれ、心配、緊張、妬み、憎い、残念、情けない、穏やか

リンク先からダウンロードしたファイルは D18-2018.7.24.xslx という名前のエクセルファイルで、4つのシート(感情分類、作業者A、作業者B、作業者C)からなります。その内のシート'作業者A'をcsvファイル'D18-2018.7.24.A.csv'としてjupyter notebookファイル(.ipynb)と同じディレクトリに保存します。

D18-2018.7.24.A.csv の内容

Word Katakana Emotion
哀 アイ 悲
愛 アイ 好親安尊
相いれない アイイレナイ 不

文章の怖さ度合の定量化の手順としてはまず、恐怖のラベル(リスト内では'怖'でマークされている)が付いた単語を日本語感情表現辞書から抽出・リスト化します。リストには'怖'ラベルの付いた96個の単語が含まれています('息を飲む', '畏怖', '色を失う',…)。
続いてチェックする文章内にリスト化した単語が何度出現するかをカウントして
恐怖含まれている単語の出現回数/文章の文字数
定量化します。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
コード

「あまりの恐ろしさに戦慄した私は悲鳴を上げることすらできずにただ震えるだけだった」 という文章について恐怖度合を定量化します。

import csv

symbol = '怖'  # カウントする感情記号
word_list = []  # 単語リストの生成

with open('D18-2018.7.24.A.csv', encoding='utf-8') as file:  # 単語リストファイルの呼び出し
    reader = csv.reader(file, delimiter='\t')
    next(reader)  # ヘッダー行をスキップ 
    for row in reader:
        if symbol in row[2]:  #  カウントする感情記号を持つ場合
            word_list.append(row[0])  # 単語リストに追加

sentence = 'あまりの恐ろしさに戦慄した私は悲鳴を上げることすらできずにただ震えるだけだった'
sentence_len = len(sentence)  # 文章の文字数
counter = 0  # 出現カウンターの初期化
for word in word_list:
    word_count = 0  # 単語別出現カウンターの初期化
    word_count = sentence.count(word)  # 単語の出現回数をカウント 
    counter = counter+word_count  # 出現カウンターに単語別出現数を追加
print(counter/sentence_len)  # 出現回数/文章の文字数 を表示        
実行結果

恐怖を表す単語4つ(恐ろしさ、戦慄、悲鳴、震える)がカウントされ、文章が39文字なので恐怖度合が4÷39=0.102…と定量化されます。

0.10256410256410256


コード

怖くない文章に変えてみます。
「本日もお忙しい中、当店へと大勢多数様のご来店はまことにまことにありがとうございます」 という文章について恐怖度合を定量化します。

import csv

symbol = '怖'  # カウントする感情記号
word_list = []  # 単語リストの生成

with open('D18-2018.7.24.A.csv', encoding='utf-8') as file:  # 単語リストファイルの呼び出し
    reader = csv.reader(file, delimiter='\t')
    next(reader)  # ヘッダー行をスキップ 
    for row in reader:
        if symbol in row[2]:  #  カウントする感情記号を持つ場合
            word_list.append(row[0])  # 単語リストに追加

sentence = '本日もお忙しい中、当店へと大勢多数様のご来店はまことにまことにありがとうございます'
sentence_len = len(sentence)  # 文章の文字数
counter = 0  # 出現カウンターの初期化
for word in word_list:
    word_count = 0  # 単語別出現カウンターの初期化
    word_count = sentence.count(word)  # 単語の出現回数をカウント 
    counter = counter+word_count  # 出現カウンターに単語別出現数を追加
print(counter/sentence_len)  # 出現回数/文章の文字数 を表示        
実行結果

文章に恐怖を表す単語が含まれていないため恐怖度合は0.0となりました。

0.0

以下のサイトを参考にさせていただきました

SNOW D18:日本語感情表現辞書

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村