COTOHAで感情を読む

#はじめに
この記事は[【Qiita x COTOHA APIプレゼント企画】](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=top_banner)に参加しています。

~~プレゼントが欲しいです~~

#なにをするのか
COTOHA APIを使ってニュースの感情分析をしてしまおうという趣向の記事です(~~好きな子の感情を読むわけではない~~)

将来的には株価などの増減を予測する際などに利用していければなと考えています。

#COTOHA APIって??
[COTOHA API](https://api.ce-cotoha.com/contents/index.html)とは、NTT Communications様が開発された日本語に特化した解析サービスです。

日本語の自然言語処理をしたことがある方ならわかると思うのですが

**日本語は色々とめんどくさい**😨

日本語解析の優秀なライブラリとしてはMecabなどもあるのですが~~丸投げできるならそっちの方が嬉しいので~~COTOHAの方がわかりやすいので今回はCOTOHAを使っていきます。

#COTOHAを使う
COTOHAを使うためには会員登録が必要です。
各APIごと1000リクエスト/日まで**無料**で使うことが出来ます

[ｺｺｶﾗﾄｳﾛｸ](https://api.ce-cotoha.com/contents/index.html)

登録したらマイページにある認証情報を後で使うのでメモしておきましょう

#プログラムの実装 その1
まず、ニュースのスクレイピングを行う部分を実装していきましょう。

ニュースの内容は前述した通り、株価の予測に使うデータになるため[流通ニュース](https://www.ryutsuu.biz/)様より収集させていただきます。


```python:scrape.py
# -*- coding: utf-8 -*-
import urllib3
from bs4 import BeautifulSoup
import time

from negapos_cotoha import CotohaApi

def scrape(inst):
    url_lis = []
    title_lis = []
    all_news_lis = []
    end_point = []
    point_lis = []
    
    target = input('収集したい企業名を入力してください>>')
    
    url = 'https://www.ryutsuu.biz/?s=' + target
    http = urllib3.PoolManager()
    response = http.request('GET',url) 
    soup = BeautifulSoup(response.data, "html.parser")
    
    result = soup.find(id='listPage').find_all('a')
    for link in result[1:11]:
        url_lis.append(link.get('href'))
        title_lis.append(link.get_text())
    
    for access in url_lis:
        news_lis = []
        response = http.request('GET',access)
        soup = BeautifulSoup(response.data, "html.parser")
        title = soup.find('h1')
        if title.get_text()[0:len(target)] != target:
            continue
        else:
            if '閉店' in title.get_text():
                end_point.append(True)
            else:
                end_point.append(False)
        text = soup.find(id='contInner').find_all('p')
        
        for link in text:
            news_lis.append(link.get_text())
        
        if news_lis != []:
            maped_lis = map(str, news_lis)
            news = ','.join(maped_lis)
            all_news_lis.append(news)
    
    
    for tex in all_news_lis:
        print(tex)
        point_lis.append(inst.negaposi(tex,end_point[all_news_lis.index(tex)]))
        time.sleep(3)
    
    return point_lis
    
if __name__ == "__main__":
    f = open('token.txt')
    lines = f.readlines()  
    for i in range(len(lines)):
        lines[i] = lines[i].replace("\n",'')
    inst = CotohaApi(lines[0], lines[1], lines[2], lines[3])
    point_lis = scrape(inst)
```

ここで得られたニュースのテキスト部分を感情分析を行う関数に投げます。

#プログラムの実装 その2
次は、実際にCOTOHA APIを利用して感情分析を行う側のプログラムを実装していきます。

ここでの初期設定やリクエスト送信部などは

[自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f)
[「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き](https://qiita.com/youwht/items/16e67f4ada666e679875)

上記の記事を参考にしたのでぜひ一読を

プログラム本体はこんな感じ

```python:negapos_cotoha.py
# -*- coding: utf-8 -*-
import os
import urllib.request
import json

class CotohaApi:
    def __init__(self,client_id, client_secret, developer_api_base_url, access_token_publish_url):
        self.client_id = client_id
        self.client_secret = client_secret
        self.developer_api_base_url = developer_api_base_url
        self.access_token_publish_url = access_token_publish_url
        self.getAccessToken()
        
    def getAccessToken(self):
        url = self.access_token_publish_url
        headers={
            "Content-Type": "application/json;charset=UTF-8"
        }
        data = {
            "grantType": "client_credentials",
            "clientId": self.client_id,
            "clientSecret": self.client_secret
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        res = urllib.request.urlopen(req)
        res_body = res.read()
        res_body = json.loads(res_body)
        self.access_token = res_body["access_token"]
    def callCotohaApiCommon(self, url, data):
        headers= {
            "Authorization": "Bearer " + self.access_token,
            "Content-type":"application/json;charset=UTF-8",
        }
        data = json.dumps(data).encode()
        req = urllib.request.Request(url, data, headers)
        
        CONNECTION_RETRY_COUNT = 2
        
        for counter in range(1, CONNECTION_RETRY_COUNT + 1):
            try:

                res = urllib.request.urlopen(req)
                break
            except urllib.request.HTTPError as e:
                if e.code == 401:
                    print("Please Retry")
                    self.access_token = self.getAccessToken()
                    headers["Authorization"] = "Bearer " + self.access_token
                    req = urllib.request.Request(url, data, headers)
                else:
                    print ("<Error> " + e.reason)
                    return ""
            except Exception as e:
                print(e)
                return ""
        
        res_body = res.read()    
        res_body = json.loads(res_body)
        return res_body["result"]["score"]
    
    def negaposi(self, text,end_point):
         url = self.developer_api_base_url + "nlp/v1/sentiment"
         data = {
            "sentence": text
         }
         return self.callCotohaApiCommon(url, data)
```

これで完成です！
(end_pointはbool型を持っていて閉店記事であれば評価をマイナスしようとしていましたが未実装です)

#まとめ
実行結果はリストに返すようになっています
中身はこんな感じ
<img width="294" alt="point.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/551a8832-b84d-0acf-6371-baf55b513e7a.png">

無事取得してきた記事の感情を分析することができました

#さいごに
今回は[COTOHA API](https://api.ce-cotoha.com/contents/index.html) を利用してニュース記事の感情分析を行いました

無料で手軽に利用できるので是非利用してみてはいかがでしょうか

他にも様々な機能があるので詳しくは[公式サイト](https://api.ce-cotoha.com/contents/index.html)またはCOTOHAタグで他の記事を読んでみてください

~~**いいねください**~~