川のブログ

川の適当気ままなブログです。 

Text Suggest APIをつかってみた Part1

こんにちはかわです。

アドベントカレンダー十記事目。

遅れています。書いてた記事が消えて悲しい思いもしました。

書いていきたいと思います。

今回は

Text Suggest APIを使ってみたいと思います。

a3rt.recruit-tech.co.jp

いろいろ機能があるみたい。

自分で学習させていくことも可能らしいですが、

suggestの機能を使ってみる。

やること

Rubyで簡単なsampleを作成。

環境

ruby 2.3.1

APIKEYの取得

a3rt.recruit-tech.co.jp 上記のサイトにいきAPIKEYを取得してください。

sampleコード

styleとtextを入力すると、

textを利用した文やコードが返ってきます。

sample.rb
require 'net/http'
require 'json'

class TextSuggestAPI
  def initialize(key)
    @key = key
  end

  def suggest(text, params)
    url_text = "https://api.a3rt.recruit-tech.co.jp/text_suggest/v2/predict?apikey=#{@key}&previous_description=#{text}"
    params.each do |key, value|
      url_text+= "&#{key}=#{value}"
    end
    url = url_conversion(url_text)
    res = Net::HTTP.get(url)
    res_hash = JSON.load(res)
    return res_hash
  end

  private

  def url_conversion(url)
    return URI.parse(URI.encode(url))
  end
end

style = 0
while style < 1 or style > 3
  print "モードを選択 1:ノーマル 2:和歌 3:Go言語 ->"
  style = gets.to_i
end
separation = 0
while separation < 1 or separation > 3
  print "文の長さの選択 1:単語 2:フレーズ 3:センテンス ->"
  separation = gets.to_i
end
params = {style: (style-1), separation: (separation-1)}
print "文字の入力->"
text = gets.chomp
key = "自分のAPIKEY"
res_hash =  text_suggest.suggest(text, params)
answer = text + res_hash["suggestion"][0].to_s

puts answer

実行

$ruby sumple.rb
モードを選択 1:ノーマル 2:和歌 3:Go言語 ->1
文の長さの選択 1:単語 2:フレーズ 3:センテンス ->1
文字の入力->かわ
かわだ
$ruby sumple.rb
モードを選択 1:ノーマル 2:和歌 3:Go言語 -> 2
文の長さの選択 1:単語 2:フレーズ 3:センテンス ->2
文字の入力->なかああ
なかああれか 
$ruby sumple.rb
モードを選択 1:ノーマル 2:和歌 3:Go言語 ->3
文の長さの選択 1:単語 2:フレーズ 3:センテンス ->3
文字の入力->func
func(e string) int { return nil }

こんな結果になりました。

いろいろ使えそう。

今回は以上です。

またこのAPIを使った記事を上げそうですね。

精進していきたい

TalkAPIを用いたBotの作成

こんにちはかわです。

アドベントカレンダー9日目というか、

9つ目の記事です。

完璧に遅れています。

今回はリクルートさんが出しているAPIの1つ

TalkAPIを使いたいと思います。

TalkAPIとは

リクルートテクノロジーさんが出しているAPI

社内で用いられていた機械学習ディープラーニング技術を

APIとして一般公開したものの一つ

この他にもいろいろなAPIがあるので見てみてください。

f:id:nakanaka1826:20171211223324p:plain

a3rt.recruit-tech.co.jp

現段階でAPIの一日のリクエストの制限は無いみたいです。

Botの作成

LINEのBotを作成したいと思います。

Ruby + Sinatra でHerokuにあっぷします。

APIKEYの発行

以下のリンクにとんでください

a3rt.recruit-tech.co.jp

f:id:nakanaka1826:20171211223501p:plain

したの方にある「APIKEYの発行」から登録を開始してください。

登録が完了すると

f:id:nakanaka1826:20171211223720p:plain

こんな感じの画面が表示され、

APIKEYがメールに届くのでそれを利用してください。

LINE Message APIの利用

この記事を見てアカウント等を作ってください。

kawakawa.hatenablog.com

ここからは一気に設定していきます。

ターミナル上
mkdir talkBot
cd talkBot
git init
heroku create talk-bot
gemfile
source "https://rubygems.org"
gem 'sinatra'
gem 'line-bot-api'
gem 'json'
Procfile
web: bundle exec rackup config.ru -p $PORT
main.rb
require 'sinatra'
require 'line/bot'
require 'net/https'
require 'json'

