Class: GooglePrediction

Inherits:
Object
  • Object
show all
Defined in:
lib/google-prediction.rb

Overview

Provides an interface to the Google Prediction API.

Author

Sam King ([email protected])

Support

[email protected]

Copyright

InSTEDD

License

GPLv3


Usage

auth_token = GooglePrediction.get_auth_token(‘[email protected]’, ‘password’)

=> long string of letters and numbers

predictor = GooglePrediction.new(auth_token, ‘bucket’, ‘object’)

predictor.#train

=> {"data"=>{"data"=>"bucket/object"}}

predictor.#check_training

=> "Training has not completed"

wait_some_time

predictor.#check_training

=> "no estimate available" or something between "0.0" and "1.0"

predictor.#predict “awesome company”

=> "Google"

predictor.#predict “awesome nonprofit”

=> "InSTEDD"

predictor.#predict 13

=> "lucky"

predictor.#predict [3, 5, 7, 11]

=> "prime"

Constant Summary collapse

PREDICTION_URL_PREFIX =
'https://www.googleapis.com/prediction/v1/training'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(auth_code, bucket, object) ⇒ GooglePrediction

auth_code: the login code generated from self.get_auth_token. If you get your auth_code from somewhere else, make sure that it doesn’t include any extra characters like a newline at the end. That can cause bizarre errors.

bucket: the name of the bucket in Google Storage

object: the filename of the object to do prediction on



79
80
81
82
83
# File 'lib/google-prediction.rb', line 79

def initialize(auth_code, bucket, object)
  @auth_code=auth_code
  @bucket=bucket
  @object=object
end

Instance Attribute Details

#auth_codeObject (readonly)

Returns the value of attribute auth_code.



45
46
47
# File 'lib/google-prediction.rb', line 45

def auth_code
  @auth_code
end

#bucketObject (readonly)

Returns the value of attribute bucket.



46
47
48
# File 'lib/google-prediction.rb', line 46

def bucket
  @bucket
end

#objectObject (readonly)

Returns the value of attribute object.



47
48
49
# File 'lib/google-prediction.rb', line 47

def object
  @object
end

Class Method Details

.check_training(auth_code, bucket, object) ⇒ Object

Wrapper. Creates a new object and runs #check_training on it.



167
168
169
170
# File 'lib/google-prediction.rb', line 167

def self.check_training(auth_code, bucket, object)
  predictor = GooglePrediction.new(auth_code, bucket, object)
  predictor.check_training
end

.get_auth_token(email, password, url = 'https://www.google.com/accounts/ClientLogin', args = {}) ⇒ Object

Gets the auth code from Google’s ClientLogin using the provided email and password.

This will fail if Google requires a Captcha. If so, follow the instructions at

code.google.com/apis/predict/docs/getting-started.html and pass in the new URL and new arguments using the optional parameters.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/google-prediction.rb', line 56

def self.get_auth_token(email, password, url='https://www.google.com/accounts/ClientLogin', args={}) 
  curl = Curl::Easy.new(url)
  post_args = {
    "accountType" => "HOSTED_OR_GOOGLE",
    "Email" => email,
    "Passwd" => curl.escape(password),
    "source" => "companyName-applicationName-versionID",
    "service" => "xapi"
  }
  args.each {|key, val| post_args[key] = val }
  post_fields = post_args.map {|k,v| Curl::PostField.content(k, v) }
  curl.http_post(post_fields)
  curl.body_str.match('Auth.*')[0][5..-1]
end

.predict(auth_code, bucket, object, submission) ⇒ Object

Wrapper. Creates a new object and runs #predict on it.



173
174
175
176
# File 'lib/google-prediction.rb', line 173

def self.predict(auth_code, bucket, object, submission)
  predictor = GooglePrediction.new(auth_code, bucket, object)
  predictor.predict(submission)
end

.train(auth_code, bucket, object) ⇒ Object

Wrapper. Creates a new object and runs #train on it.



161
162
163
164
# File 'lib/google-prediction.rb', line 161

def self.train(auth_code, bucket, object)
  predictor = GooglePrediction.new(auth_code, bucket, object)
  predictor.train
end

Instance Method Details

#check_trainingObject

Gets the training status of the specified object.

If the training is incomplete, returns “Training has not completed”.

If the training did not have enough data to do cross-fold validation, returns “no estimate available”. If the training went as desired, returns the accuracy of the training from 0 to 1.

Returns

{"errors"=>{"errors"=>[{all of your errors}], "code"=>code, "message"=>message}}

on error.



113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/google-prediction.rb', line 113

def check_training
  url = PREDICTION_URL_PREFIX + "/" + @bucket + "%2F" + @object
  curl = Curl::Easy.new(url)
  curl.headers = {"Authorization" => "GoogleLogin auth=#{@auth_code}"}
  curl.http_get

  # response will be 
  #   {"data"=>{"data"=>"bucket/object", "modelinfo"=>accuracy_prediction}}
  # on success
  response = JSON.parse(curl.body_str) 
  return response["data"]["modelinfo"] unless response["data"].nil?
  return response
end

#predict(submission) ⇒ Object

Submission must be either a string, a single number, or an array of strings or numbers

Gets the prediction for the label of the submission based on the training.

Returns the prediction on success and

{"errors"=>{"errors"=>[{all of your errors}], "code"=>code, "message"=>message}}

on error.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/google-prediction.rb', line 135

def predict(submission)
  url = PREDICTION_URL_PREFIX + "/" + @bucket + "%2F" + @object + "/predict"
  curl = Curl::Easy.new(url)
  post_body = {:data => {:input => {}}}
  submission = [submission] unless submission.is_a? Array
  if submission[0].is_a? String
    post_body[:data][:input] = {:text => submission}
  elsif submission[0].is_a? Fixnum
    post_body[:data][:input] = {:numeric => submission}
  else
    raise Exception.new("submission must be String, Fixnum, or Array of Strings / Fixnums")
  end
  curl.post_body = JSON.generate(post_body)
  curl.headers = {"Content-Type" => "application/json", 
    "Authorization" => "GoogleLogin auth=#{@auth_code}"}
  curl.http("POST")

  # response will be
  #   {"data"=>{"output"=>{"output_label"=>label}}}
  # on success
  response = JSON.parse(curl.body_str)
  return response["data"]["output"]["output_label"] unless response["data"].nil?
  return response
end

#trainObject

Starts training on the specified object.

Returns

{"data"=>{"data"=>"bucket/object"}}

on success, and

{"errors"=>{"errors"=>[{all of your errors}], "code"=>code, "message"=>message}}

on error.



92
93
94
95
96
97
98
99
100
# File 'lib/google-prediction.rb', line 92

def train
  url = PREDICTION_URL_PREFIX + "?data=" + @bucket + "%2F" + @object
  curl = Curl::Easy.new(url)
  curl.post_body = JSON.generate({:data => {}})
  curl.headers = {"Content-Type" => "application/json", 
    "Authorization" => "GoogleLogin auth=#{@auth_code}"}
  curl.http("POST")
  JSON.parse(curl.body_str)
end