結果表示の時に感情がない場合ゼロと表示したい

実現したいこと

感情分析を行っていき、それらの感情値の平均を出したい

前提

ツイートを形態素解析し、それぞれの文の感情値を出し最終的にその平均を出すというプログラムを作っている
その過程で形態素解析し多分の中に感情がない場合にその分は省き結果を表示したいがそれを含んでしまい以下のエラーが出ていると考えている。

発生している問題・エラーメッセージ

あーね アーネ あーね 名詞-固有名詞-一般
は ハ は 助詞-係助詞
あー アー あー フィラー
なるほど ナルホド なるほど 感動詞
ね ネ ね 助詞-終助詞
の ノ の 助詞-連体化
略 リャク 略 名詞-一般
で デ で 助詞-格助詞-一般
使い ツカイ 使う 動詞-自立 五段・ワ行促音便 連用形
ます マス ます 助動詞 特殊・マス 基本形
EOS

[['あーね', '略', '使う'], ['あーね', '納得', '地獄', 'みたい', '左遷', 'する', 'れる', 'わけ', 'じゃなくて', '安心', 'する']]
あーね はあーなるほどねの略で使います
word score
0 あーね None
1 略 None
2 使う None

あーね 納得地獄みたいな左遷されるわけじゃなくて安心したわ ありがと
word score
0 あーね None
1 納得 -0.393442
2 地獄 -0.998336
3 みたい None
4 左遷 -0.4448
5 する None
6 れる None
7 わけ None
8 じゃなくて None
9 安心 0.981397
10 する None

Traceback (most recent call last):
File "c:\sotuken\main.py", line 71, in <module>
mean = (sum(temp) / len(temp))
ZeroDivisionError: division by zero

該当のソースコード

import pandas as pd
import numpy as np
import MeCab

pd.set_option('display.unicode.east_asian_width', True)

感情値辞書の読み込み
pndic = pd.read_csv(r"http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic",
encoding="shift-jis",
names=['word_type_score'])

語と感情値を抽出
pndic["split"] = pndic["word_type_score"].str.split(":")
pndic["word"] = pndic["split"].str.get(0)
pndic["score"] = pndic["split"].str.get(3)

dict型に変換
keys = pndic['word'].tolist()
values = pndic['score'].tolist()
dic = dict(zip(keys, values))

text = 'あーね はあーなるほどねの略で使います END あーね 納得地獄みたいな左遷されるわけじゃなくて安心したわ ありがと END '
lines = text.split(" END ")

mecab = MeCab.Tagger(r'-Ochasen -d "C:\mecab-ipadic-neologd"')

1行目の形態素解析結果を例示
print(mecab.parse(lines[0]))

形態素解析に基づいて単語を抽出
word_list = []
for l in lines:
temp = []
for v in mecab.parse(l).splitlines():
if len(v.split()) >= 3:
if v.split()[3][:2] in ['名詞','形容詞','動詞','副詞']:
temp.append(v.split()[2])
word_list.append(temp)

空の要素を削除
word_list = [x for x in word_list if x != []]

print(word_list)

result = []
文単位の処理
for sentence in word_list:
temp = []
語単位の処理
for word in sentence:
word_score = []
score = dic.get(word)
word_score = (word, score)
temp.append(word_score)
result.append(temp)

文毎にデータフレーム化して表示
for i in range(len(result)):
print(lines[i], '\n', pd.DataFrame(result[i], columns=["word", "score"]), '\n')

文単位の平均値を計算
mean_list = []
for i in result:
temp = []
for j in i:
if not j[1] == None:
temp.append(float(j[1]))
if temp == None:
mean = (sum(temp) / len(temp))

mean_list.append(mean)

データフレーム化して表示
print(pd.DataFrame(mean_list, columns=["mean"], index=lines[0:4]))

試したこと

自らで文単位の平均値を計算の部分をいじってみたがうまくいかなかった

補足情報(FW/ツールのバージョンなど)

プログラムミング初心者で至らない部分をあるかと思いますがご教授いただければと思います。

コメントを投稿

0 コメント