Yahooキーフレーズ抽出APIのgemを作ってみた
Rubyにもだいぶ慣れてきたので、gemを作ってみることにしました。
作ってみたのはYahooキーフレーズ抽出APIをrubyで簡単に使えるgem。
Yahooキーフレーズ抽出APIとは、文章の中から特異なキーワードとそのスコア(100〜0)を最大20件抽出するAPIです。
で、それをruby上で解析したい文字列を渡すと、 キーフレーズとスコアをhashとして結果を返すようにしたのが作ったgemです。
https://rubygems.org/gems/yahoo_keyphrase_api
インストール方法
Gemfileに以下を追加
gem 'yahoo_keyphrase_api'
そして bundle install
またはgemを直接インストール
$ gem install yahoo_keyphrase_api
設定
アプリケーションIDをYahooから取得して、 以下の用に設定
require 'yahoo_keyphrase_api' # and setup YahooKeyphraseApi::Config.app_id = [application_ID]
使い方
使い方は簡単でKeyPhrase
をnewしてextract
を呼び出すだけ。
結果はHashieオブジェクトで返します。
ykp = YahooKeyphraseApi::KeyPhrase.new # extract key phrase ykp.extract '東京ミッドタウンから国立新美術館まで歩いて5分で着きます。のリクエストに対するレスポンスです。' #=> <Hashie::Mash 5分=10 リクエスト=55 国立新美術館=100 東京ミッドタウン=69>
デフォルトではPOSTリクエストにしてますが、引数を変えるとGETリクエストもできます。
ykp.extract('東京ミッドタウンから...', :GET)
Githubはこちら
Controllerでjsonを返す場合に返すカラムを指定したい
RailsでControllerからjsonを返す場合、Modelの戻りをそのまま返すと データとして使わないcreated_dateやupdated_dateも返ってしまうので、無駄な転送が発生してしまう。
もしくは以下のように、jsonのオプションでexcept
を使うことによって指定の列を返さないようにできる。
def users render json: User.limit(5), except:[:created_date, :updated_date] end
逆に指定の列のみを返したい場合、only
を使う
def users render json: User.limit(5), except:[:id, :name] end
heroku schedulerの使い方(Rails,sinatra)
(qiitaにも書いたけどこっちにも。)
herokuで定期的な処理を行いたい場合、大体はaddonのheroku Schedulerを使うことになると思うので、簡単にまとめてみる。
特徴など
- タスクは複数登録可能
- タスクの起動間隔は10分おき、1時間おき、1日おきで選べる。
- heroku schedulerはベストエフォート型のサービスなので、実行開始時間は多少の遅延したり、スキップされることがあるので注意する
- 無償でできること
- プロセスの利用時間は1Dynos = 750時間(/1ヶ月)
- 24h * 31日 = 744hなので1タスクであれば、1ヶ月フルで利用しても大丈夫(だけど、Webと共有なのでWeb側を使っていれば実際はもっと少なくなる?誰か教えて下さい・・・・)
- それ以降は1時間あたり$0.05かかる(1ヶ月フル使用で$37.2)
何はともあれaddonを追加
コンソールから
$ heroku addons:add scheduler:standard
またはaddonページから https://addons.heroku.com/scheduler
※アドオンは無償ですが、オーバーしたプロセスが課金対象になる?のでクレジット登録になります。
スケジュール画面を開く
https://heroku-scheduler.herokuapp.com/dashboard
$ heroku addons:open scheduler
タスクの登録
Railsの場合
lib/tasks
の下にrakeファイルを作成
task :test_task => :environment do #処理 puts 'done.' end
スケジュール管理画面でAdd Job...
を選択
TASKにrake test_task
を設定
FREQUENCYに起動間隔を設定。
Sinatraの場合
scheduler用の実行ファイルを作成
# 処理 puts 'done.'
スケジュール管理画面でAdd Job...
を選択
TASKにbundle exec ruby task.rb
を設定
ログの確認
$ heroku logs --ps scheduler.xxxx #(xxxxは実行時に割り当てられたプロセス番号)
公式Doc
https://devcenter.heroku.com/articles/scheduler#defining-tasks