Skip to content

How to upload csv via ruby client

TAKEI Yuya edited this page Feb 27, 2013 · 8 revisions

はじめに

Bazilサービスでは以下のようなヘッダ付きcsvを使いトレーニングデータの登録をしています。

string,string,number,number
,太郎,180,80
,花子,155,40
,裕也,163,75

これに対し、RubyClientではJSONをベースにしたインターフェースになっています。 ここでは、BazilのCSVをRubyClient経由でBazilサービスにアップロードする簡単なサンプルスクリプトを紹介します。 モデルやコンフィグのIDや、元データの形式など、必要に応じて書き換えてご利用ください。

サンプルコード

#!/usr/bin/env ruby
# encoding: utf-8

require 'bazil'
require 'csv'
require 'json'

# https://github.com/pfi/bazil_ruby_client/wiki/How-to-use の「1. 準備」と「2. クライアントの作成」を参考にクライアントを作る
client = Bazil::Client.new()

# モデルIDとコンフィグIDからモデルを取得します。
# モデルIDとコンフィグIDはWebから確認できるほか、RubyClientからもアクセス可能なモデルの一覧を取得できます。 
# 詳しくは How-to-use の 「3. モデルの取得」をご覧ください。
model = client.model(1, 23)

# RubyのCSVライブラリを使ってCSVファイルを読み込みます。
# ここでは"name_demo.csv"をいう名前を使っています。
CSV::open('name_demo.csv', 'r') {|csv|
  # 先頭二行にヘッダ(型とラベル)
  types = csv.readline
  labels = csv.readline

  # 左1列はアノテーション(正解のラベル)
  annotation_type = types.shift
  annotation_label = labels.shift

  raise "header must have same # of columns" if types.size != labels.size
  raise "empty data" if types.size == 0

  # CSVのボディーの読み込み
  csv.each{|row|
    # アノテーション
    annotation = row.shift

    raise "each row have same # of columns as header" if row.size != types.size

    # データ
    data = {}
    row.map.with_index{|value, index|
      case types[index]
      when 'string'
        data[labels[index]] = value.to_s
      when 'number'
        data[labels[index]] = value.to_f
      else
        raise "Unknown type '#{types[index]}'"
      end
    }

    # モデルに学習データを追加する
    model.train(annotation: annotation, data: data)
  }
}

# 試しにクエリを投げてみる
res = model.query({'content' => '綾 子'})

# 判定された結果
p res["classification_result"]
# => "女"

# それぞれの結果のスコア
p res["score"]
# =>{"男"=>-0.289951503277, "女"=>0.289951503277}

Clone this wiki locally