#動機
コロナウィルス大流行で最近は暗いニュースばかり…
→明るいニュースしか目に入らなければポジティブな気持ちになれるはず!
#作ったもの
Googleの検索結果を内容が暗いほど見えづらく表示するChrome拡張機能。
Chromeストア:Opty
github
###実際の画面
暗いサイト | 明るいサイト |
---|---|
###使い方
ここからChrome拡張機能をインストールして、検索するだけ!
参考:拡張機能のインストール方法
#環境
人員:大学生2名(井上智裕、渡辺豪志)
制作期間:1日
Cloud Functions
Python 3.7
JavaScript
MeCab
#明るさ判定
文章を単語に分解して、要素ごとに明るいか暗いかの判定をします。
文章を単語に分解する処理には、MeCabを利用しています。
たとえば、
import MeCab
tagger = MeCab.Tagger()
result = tagger.parse('新型コロナウィルスが世界的に大流行しています。')
print(result)
という処理を実行すると、
新型 名詞,一般,*,*,*,*,新型,シンガタ,シンガタ
コロナ 名詞,一般,*,*,*,*,コロナ,コロナ,コロナ
ウィルス 名詞,一般,*,*,*,*,ウィルス,ウィルス,ウィルス
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
世界 名詞,一般,*,*,*,*,世界,セカイ,セカイ
的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
に 助詞,副詞化,*,*,*,*,に,ニ,ニ
大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ
流行 名詞,サ変接続,*,*,*,*,流行,リュウコウ,リューコー
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
のように分解されます。
分解された結果からそれぞれの単語の活用されてない形を取り出して利用します。
要素の明るさ判定には、東北大学の乾・鈴木研究室が公開している日本語評価極性辞書を使わせていただきました。
こちらの辞書では、日本語の用言をポジティブ(明るい)またはネガティブ(暗い)に、名詞をp(ポジティブ)、n(ネガティブ)、e(どちらでもない)の3段階に分類しています。
ネガ(経験) あがく
ネガ(経験) あきらめる
ネガ(経験) あきる
ネガ(経験) あきれる
ネガ(経験) あきれる た
ありがたさ p 〜がある・高まる(存在・性質)
ありがたみ p 〜がある・高まる(存在・性質)
ありがた迷惑 n 〜である・になる(評価・感情)主観
ありのまま e 〜である・になる(評価・感情)主観
あるがまま e 〜である・になる(評価・感情)主観
文章の構成要素のそれぞれをポジティブなら1、ネガティブなら-1、それ以外なら0と置き換えて、その平均を文章の明るさとしています。
以下、開発中につまずいたポイントです。
##つまずきポイント1:極性辞書 ≠ 単語ごとの明るさ
文章を単語に切り分けて、単語をkeyに極性辞書を検索すればいいかと安易に考えていたのですが、そんな単純ではなかったです。極性辞書には"良い"のような単語単体だけでなく、"良くない"というように2つ以上の語(この場合は"良い"+"ない")からなる要素も登録されています。
そのため、複数の単語からなる要素で検索できるように辞書を再構成し、pickleにしてから利用しています。
# 辞書に格納
for line in pn_noun_file:
line = line.replace('\n', '').split('\t')
if line[1] == 'e': # ポジティブでもネガティブでもない行は無視
continue
# 極性辞書に登録されている単語を基本形に変換したリスト
basic_form = convert_to_basic_form(line[0])
# 基本形が取得できない行と基本形が1文字になる行については無視
if not basic_form:
continue
elif len(basic_form) == 1 and len(basic_form[0]) == 1:
continue
key = basic_form[0]
if key not in pn_dict:
pn_dict[key] = {}
# 基本形をつなぎ合わせたものと明るさを組みにして格納
pn_dict[key][(',').join(basic_form)] = 1 if line[1] == 'p' else - 1
##つまずきポイント2:楽しくない = ポジティブ?
"良くない"がネガティブな要素として極性辞書に登録されている一方で、"楽しくない"は登録されていないため、"楽しい"という部分にだけ反応してポジティブな単語だと判定されてしまいました。そこで、~ないという形になった場合は、それまでの部分の明るさの値が反転するようにしました。
# PN判定。リクエスト中の要素のPN値の平均を返す。
def calc_pn(basic_form):
pn_dict = pickle.load(open('pn.pkl', 'rb'))
pn_values = [] # 文章内の各要素のPN判定の数値を格納
while basic_form:
pn_value = 0
del_num = 1 # リストから削除する件数
beginning = basic_form[0] # 先頭の単語をkeyにする
if beginning in pn_dict:
for index, word in enumerate(basic_form):
if word == "。" or word == "、": # 文の句切れが来たら、中断する
break
if index == 0:
joined_basic_forms = beginning
else:
joined_basic_forms += ',' + word
if word == "ない" and del_num == index: # ポジネガ反転が必要
print('reverse')
pn_value *= -1
del_num = index + 1
if joined_basic_forms in pn_dict[beginning]:
pn_value = pn_dict[beginning][joined_basic_forms]
del_num = index + 1
pn_values.append(pn_value)
del basic_form[0:del_num]
return sum(pn_values) / len(pn_values)
#改善ポイント
- 速度が遅い:現状、検索結果表示からスタイル反映まで3秒くらいかかる。
- 明るいページの装飾:明るいほど目立つようにしたい。
#最後に
コロナ自粛で時間を持て余していたので、春休み中に勉強を兼ねて作ってみました。
他にも開発中です!
よければ、LGTMとツイッターのフォローお願いします!
#参考文献