1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

データ分析初心者がML-Askでサラリーマン川柳を感情分析したみたら失敗した。

Posted at

#記事を作成した背景
今後データ分析に携わる職種に就くにあたって、Pythonでデータ分析の練習をしたいなと考えました。
そこで以下のHPを発見し、真似して挑戦してみました。
pythonで感情分析に入門

なんとなくサラリーマン川柳はネガティブな句が多いイメージなので、その仮説が正しいかを検証してみようと考えました。
※初めに書いておくと、残念ながらタイトル通りうまいこと検証できませんでした。

#概要
以下から取得したサラリーマン川柳をすべてML-Askにて1句ごとに「ネガティブ」「ポジティブ」「ニュートラル」のいずれかを判定し、それぞれがどこに属するのかを振り分けて集計していきます。
判断できないものは「例外」として別途集計します。
第33回サラリーマン川柳|キャンペーン情報

対象データは第32回の優秀作(1位~100位)と第5回以降の1位の作品です。

ML-Askの分析結果は以下のような辞書型で出力されるので一番わかりやすい「orientation」から判断を行います。


>{'text': '近年では、親愛の情を込めて友人、知人や親族にも贈るお歳暮へと少しずつ変化してきているようです。',
> 'emotion': defaultdict(<class 'list'>, {'suki': ['親愛']}),
> 'orientation': 'POSITIVE', 
> 'activation': 'NEUTRAL', 
> 'emoticon': None, 'intension': 0, 
> 'intensifier': {}, 
> 'representative': ('suki', ['親愛'])}

#コーディング
大したコードではないのですべて記載します。

サラリーマン川柳.py
#必要ライブラリをインポート
from mlask import MLAsk
#ファイルのオープン
file_data = open("C:\\Users\\owner\\Desktop\\サラリーマン川柳.txt","r",encoding="utf-8")
#※上記のデータは上述のHPより対象川柳部分のみ張り付けただけのテキストファイルです。
emotion_analyzer = MLAsk()
#初期化
senryu =[]
positive_count = 0
negative_count = 0
neutral_count = 0
exception_count = 0
for line in file_data:
    #改行コードを削除して、感情分析を行います。
    emotion_senryu = emotion_analyzer.analyze(line.replace("\n",""))
    #orientationが設定されない場合があるので、try exceptで囲っています。
    try:
        if  "POSITIVE" in emotion_senryu['orientation']:
            positive_count += 1
            #print("POSITIVE") ←デバッグ用です。
            #print(line)
        elif "NEGATIVE" in emotion_senryu['orientation'] :
            negative_count += 1
            #print("NEGATIVE")
            #print(line)
        else:
            neutral_count += 1
    #判定不能の場合はexception_countに割り振ります。
    except:
        exception_count += 1
#トータルの件数
print("ネガティブ:" + str(negative_count))
print("ポジティブ:" + str(positive_count))
print("ニュートラル:" + str(neutral_count))
print("例外:"+str(exception_count))

#実行結果
以下のようになりました。

感情 件数
ネガティブ 8
ポジティブ 3
ニュートラル 3
例外 113

例外が発生しすぎています。。。

例外処理が発生した分析結果を抜き出してみると、以下の通りorientationが設定されていないことが分かります。

{'text': '五時過ぎたカモンベイビーUSAばらし', 'emotion': None}
{'text': 'いい数値出るまで測る血圧計', 'emotion': None}
{'text': 'メルカリで妻が売るのは俺のもの', 'emotion': None}
{'text': 'ノー残業趣味なし金なし居場所なし', 'emotion': None}
{'text': '「やせなさい」腹にしみいる医者の声', 'emotion': None}
{'text': 'やっと縁切れた上司が再雇用', 'emotion': None}
{'text': '手紙書き漢字忘れてスマホ打ち', 'emotion': None}
{'text': '下腹が気づかぬうちにひょっこりはん', 'emotion': None}

#結論

確かに判断できたものでは「ネガティブ」が多めではありましたが、さすがに母集団が127件で判断できないものが113件もあったために、分析ができていないと言わざる負えません。

どうしてこうなった。。。

なので今後もし、似たようなことを行う場合の対策と反省を自分用に記載しました。

【対策】
今回は辞書ベースの感情分析だったので別の手法を用いて分析を行えば、もう少し良い結果が出るのではないかと思います。
※例えば以下のからの引用ですが、機械学習で正解付きコーパスを学習させるなどです。

pythonで日本語文の感情分析(+言語処理の基礎)

【反省】
そもそも感情分析の練習が目的なのだから川柳ではなく、twitterの文章のようなわかりやすい別の題材で行うべきでした。
川柳は文字数の制限や、「好き」「嫌い」と直接的な表現ではなく文脈で情景や感情を表現するため、練習で行うには不適切でした。

もしよかったら、「ここをこうすればよかったのに」といったアドバイスなどをいただけると嬉しいです。

以上です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?