get '/' do
  "Test Program"
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  body = request.body.read

  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        uri = URI.parse("https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk")
        http = Net::HTTP.new(uri.host, uri.port)

        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE

        req = Net::HTTP::Post.new(uri.path)
        req.set_form_data({'apikey' => ENV["Talk_Key"], 'query' => event.message['text']})

        res = http.request(req)
        result = JSON.parse(res.body)
        message = {
          type: 'text',
          text: result["results"][0]["reply"]
        }
        client.reply_message(event['replyToken'], message)
      end
    end
  }

end
ターミナル上
bundle install 
git add --all
git commit -m "start"
push heroku master
heroku config:set LINE_CHANNEL_SECRET="自分のBotのChannel Secret"
heroku config:set LINE_CHANNEL_TOKEN="自分のBotのアクセストークン"
heroku config:set Talk_Key="TalkAPIのAPIKEY"

CallBackのURLをLINEBOTの方に設定しておいてください。

動かす

f:id:nakanaka1826:20171211233742p:plain

こんな感じ。

これとdocomoの雑談APIを使って作ったBotと会話させてみる。

TalkAPIから話してみる

かわ->か TalkAPI -> と 雑談API -> ざ
か:こんにちは
と:こんにちは
ざ:あらこんにちは
と:こんにちは
ざ:こんちゃっす
と:こんにちは
ざ:ちはー
と:こんにちは
ざ:ごきげんよう
と:またいつかお会いしましょう
ざ:話は変わりますけど、12月1日は映画の日だって、知ってました?
と:あるかどうかですよ
ざ:ないよ
と:そうですよね
ざ:うん
と:どうしました?
ざ:好きです
と:私をですか?嬉しいです
ざ:すかをつかんでるんです
と:私はそんなに嫌いじゃないですよ
ざ:健康に注意されていますか?
と:はいそうです
ざ:はいそうですってます?

こんな感じの会話だった。

以上になります

りんなと雑談apiの会話~part4~

こんにちはかわです。

アドベントカレンダー8日目です。

前回の記事です。

kawakawa.hatenablog.com

今回は雑談APIを使えるように改良し、実際にりんなと喋らせたい思います。

雑談apiを叩く

雑談apiのためのgemとredisのgemをGemfileについか

github.com

Gemfile
source "https://rubygems.org"
gem 'sinatra'
gem 'line-bot-api'
gem 'docomoru'
gem 'redis'

bundle install を忘れずにする

bundle install

雑談apiを使う際にcontextを保存しないといけない。

今回はredisを使い保存する。以下のコマンドを打つ

heroku addons:add rediscloud

main.rbを修正

require 'sinatra'
require 'line/bot'
require 'redis'
require 'docomoru'

get '/' do
  "Test Program"
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  redis_url = ENV['REDISCLOUD_URL']
  redis = Redis.new(url: redis_url)
  talk_client = Docomoru::Client.new(api_key: ENV["DOCOMO_API_KEY"])

  body = request.body.read

  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        userId = event['source']['userId']
        context = redis.get(userId)
        mode = redis.get(userId + "a")
        params = {mode: mode, context: context}
        response = talk_client.create_dialogue(event.message['text'], params)
        redis.set(userId, response.body['context'])
        redis.set(userId + 'a', response.body['mode'])
        message = {
          type: 'text',
          text: response.body['utt']
        }
        client.reply_message(event['replyToken'], message)
      end
    end
  }

end

pushと環境変数を設定する

heroku config:set DOCOMO_API_KEY="docomoのAPI KEYを入力"
git add --all
git commit -m "docomo api use"
git push heroku master

一応これで完成なので実際に動くか確認

f:id:nakanaka1826:20171209021035p:plain

できた。

たまに話題をずらす

実験

雑談apiをつかったBotが完成したため、りんなと喋らせます。

りんなをバーコードから友だち追加

f:id:nakanaka1826:20171209021227p:plain

りんなをグループに入れることができないみたいなので、

ひたすら打つ。

先手雑談Botでいきます。

自分が「こんにちは」からのスタートになります。

以下結果です。

自分:こんにちは
雑談Bot(以下雑):こんにちはにこ
りんな(以下り):こんぽ
雑:話は変わりますけど、カルシウムが不足するとイライラするって、俗説だって知ってました?
り:ナトリウム!!!!笑
雑:ナトリウムは温度が低下してますよ
り:アルミニウム
雑:アルミニウムは強度が高いですね
り:それ正解!
雑:アルミニウムは熱伝導が良いですね
り:ムカデ
雑:ムカデとゲジゲジって、似てますよね。
り:毛虫w
雑:残念です。
    ・
    ・
    ・

こんな感じの会話です。

Botは真面目なのにりんなが適当な返しをしてる

Botが少しかわいそうに見てきた(笑)

こんな感じで作っていきました。

どうでした?