LoginSignup
3
2

More than 3 years have passed since last update.

COTOHAで感情を読む

Last updated at Posted at 2020-02-14

はじめに

この記事は【Qiita x COTOHA APIプレゼント企画】に参加しています。

プレゼントが欲しいです

なにをするのか

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

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

COTOHA APIって??

COTOHA APIとは、NTT Communications様が開発された日本語に特化した解析サービスです。

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

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

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

COTOHAを使う

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

ココカラトウロク

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

プログラムの実装 その1

まず、ニュースのスクレイピングを行う部分を実装していきましょう。

ニュースの内容は前述した通り、株価の予測に使うデータになるため流通ニュース様より収集させていただきます。

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で使ってみた
「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き

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

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

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型を持っていて閉店記事であれば評価をマイナスしようとしていましたが未実装です)

まとめ

実行結果はリストに返すようになっています
中身はこんな感じ
point.png

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

さいごに

今回はCOTOHA API を利用してニュース記事の感情分析を行いました

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

他にも様々な機能があるので詳しくは公式サイトまたはCOTOHAタグで他の記事を読んでみてください

いいねください

3
2
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
3
2