#はじめに
皆さんはコトダマンというゲームを御存じでしょうか
コトダマンとはiOS/Android向けに配信されている共闘ことばRPGゲームのことです
ルールとしては空いた枠に文字を埋めていきコンボを組んで敵を倒す、という感じのものになっています
共闘ことばRPGコトダマン好評配信中!!
iOS
https://itunes.apple.com/jp/app/id1298368256
Android
https://play.google.com/store/apps/details?id=com.sega.Kotodaman
#なにをするのか
さて、媚を売り切ったところで本題に入っていこうと思います
今回やっていくのはCOTOHA APIを使ってコトダマンのようなものを作ってみようというものです
(コトダマンのようなものといっても単語ごとに分けてコンボ数を数えるだけですが)
#プログラム本体
コトハマン.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"][0]["tokens"]
def cotodama(self,coto):
url = self.developer_api_base_url + "nlp/v1/parse"
data = {
"sentence": coto
}
coto = self.callCotohaApiCommon(url, data)
if len(coto) == 1 and coto[0]["pos"] == "名詞":
return coto
return ""
def cut(self):
word_lis = []
result_lis = []
coto = input("文字を入力してください(7文字)")
for i in range(0,6,1):
for j in range(7,0,-1):
if i+1 == j: break
word_lis.append(coto[i:j])
for tex in word_lis:
if tex[0] == "ん":
continue
result_lis.append(self.cotodama(tex))
result_lis = list(filter(lambda a: a!="",result_lis))
return result_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])
result = inst.cut()
for res in result:
print(res[0]["lemma"])
print("{}COMBO!".format(len(result)))
#少しだけ解説
序盤のAPI設定and呼び出し部分は
↓この記事か公式リファレンスを読んでください
「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き
このテンプレートに与えるデータを加工する部分の解説をします
七文字のひらがなを入力として受け取り、左から長い順に入力を分割してリストに格納しています
その後分割した単語ごとにAPIに投げていくのですが、"ん"が単語の最初にいるとなぜか名詞判定されてしまうので取り除いています
そして帰ってきた結果が分割されず、単語のみでかつ名詞であった場合に結果のリストに格納しています
最後に、それを順に出力して終了です
#結果
入力>>さいかくあいま
才覚
さいか
際
いかくあ
威嚇
いか
くあいま
くあい
くあ
合間
あい
今
12COMBO!
適当に画像検索から見つけてきた単語を入れましたが、人間には理解できない単語も出てきてしまっていますね
#まとめ
今回作ったものの問題点としては
・複数回APIコールしなければいけない
・ちょっと人間には理解できない単語が出てきてしまう
修正案があればコメントいただけると助かります
#さいごに
この記事は【Qiita x COTOHA APIプレゼント企画】に参加しています
いいねください
#参考ページ
・COTOHA API
・公式リファレンス
・「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き
・自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた