Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@surai_uni

共闘ことばRPG コトハマン

More than 1 year has passed since last update.

はじめに

皆さんはコトダマンというゲームを御存じでしょうか

コトダマンとはiOS/Android向けに配信されている共闘ことばRPGゲームのことです

ルールとしては空いた枠に文字を埋めていきコンボを組んで敵を倒す、という感じのものになっています

cotodaman.jpg

共闘ことばRPGコトダマン好評配信中!!

iOS
https://itunes.apple.com/jp/app/id1298368256
Android
https://play.google.com/store/apps/details?id=com.sega.Kotodaman

なにをするのか

さて、媚を売り切ったところで本題に入っていこうと思います

今回やっていくのはCOTOHA APIを使ってコトダマンのようなものを作ってみようというものです

(コトダマンのようなものといっても単語ごとに分けてコンボ数を数えるだけですが)

プログラム本体

コトハマン.py
cotohaman.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で使ってみた

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?