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

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

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

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

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

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

http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html

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

![スクリーンショット 2021-12-05 16.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/7119bf1b-842a-2d45-4b51-cf190c41cf1e.png)

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

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

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


# 分析対象データフレーム
前回のLINE分析記事を参考にしてください。

https://qiita.com/ishidao/private/f68c5274bb2883bc453e

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

![スクリーンショット 2021-12-05 16.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/b11fa47a-fcb7-3ba3-686b-6c34d5ef6a59.png)

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



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

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

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

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

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

```python
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から極性値を引っ張ってきたいと思います。

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/0fd1281d-d5ca-12f1-28d0-c71b35b92412.png)



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


# データの確認
全体感はこんな感じです。
写真や通話に対して、ネガティブの極性がついているので、その分マイナスに寄っていますね。
![スクリーンショット 2021-12-05 17.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/c3067731-8c35-51a4-aec2-86ef492acf2c.png)

ここで注意していただきたいのが、利用している辞書の特性についてなのですが、
![スクリーンショット 2021-12-05 17.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/382bca63-5149-fb9c-ebc8-175fd58dc199.png)

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

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

```tex
me	-244.388739
you	-273.091161
```

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