*

AIワーカ実装のためのAPIの説明

1. AIワーカの動作概要

  1. AIワーカは,AIワーカ開発者が用意するCrowd4U外の任意のPC上で動作し,Crowd4Uが提供するタスクの作業を行ない,結果を登録します.
  2. AIワーカを実装するには,こちらで用意するPythonライブラリをダウンロードし,サンプルを書き換える方法と,APIを直接利用して自分で開発する方法がありますが,前者をおすすめします.
  3. こちらで用意するPythonライブラリには,各APIを呼び出すためのラッパーが関数として用意されています.
  4. AIワーカが呼び出すAPI (Pythonライブラリのラッパー関数も同様)は,次の3つのグループに分かれます.
    • 初期化:AIワーカがタスクを行なうクラウドソーシングプロジェクトとの通信の準備をします.
    • AIワーカを開発・AIワーカが学習するための情報入手: タスク一覧やこれまでのタスク結果を入手したり,特定のタスクの結果を求めることができます.
    • 実際にタスクを行なう:Crowd4Uからタスクを入手し,AIワーカがアルゴリズムで求めたそのタスクの結果をCrowd4Uに送信します.
  5. Pythonコードのテンプレートの利用方法を 2節で説明します .Native APIの利用方法は今後掲載します.
  6. このドキュメントの内容は今後変更される可能性があります.その場合は,本ページに記載すると共に,登録されたAIワーカのメールアドレスに連絡します.

2. Pythonライブラリ(APIラッパー関数)による AIワーカの開発 (Version 20170912β)

PythonライブラリのAPIラッパー関数について説明します

実行環境とPythonライブラリの入手方法

グループ1: 初期化 - AIワーカがクラウドソーシングプロジェクトと通信する準備を行なう

API: AIワーカとクラウドソーシングプロジェクトの間を接続する

crowd4pyクラスのクラスメソッドです

crowd4py.API(プロジェクト名,結果を格納するリレーション名)

作成したapiオブジェクトをハンドラーとして,タスクを取得,送信を行う

  1. from __init__ import API_CONF, PROJECT_CONF
  2. import crowd4py
  3. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)

API_CONF,とPROJECT_CONFは,以下の __init__.pyと同じディレクトリ配下にconfig.iniを追加することで自動的に生成され読み込まれます

config.iniの内約はAIワーカーとうして登録した時に此方からお送りします.

__init__.py

  1. # -*- coding: utf-8 -*-
  2. import configparser
  3. import os
  4. cfg_file = os.path.join(os.path.dirname(__file__), 'config.ini')
  5. config = configparser.ConfigParser()
  6. config.read(cfg_file)
  7. API_CONF = config['crowd4u']
  8. PROJECT_CONF = config['project']

config.ini

  1. # -*- coding: utf-8 -*-
  2. [crowd4u]
  3. API_ROOT = https://crowd4u.org/
  4. REQUESTER = 000
  5. GROUP_ID = 00
  6. USER_TOKEN = 00000000000000000000
  7. [project]
  8. ID = 000
  9. PROJECT_NAME = project_name
  10. RELATION_NAME = relation_name

グループ2: AIワーカを開発・AIワーカが学習するのためのデータを取得する

get_relation_data: 呼ばれた時点までに行われたタスクとその結果を返す

Classメソッドから呼び出す場合は引数を指定する必要がある

  1. >>> import crowd4py
  2. >>> crowd4py.API.get_relation_data(project_name="competetion_phase1", relation_name="Results")
  3. {"tid":"1354.1356","task_instance_id":1,"group_id":182,"master_bib_id":"Kyoto_Pref_Kpla-100769607",
  4. "title_1":"建設部門延長産業連関表","volume_1":"","responsibility_1":"","publisher_name_1":"経済調査会",
  5. "issued_1":"1992.0","isbn_1":"","origin_name_1":"京都学・歴彩館","origin_id_1":"100769607",
  6. "origin_url_1":"http://opacs.pref.kyoto.lg.jp/mylimedio/search/book.do?bibid=540085",
  7. "sub_bib_id":"NDL-R100000002-I000002131701-00","title_2":"東京都産業連関表","volume_2":"昭和60年 計数編",
  8. "responsibility_2":"","publisher_name_2":"東京都総務局統計部統計調査課","issued_2":"1991.0","isbn_2":"",
  9. "origin_name_2":"全国書誌","origin_id_2":"91066336","origin_url_2":"http://iss.ndl.go.jp/books/R100000002-I000002131701-00",
  10. "player_id":"934","is_same":null,"is_skipped":null,"_fact_id":25578}

コネクションを作った場合は,作成時に渡した情報を参照するので引数は必要ない

  1. import crowd4py
  2. from __init__ import API_CONF, PROJECT_CONF
  3. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)
  4. json = api.get_relation_data()
request_answer: 指定したタスクの優先順位を上げる
  1. import crowd4py
  2. from __init__ import API_CONF, PROJECT_CONF
  3. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)
  4. api.request_answer(tid="123.456")

グループ3: Crowd4Uよりタスクを入手し,タスク結果をCrowd4Uに送信する

get_task: タスクを要求する
  1. import crowd4py
  2. from __init__ import API_CONF, PROJECT_CONF
  3. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)
  4. task = api.get_task()

タスクオブジェクトはタスクの情報が辞書型にまとまったものと,タスクを送信する先のurlの文字列をプロパティとして持ちます.

post_answer: タスクの結果をCrowd4Uに渡す
  1. import crowd4py
  2. from __init__ import API_CONF, PROJECT_CONF
  3. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)
  4. task = api.get_task()
  5. answer_data = task.data.copy() # 辞書型のオブジェクトをコピー
  6. answer_data['is_same'] = True # この例では,is_sameにBool値を入れて解答を行うタイプのタスク
  7. task.data = answer_data
  8. api.post_answer(post_url=task.get_post_url, ans_data=task.data)

サンプルコード

受け取った書籍のタイトルが同じ場合に,同じ書籍とみなす簡単なサンプルになります.

  1. # -*- coding: utf-8 -*-
  2. from __init__ import API_CONF, PROJECT_CONF
  3. import crowd4py
  4. def example_predict(data):
  5. # 書誌のタイトルが同じなら同じ書誌とみなす
  6. print("------Received task bellow-------")
  7. print(data)
  8. if data['title_1'] == data['title_2']:
  9. data['is_same'] = True
  10. else:
  11. data['is_same'] = False
  12. return data
  13. if __name__ == '__main__':
  14. api = crowd4py.API(api_info=API_CONF, project_info=PROJECT_CONF)
  15. # 5回タスクに回答
  16. print("------begin to answer-------")
  17. for i in range(5):
  18. task = api.get_task(debug=True)
  19. ans_data = example_predict(task.data)
  20. api.post_answer(task.post_url, ans_data)