A3RTと戯れる(国産Web API Advent Calendar 2018)
kaggle_moa_prediction
こんにちは。阿内です。
国産Web API Advent Calendar 2018の11日目は、リクルートテクノロジーズの人工知能API群「A3RT」と戯れてみたいと思います。
はじめに
A3RTについて
A3RTはリクルートテクノロジーズが公開している機械学習を用いたAPI群で、「ANALYTICS & ARTIFICIAL INTELLIGENCE API VIA RECRUIT TECHNOLOGIES」の略称です。現在、オリジナル画像生成や固有表現抽出、日本語のSQL変換など、11種類ものAPIが公開されています。
詳しくはA3RT公式サイトをご覧ください。
今日やること
今日はA3RTのText Suggest APIとProofReadingAPIを使って、「便利?ツール」を作って行きたいと思います。以下で各APIの概要を説明します。
1. Text Sugget API
テキストの自動生成を行うAPIです。こちらのAPIは、大量のテキストを学習することで、入力した文章に続く自然な文章を生成することが可能です。例えば個人利用であれば、キーワードや話題まで浮かんでいても文章を書くのが大変なときにサポートしてくれます。集団で文章や原稿を作成する場合は、一定の原稿品質を担保したり、独特の言い回しや表現の規定を普及させる一助にもなりえます。学習させる文章を工夫すれば、非常に多様な場面で利用が可能です。
2. Proofreading API
テキストの校閲を行うAPIです。このAPIでは、誤字脱字箇所の指摘だけでなく、代替候補案までサジェストしてくれます。人手ではチェックしきれない量の原稿を、短時間かつ高クオリティでチェックすることが可能です。また、今後のアップデートでユーザーのFBによる自動学習機能の追加を予定しております。
上記テキストを扱った2つのAPIを使い、日常の課題を解決するslack botを作ってみたいと思います。
便利slack botを作る
日々slackでコミュニケーションをとる上で、「誤字」と「言葉足らず」はミスコミュニケーションを生むため、絶対に避けなければいけません。
※ ↑ 無理やり課題を作っているので、深く突っ込まないでください。
この日常に潜む2つの課題を、A3RTのAPIで解決したいと思います。
準備
APIキーを発行する
まずはA3RTのAPIを利用するために、APIキーを発行します。※ APIキーは、利用するAPIごとに発行が必要です。
・Text Suggest API
・Proofreading API
APIキーが正常に発行できてるかを、用意されているpublicデータセットを使って学習したモデルに問い合わせてみましょう。
Text Suggest API
デフォルトで用意されている現代文を学習したモデルで「犬」に続く文章を生成してみます。
1 2 3 4 5 6 7 8 9 10 11 |
curl -X GET 'https://api.a3rt.recruit-tech.co.jp/text_suggest/v2/predict?apikey=yyyyyy&previous_description=犬' | jq { "status": 0, "message": "ok", "suggestion": [ "が寝ています。", "がいます。", "が入っているところです。" ] } |
Proofreading API
「システムの規格から改発」という文章を校閲してもらいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
~ » curl https://api.a3rt.recruit-tech.co.jp/proofreading/v2/typo\?apikey\=xxxxxx\&sentence\=システムの規格から改発 | jq { "resultID": "46ff6b3e1a9a", "status": 1, "message": "pointed out", "inputSentence": "システムの規格から改発", "normalizedSentence": "システムの規格から改発", "checkedSentence": "システムの <<規>> <<格>> から <<改>> <<発>> ", "alerts": [ { "pos": 5, "word": "規", "score": 0.9999999437193418, "suggestions": [ "価", "合", "資" ] }, { "pos": 6, "word": "格", "score": 0.9999992595501884, "suggestions": [ "制", "定", "格" ] }, { "pos": 9, "word": "改", "score": 0.5095905752436977, "suggestions": [ "開", "出", "上" ] }, { "pos": 10, "word": "発", "score": 0.7573832120067161, "suggestions": [ "良", "め", "善" ] } ] } |
正常にAPIキーが発行されていることが確認できました。
本題
作ったbot達
1. 誤字訂正bot
僕の誤字だらけの投稿を指摘し、正しい文言を教えてもらいましょう。
↑ 誤字slackの一例
こちらは、すでに用意されているモデルで事足りそうなので、レスポンスをいい感じにパースして投稿すればよさそうです。
2. 言葉足らず補足bot
言葉足らずな僕の投稿を、いい感じに文章にしてもらいましょう。しかし、publicで公開されている現代文を学習したモデルや、和歌を学習したモデルではこの課題を解決できません。そこで、Text Suggest APIに用意されている学習機能で私のslackログを学習し、私っぽい発言をしてくれるようにしましょう。
↑ 言葉足らずslackの一例
自作モデルの作成方法は、Text Suggest APIでオリジナルモデルを作ってみたをご覧ください。
※ 学習データとして利用したslackのログは、プライベートで利用しているslackの会話ログをエクスポートしたものになります。真に業務における言葉足らずを補正したい場合は業務slackのログを使うのがベストですが、センシティブなのでプライベートのものを利用しました。
いきなり成果物
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
from slackbot.bot import listen_to import requests import json """ 校閲する関数 """ def proof_reading(message): url = 'https://api.a3rt.recruit-tech.co.jp/proofreading/v2/typo' query = { 'apikey': 'proofreadingのAPIキー', 'sentence': message.body['text'] } res = requests.get(url, params=query) res_lists = json.loads(res.text) correct_sentense = list(res_lists['normalizedSentence']) m = "{}\n".format(res_lists['checkedSentence']) # 指摘がある場合 if res_lists['status'] == 1: for alert in res_lists['alerts']: m += "<<{}>> → {}?\n".format(correct_sentense[alert['pos']], alert['suggestions']) m += '間違ってない?' message.send(m) # 送信 """ テキスト生成する関数 """ def text_suggest(message): url = 'https://api.a3rt.recruit-tech.co.jp/text_suggest/v2/predict' prev_text = message.body['text'] query = { 'apikey': 'textsuggestのAPIキー', 'previous_description': prev_text, 'style' : '自作モデルのAPIキー', 'separation' : 2 } res = requests.get(url, params=query) res_lists = json.loads(res.text) suggested_sentense = res_lists['suggestion'][0] message.send('{}{}\n\n補足しといたよ'.format(prev_text,suggested_sentense)) #送信 @listen_to('.*') def listen_func(message): # 自分にしか反応して欲しくないので if message.body['user'] =='slackのユーザID': if len(message.body['text']) > 5: # 5文字以上の場合は校閲 proof_reading(message) else: # 5文字未満の場合はテキスト生成 text_suggest(message) |
・5文字以上の場合は校閲が発動、5文字未満の場合は言葉補足が発動します。
・自分の投稿以外には反応しないようにしています。
実際に動いている様子
・補足bot
5文字未満なので補足してくれています。素晴らしい補足ですね。
・誤字訂正bot
5文字以上なので訂正してくれています。2つ目の例は、書いている途中の原稿を投稿してみた結果、完璧な指摘ではありませんが、誤字に気付くことができました。今後のアップデートでさらなる改善ができればと思います。
まとめ
A3RTのAPI群を利用することで、日常の課題を解決する便利?なツールを作成することができました。今回利用したAPI以外にも、様々なAPIが公開されていますので是非みなさんも利用してみてください!
slackbot作成に利用した記事
・PythonのslackbotライブラリでSlackボットを作る