1
0

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 3 years have passed since last update.

LINEのトークスクリプトから、ネガティブ・ポジティブ感情を判定する

Last updated at Posted at 2021-12-08

はじめに

LINEのトークスクリプト分析記事の続きです!
今回は、単語感情極性対応表を利用して、トークのネガポジ判定をしていきたいと思います。

いつもの注意

分析対象のデータは、パーソナルデータとなっております。
利用する際は、相手に必ず確認を取ること。また、その取り扱いには十分注意するようお願いいたします。

本記事は単なるHowTo記事であり、個人情報流出等のいかなる責任であっても負いかねます。

利用辞書

ここでは、単語感情極性対応表から日本語版を使用させていただきたいと思います。

こちらからダウンロードできます!

ダウンロードしたファイルをデータフレームにして確認するとこんな感じです。

スクリーンショット 2021-12-05 16.12.07.png

pn_dfを作成するコードはこちら。

pn_df = pandas.read_csv('{{downloadした辞書のpath}}/pn_ja.dic',\
                   sep=':',
                   encoding='shift-jis',
                   names=('Word','Reading','POS', 'PN')
                  )

注意事項としては、encodingで日本語を読み取れるようにしておくことくらいでしょうか。

分析対象データフレーム

前回のLINE分析記事を参考にしてください。

こちらを参考にしていただくと、このようなデータフレームが取得できます。

スクリーンショット 2021-12-05 16.20.49.png

これに対して、トークスクリプトのネガポジを数値化していきたいと思います。

作戦

ネット記事には色々ありましたが、僕の数値化作戦は以下でいきたいと思います。

  • 分析対象のDFを行ごとに形態素解析する
  • 各形態素と極性辞書から一致をかけて、極性値を取得
  • 文章の極性値平均を取り、新しいカラムに保存する

1.行ごとに形態素解析

形態素解析にはmecabを使用します。
また、業界の標準っぽい、neologdというシステム辞書を使うことにします。

mecabの使い方等の説明は一旦省きたいと思います。

今回は分かち書きされた単語のみを分析したいので、mecabのparceToNodeを利用して、文章を分かち書きします。

for text in temp_df['talk'].head(30):
    node = tagger.parseToNode(text)
    while node:
        print(node.surface)
        node = node.next

余談ですが、僕はここで久しぶりに、whileの無限ループにハマってしまい凹みました。笑

また、お気づきかとは思いますが、形態素解析は実行に時間がかかります。
過去のテキスト全てに対して解析をかけるとなると、分散処理をかましてあげないとやってられないくらいには実行時間くが長いです。

一旦動かしてみたいので、ここの分散処理はまた記事を書きます。
[執筆中 : 形態素解析の処理を、マルチスレッド化させるpythonの分散処理で時短する]

2.辞書を使って極性値を取得

node.surfaceで分かち書きした単語を取得することに成功したので、pn_dfから極性値を引っ張ってきたいと思います。

pn_value = []
tagger = MeCab.Tagger("{{neologdのpath}}/mecab-ipadic-neologd")
text = "並行分散処理かけてあげないと終わらないわ。"
node = tagger.parseToNode(text)
while node:
    print(node.surface)
    word_value = pn_df[pn_df['Word']==node.surface]['PN'].values
    pn_value.append(word_value[0]) if len(word_value)>0 else pn_value.append(0)
    node = node.next

1つのtextに対して、このようにnodeを回してあげると、pn_valueというリストに極性値が入っていきます。
ここでは、pn_dfの名前一致に引っかからない単語の極性値は0としています。

ちなみに、「並行分散処理かけてあげないと終わらないわ。」というテキストに対する極性値はこんな感じです。

スクリーンショット 2021-12-05 17.32.36.png

3.文章の極性値平均をとる

( 2で作成した極性値リストのsum ) / ( リストの数 )
をしてあげれば、その文章の平均の極性値を取得することができます。

データの確認

全体感はこんな感じです。
写真や通話に対して、ネガティブの極性がついているので、その分マイナスに寄っていますね。
スクリーンショット 2021-12-05 17.35.26.png

ここで注意していただきたいのが、利用している辞書の特性についてなのですが、
スクリーンショット 2021-12-05 17.41.27.png

このように、登録されている単語数にも、ネガポジで偏りがあります。
なので、そもそもの話ですが、ネガティブな単語はポジティブなものと比較して抽出されやすい。という特徴を理解しておかないといけません。

最後に

極性値の合計を出してみました。
この結果を見る限り、僕よりも相手の方が、ネガティブワードを使っているようです。笑

me	-244.388739
you	-273.091161

ネガポジはあくまでも参考として、楽しむものとして使うのが良さそうでした。
ご精読ありがとうございます。

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?