はじめに
この記事は【Qiita x COTOHA APIプレゼント企画】に参加しています。
プレゼントが欲しいです
なにをするのか
COTOHA APIを使ってニュースの感情分析をしてしまおうという趣向の記事です(好きな子の感情を読むわけではない)
将来的には株価などの増減を予測する際などに利用していければなと考えています。
COTOHA APIって??
COTOHA APIとは、NTT Communications様が開発された日本語に特化した解析サービスです。
日本語の自然言語処理をしたことがある方ならわかると思うのですが
日本語は色々とめんどくさい😨
日本語解析の優秀なライブラリとしてはMecabなどもあるのですが丸投げできるならそっちの方が嬉しいのでCOTOHAの方がわかりやすいので今回はCOTOHAを使っていきます。
COTOHAを使う
COTOHAを使うためには会員登録が必要です。
各APIごと1000リクエスト/日まで無料で使うことが出来ます
登録したらマイページにある認証情報を後で使うのでメモしておきましょう
プログラムの実装 その1
まず、ニュースのスクレイピングを行う部分を実装していきましょう。
ニュースの内容は前述した通り、株価の予測に使うデータになるため流通ニュース様より収集させていただきます。
# -*- 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最速チュートリアル付き
上記の記事を参考にしたのでぜひ一読を
プログラム本体はこんな感じ
# -*- 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型を持っていて閉店記事であれば評価をマイナスしようとしていましたが未実装です)
まとめ
無事取得してきた記事の感情を分析することができました
さいごに
今回はCOTOHA API を利用してニュース記事の感情分析を行いました
無料で手軽に利用できるので是非利用してみてはいかがでしょうか
他にも様々な機能があるので詳しくは公式サイトまたはCOTOHAタグで他の記事を読んでみてください
いいねください