google-cloud-language 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ # Copyright 2016 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/credentials"
17
+ require "google/cloud/language/v1beta1/language_service_api"
18
+
19
+ module Google
20
+ module Cloud
21
+ module Language
22
+ ##
23
+ # @private Represents the OAuth 2.0 signing logic for Language.
24
+ class Credentials < Google::Cloud::Credentials
25
+ SCOPE = Google::Cloud::Language::V1beta1::LanguageServiceApi::ALL_SCOPES
26
+ PATH_ENV_VARS = %w(LANGUAGE_KEYFILE GOOGLE_CLOUD_KEYFILE GCLOUD_KEYFILE)
27
+ JSON_ENV_VARS = %w(LANGUAGE_KEYFILE_JSON GOOGLE_CLOUD_KEYFILE_JSON
28
+ GCLOUD_KEYFILE_JSON)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,368 @@
1
+ # Copyright 2016 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/language/annotation"
17
+
18
+ module Google
19
+ module Cloud
20
+ module Language
21
+ ##
22
+ # # Document
23
+ #
24
+ # Represents a document for the Language service.
25
+ #
26
+ # Cloud Natural Language API supports UTF-8, UTF-16, and UTF-32 encodings.
27
+ # (Ruby uses UTF-8 natively, which is the default sent to the API, so
28
+ # unless you're working with text processed in different platform, you
29
+ # should not need to set the encoding type.)
30
+ #
31
+ # Be aware that only English, Spanish, and Japanese language content are
32
+ # supported, and sentiment analysis only supports English text.
33
+ #
34
+ # See {Project#document}.
35
+ #
36
+ # @example
37
+ # require "google/cloud"
38
+ #
39
+ # gcloud = Google::Cloud.new
40
+ # language = gcloud.language
41
+ #
42
+ # content = "Darth Vader is the best villain in Star Wars."
43
+ # document = language.document content
44
+ # annotation = document.annotate
45
+ #
46
+ # annotation.entities.count #=> 2
47
+ # annotation.sentiment.polarity #=> 1.0
48
+ # annotation.sentiment.magnitude #=> 0.8999999761581421
49
+ # annotation.sentences.count #=> 1
50
+ # annotation.tokens.count #=> 10
51
+ #
52
+ class Document
53
+ ##
54
+ # @private The gRPC Service object.
55
+ attr_accessor :service
56
+
57
+ ##
58
+ # @private Creates a new document instance.
59
+ def initialize
60
+ @grpc = nil
61
+ @service = nil
62
+ end
63
+
64
+ ##
65
+ # @private Whether the document has content.
66
+ #
67
+ def content?
68
+ @grpc.source == :content
69
+ end
70
+
71
+ ##
72
+ # @private Whether the document source is a Google Cloud Storage URI.
73
+ #
74
+ def url?
75
+ @grpc.source == :gcs_content_uri
76
+ end
77
+
78
+ ##
79
+ # @private The source of the document's content.
80
+ #
81
+ def source
82
+ return @grpc.content if content?
83
+ @grpc.gcs_content_uri
84
+ end
85
+
86
+ ##
87
+ # The document's format.
88
+ #
89
+ # @return [Symbol] `:text` or `:html`
90
+ #
91
+ def format
92
+ return :text if text?
93
+ return :html if html?
94
+ end
95
+
96
+ ##
97
+ # Sets the document's format.
98
+ #
99
+ # @param [Symbol, String] new_format Accepted values are `:text` or
100
+ # `:html`.
101
+ #
102
+ # @example
103
+ # document = language.document "<p>The Old Man and the Sea</p>"
104
+ # document.format = :html
105
+ #
106
+ def format= new_format
107
+ @grpc.type = :PLAIN_TEXT if new_format.to_s == "text"
108
+ @grpc.type = :HTML if new_format.to_s == "html"
109
+ @grpc.type
110
+ end
111
+
112
+ ##
113
+ # Whether the document is the `TEXT` format.
114
+ #
115
+ # @return [Boolean]
116
+ #
117
+ def text?
118
+ @grpc.type == :PLAIN_TEXT
119
+ end
120
+
121
+ ##
122
+ # Sets the document to the `TEXT` format.
123
+ #
124
+ def text!
125
+ @grpc.type = :PLAIN_TEXT
126
+ end
127
+
128
+ ##
129
+ # Whether the document is the `HTML` format.
130
+ #
131
+ # @return [Boolean]
132
+ #
133
+ def html?
134
+ @grpc.type == :HTML
135
+ end
136
+
137
+ ##
138
+ # Sets the document to the `HTML` format.
139
+ #
140
+ def html!
141
+ @grpc.type = :HTML
142
+ end
143
+
144
+ ##
145
+ # The document's language. ISO and BCP-47 language codes are supported.
146
+ #
147
+ # @return [String]
148
+ #
149
+ def language
150
+ @grpc.language
151
+ end
152
+
153
+ ##
154
+ # Sets the document's language.
155
+ #
156
+ # @param [String, Symbol] new_language ISO and BCP-47 language codes are
157
+ # accepted.
158
+ #
159
+ # @example
160
+ # document = language.document "<p>El viejo y el mar</p>"
161
+ # document.language = "es"
162
+ #
163
+ def language= new_language
164
+ @grpc.language = new_language.to_s
165
+ end
166
+
167
+ ##
168
+ # Analyzes the document and returns sentiment, entity, and syntactic
169
+ # feature results, depending on the option flags. Calling `annotate`
170
+ # with no arguments will perform **all** analysis features. Each feature
171
+ # is priced separately. See [Pricing](https://cloud.google.com/natural-language/pricing)
172
+ # for details.
173
+ #
174
+ # @param [Boolean] sentiment Whether to perform sentiment analysis.
175
+ # Optional. The default is `false`. If every feature option is
176
+ # `false`, **all** features will be performed.
177
+ # @param [Boolean] entities Whether to perform the entity analysis.
178
+ # Optional. The default is `false`. If every feature option is
179
+ # `false`, **all** features will be performed.
180
+ # @param [Boolean] syntax Whether to perform syntactic analysis.
181
+ # Optional. The default is `false`. If every feature option is
182
+ # `false`, **all** features will be performed.
183
+ # @param [String] encoding The encoding type used by the API to
184
+ # calculate offsets. Optional.
185
+ #
186
+ # @return [Annotation>] The results of the content analysis.
187
+ #
188
+ # @example
189
+ # require "google/cloud"
190
+ #
191
+ # gcloud = Google::Cloud.new
192
+ # language = gcloud.language
193
+ #
194
+ # content = "Darth Vader is the best villain in Star Wars."
195
+ # document = language.document content
196
+ # annotation = document.annotate
197
+ #
198
+ # annotation.sentiment.polarity #=> 1.0
199
+ # annotation.sentiment.magnitude #=> 0.8999999761581421
200
+ # annotation.entities.count #=> 2
201
+ # annotation.sentences.count #=> 1
202
+ # annotation.tokens.count #=> 10
203
+ #
204
+ # @example With feature flags:
205
+ # require "google/cloud"
206
+ #
207
+ # gcloud = Google::Cloud.new
208
+ # language = gcloud.language
209
+ #
210
+ # content = "Darth Vader is the best villain in Star Wars."
211
+ # document = language.document content
212
+ # annotation = document.annotate entities: true, text: true
213
+ #
214
+ # annotation.sentiment #=> nil
215
+ # annotation.entities.count #=> 2
216
+ # annotation.sentences.count #=> 1
217
+ # annotation.tokens.count #=> 10
218
+ #
219
+ def annotate sentiment: false, entities: false, syntax: false,
220
+ encoding: nil
221
+ ensure_service!
222
+ grpc = service.annotate to_grpc, sentiment: sentiment,
223
+ entities: entities,
224
+ syntax: syntax,
225
+ encoding: encoding
226
+ Annotation.from_grpc grpc
227
+ end
228
+ alias_method :mark, :annotate
229
+ alias_method :detect, :annotate
230
+
231
+ ##
232
+ # Syntactic analysis extracts linguistic information, breaking up the
233
+ # given text into a series of sentences and tokens (generally, word
234
+ # boundaries), providing further analysis on those tokens.
235
+ #
236
+ # @param [String] encoding The encoding type used by the API to
237
+ # calculate offsets. Optional.
238
+ #
239
+ # @return [Annotation>] The results for the content analysis.
240
+ #
241
+ # @example
242
+ # require "google/cloud"
243
+ #
244
+ # gcloud = Google::Cloud.new
245
+ # language = gcloud.language
246
+ #
247
+ # document = language.document "Hello world!"
248
+ #
249
+ # annotation = document.syntax
250
+ # annotation.thing #=> Some Result
251
+ #
252
+ def syntax encoding: nil
253
+ annotate syntax: true, encoding: encoding
254
+ end
255
+
256
+ ##
257
+ # Entity analysis inspects the given text for known entities (proper
258
+ # nouns such as public figures, landmarks, etc.) and returns information
259
+ # about those entities.
260
+ #
261
+ # @param [String] encoding The encoding type used by the API to
262
+ # calculate offsets. Optional.
263
+ #
264
+ # @return [Annotation::Entities>] The results for the entities analysis.
265
+ #
266
+ # @example
267
+ # require "google/cloud"
268
+ #
269
+ # gcloud = Google::Cloud.new
270
+ # language = gcloud.language
271
+ #
272
+ # content = "Darth Vader is the best villain in Star Wars."
273
+ # document = language.document content
274
+ # entities = document.entities # API call
275
+ #
276
+ # entities.count #=> 2
277
+ # entities.first.name #=> "Darth Vader"
278
+ # entities.first.type #=> :PERSON
279
+ # entities.first.name #=> "Star Wars"
280
+ # entities.first.type #=> :WORK_OF_ART
281
+ #
282
+ def entities encoding: nil
283
+ ensure_service!
284
+ grpc = service.entities to_grpc, encoding: encoding
285
+ Annotation::Entities.from_grpc grpc
286
+ end
287
+
288
+ ##
289
+ # Sentiment analysis inspects the given text and identifies the
290
+ # prevailing emotional opinion within the text, especially to determine
291
+ # a writer's attitude as positive, negative, or neutral. Currently, only
292
+ # English is supported for sentiment analysis.
293
+ #
294
+ # @return [Annotation::Sentiment>] The results for the sentiment
295
+ # analysis.
296
+ #
297
+ # @example
298
+ # require "google/cloud"
299
+ #
300
+ # gcloud = Google::Cloud.new
301
+ # language = gcloud.language
302
+ #
303
+ # content = "Darth Vader is the best villain in Star Wars."
304
+ # document = language.document content
305
+ # sentiment = document.sentiment # API call
306
+ #
307
+ # sentiment.polarity #=> 1.0
308
+ # sentiment.magnitude #=> 0.8999999761581421
309
+ #
310
+ def sentiment
311
+ ensure_service!
312
+ grpc = service.sentiment to_grpc
313
+ Annotation::Sentiment.from_grpc grpc
314
+ end
315
+
316
+ # @private
317
+ def inspect
318
+ "#<#{self.class.name} (" \
319
+ "#{(content? ? "\"#{source[0, 16]}...\"" : source)}, " \
320
+ "format: #{format.inspect}, language: #{language.inspect})>"
321
+ end
322
+
323
+ ##
324
+ # @private New gRPC object.
325
+ def to_grpc
326
+ @grpc
327
+ end
328
+
329
+ ##
330
+ # @private
331
+ def self.from_grpc grpc, service
332
+ new.tap do |i|
333
+ i.instance_variable_set :@grpc, grpc
334
+ i.instance_variable_set :@service, service
335
+ end
336
+ end
337
+
338
+ ##
339
+ # @private
340
+ def self.from_source source, service, format: nil, language: nil
341
+ source = String source
342
+ grpc = Google::Cloud::Language::V1beta1::Document.new
343
+ if source.start_with? "gs://"
344
+ grpc.gcs_content_uri = source
345
+ format ||= :html if source.end_with? ".html"
346
+ else
347
+ grpc.content = source
348
+ end
349
+ if format.to_s == "html"
350
+ grpc.type = :HTML
351
+ else
352
+ grpc.type = :PLAIN_TEXT
353
+ end
354
+ grpc.language = language.to_s unless language.nil?
355
+ from_grpc grpc, service
356
+ end
357
+
358
+ protected
359
+
360
+ ##
361
+ # Raise an error unless an active language project object is available.
362
+ def ensure_service!
363
+ fail "Must have active connection" unless service
364
+ end
365
+ end
366
+ end
367
+ end
368
+ end
@@ -0,0 +1,365 @@
1
+ # Copyright 2016 Google Inc. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require "google/cloud/errors"
17
+ require "google/cloud/core/gce"
18
+ require "google/cloud/language/service"
19
+ require "google/cloud/language/document"
20
+ require "google/cloud/language/annotation"
21
+
22
+ module Google
23
+ module Cloud
24
+ module Language
25
+ ##
26
+ # # Project
27
+ #
28
+ # Google Cloud Natural Language API reveals the structure and meaning of
29
+ # text by offering powerful machine learning models in an easy to use REST
30
+ # API. You can analyze text uploaded in your request or integrate with
31
+ # your document storage on Google Cloud Storage.
32
+ #
33
+ # See {Google::Cloud#language}
34
+ #
35
+ # @example
36
+ # require "google/cloud"
37
+ #
38
+ # gcloud = Google::Cloud.new
39
+ # language = gcloud.language
40
+ #
41
+ # content = "Darth Vader is the best villain in Star Wars."
42
+ # annotation = language.annotate content
43
+ #
44
+ # annotation.sentiment.polarity #=> 1.0
45
+ # annotation.sentiment.magnitude #=> 0.8999999761581421
46
+ # annotation.entities.count #=> 2
47
+ # annotation.sentences.count #=> 1
48
+ # annotation.tokens.count #=> 10
49
+ #
50
+ class Project
51
+ ##
52
+ # @private The gRPC Service object.
53
+ attr_accessor :service
54
+
55
+ ##
56
+ # @private Creates a new Language Project instance.
57
+ def initialize service
58
+ @service = service
59
+ end
60
+
61
+ # The Language project connected to.
62
+ #
63
+ # @example
64
+ # require "google/cloud"
65
+ #
66
+ # gcloud = Google::Cloud.new "my-project-id",
67
+ # "/path/to/keyfile.json"
68
+ # language = gcloud.language
69
+ #
70
+ # language.project #=> "my-project-id"
71
+ #
72
+ def project
73
+ service.project
74
+ end
75
+
76
+ ##
77
+ # @private Default project.
78
+ def self.default_project
79
+ ENV["LANGUAGE_PROJECT"] ||
80
+ ENV["GOOGLE_CLOUD_PROJECT"] ||
81
+ ENV["GCLOUD_PROJECT"] ||
82
+ Google::Cloud::Core::GCE.project_id
83
+ end
84
+
85
+ ##
86
+ # Returns a new document from the given content. No API call is made.
87
+ #
88
+ # @param [String, Google::Cloud::Storage::File] content A string of text
89
+ # to be annotated, or a Cloud Storage URI of the form
90
+ # `"gs://bucketname/path/to/document.ext"`; or an instance of
91
+ # Google::Cloud::Storage::File of the text to be annotated.
92
+ # @param [String] format The format of the document (TEXT/HTML).
93
+ # Optional.
94
+ # @param [String] language The language of the document (if not
95
+ # specified, the language is automatically detected). Both ISO and
96
+ # BCP-47 language codes are accepted. Optional.
97
+ #
98
+ # @return [Document] An document for the Language service.
99
+ #
100
+ # @example
101
+ # require "google/cloud"
102
+ #
103
+ # gcloud = Google::Cloud.new
104
+ # language = gcloud.language
105
+ #
106
+ # document = language.document "It was the best of times, it was..."
107
+ #
108
+ # @example With a Google Cloud Storage URI:
109
+ # require "google/cloud"
110
+ #
111
+ # gcloud = Google::Cloud.new
112
+ # language = gcloud.language
113
+ #
114
+ # document = language.document "gs://bucket-name/path/to/document"
115
+ #
116
+ # @example With a Google Cloud Storage File object:
117
+ # require "google/cloud"
118
+ #
119
+ # gcloud = Google::Cloud.new
120
+ # storage = gcloud.storage
121
+ #
122
+ # bucket = storage.bucket "bucket-name"
123
+ # file = bucket.file "path/to/document"
124
+ #
125
+ # language = gcloud.language
126
+ #
127
+ # document = language.document file
128
+ #
129
+ # @example With `format` and `language` options:
130
+ # require "google/cloud"
131
+ #
132
+ # gcloud = Google::Cloud.new
133
+ # language = gcloud.language
134
+ #
135
+ # document = language.document "<p>El viejo y el mar</p>",
136
+ # format: :html, language: "es"
137
+ #
138
+ def document content, format: nil, language: nil
139
+ content = content.to_gs_url if content.respond_to? :to_gs_url
140
+ if content.is_a? Document
141
+ # Create new document with the provided format and language
142
+ Document.from_source content.source, @service,
143
+ format: (format || content.format),
144
+ language: (language || content.language)
145
+ else
146
+ Document.from_source content, @service, format: format,
147
+ language: language
148
+ end
149
+ end
150
+ alias_method :doc, :document
151
+
152
+ ##
153
+ # Returns a new document from the given content with the `format` value
154
+ # `:text`. No API call is made.
155
+ #
156
+ # @param [String, Google::Cloud::Storage::File] content A string of text
157
+ # to be annotated, or a Cloud Storage URI of the form
158
+ # `"gs://bucketname/path/to/document.ext"`; or an instance of
159
+ # Google::Cloud::Storage::File of the text to be annotated.
160
+ # @param [String] language The language of the document (if not
161
+ # specified, the language is automatically detected). Both ISO and
162
+ # BCP-47 language codes are accepted. Optional.
163
+ #
164
+ # @return [Document] An document for the Language service.
165
+ #
166
+ def text content, language: nil
167
+ document content, format: :text, language: language
168
+ end
169
+
170
+ ##
171
+ # Returns a new document from the given content with the `format` value
172
+ # `:html`. No API call is made.
173
+ #
174
+ # @param [String, Google::Cloud::Storage::File] content A string of text
175
+ # to be annotated, or a Cloud Storage URI of the form
176
+ # `"gs://bucketname/path/to/document.ext"`; or an instance of
177
+ # Google::Cloud::Storage::File of the text to be annotated.
178
+ # @param [String] language The language of the document (if not
179
+ # specified, the language is automatically detected). Both ISO and
180
+ # BCP-47 language codes are accepted. Optional.
181
+ #
182
+ # @return [Document] An document for the Language service.
183
+ #
184
+ def html content, language: nil
185
+ document content, format: :html, language: language
186
+ end
187
+
188
+ ##
189
+ # Analyzes the content and returns sentiment, entity, and syntactic
190
+ # feature results, depending on the option flags. Calling `annotate`
191
+ # with no arguments will perform **all** analysis features. Each feature
192
+ # is priced separately. See [Pricing](https://cloud.google.com/natural-language/pricing)
193
+ # for details.
194
+ #
195
+ # @param [String, Document, Google::Cloud::Storage::File] content The
196
+ # content to annotate. This can be an {Document} instance, or any
197
+ # other type that converts to an {Document}. See {#document} for
198
+ # details.
199
+ # @param [Boolean] sentiment Whether to perform the sentiment analysis.
200
+ # Optional. The default is `false`. If every feature option is
201
+ # `false`, **all** features will be performed.
202
+ # @param [Boolean] entities Whether to perform the entity analysis.
203
+ # Optional. The default is `false`. If every feature option is
204
+ # `false`, **all** features will be performed.
205
+ # @param [Boolean] syntax Whether to perform the syntactic analysis.
206
+ # Optional. The default is `false`. If every feature option is
207
+ # `false`, **all** features will be performed.
208
+ # @param [String] format The format of the document (TEXT/HTML).
209
+ # Optional.
210
+ # @param [String] language The language of the document (if not
211
+ # specified, the language is automatically detected). Both ISO and
212
+ # BCP-47 language codes are accepted. Optional.
213
+ # @param [String] encoding The encoding type used by the API to
214
+ # calculate offsets. Optional.
215
+ #
216
+ # @return [Annotation>] The results for the content analysis.
217
+ #
218
+ # @example
219
+ # require "google/cloud"
220
+ #
221
+ # gcloud = Google::Cloud.new
222
+ # language = gcloud.language
223
+ #
224
+ # content = "Darth Vader is the best villain in Star Wars."
225
+ # annotation = language.annotate content
226
+ #
227
+ # annotation.sentiment.polarity #=> 1.0
228
+ # annotation.sentiment.magnitude #=> 0.8999999761581421
229
+ # annotation.entities.count #=> 2
230
+ # annotation.sentences.count #=> 1
231
+ # annotation.tokens.count #=> 10
232
+ #
233
+ def annotate content, sentiment: false, entities: false, syntax: false,
234
+ format: nil, language: nil, encoding: nil
235
+ ensure_service!
236
+ doc = document content, language: language, format: format
237
+ grpc = service.annotate doc.to_grpc, sentiment: sentiment,
238
+ entities: entities,
239
+ syntax: syntax,
240
+ encoding: encoding
241
+ Annotation.from_grpc grpc
242
+ end
243
+ alias_method :mark, :annotate
244
+ alias_method :detect, :annotate
245
+
246
+ ##
247
+ # Syntactic analysis extracts linguistic information, breaking up the
248
+ # given text into a series of sentences and tokens (generally, word
249
+ # boundaries), providing further analysis on those tokens.
250
+ #
251
+ # @param [String, Document, Google::Cloud::Storage::File] content The
252
+ # content to annotate. This can be an {Document} instance, or any
253
+ # other type that converts to an {Document}. See {#document} for
254
+ # details.
255
+ # @param [String] format The format of the document (TEXT/HTML).
256
+ # Optional.
257
+ # @param [String] language The language of the document (if not
258
+ # specified, the language is automatically detected). Both ISO and
259
+ # BCP-47 language codes are accepted. Optional.
260
+ # @param [String] encoding The encoding type used by the API to
261
+ # calculate offsets. Optional.
262
+ #
263
+ # @return [Annotation>] The results for the content syntax analysis.
264
+ #
265
+ # @example
266
+ # require "google/cloud"
267
+ #
268
+ # gcloud = Google::Cloud.new
269
+ # language = gcloud.language
270
+ #
271
+ # document = language.document "Hello world!"
272
+ #
273
+ # annotation = language.syntax document
274
+ # annotation.thing #=> Some Result
275
+ #
276
+ def syntax content, format: nil, language: nil, encoding: nil
277
+ annotate content, syntax: true, format: format, language: language,
278
+ encoding: encoding
279
+ end
280
+
281
+ ##
282
+ # Entity analysis inspects the given text for known entities (proper
283
+ # nouns such as public figures, landmarks, etc.) and returns information
284
+ # about those entities.
285
+ #
286
+ # @param [String, Document] content The content to annotate. This
287
+ # can be an {Document} instance, or any other type that converts to an
288
+ # {Document}. See {#document} for details.
289
+ # @param [String] format The format of the document (TEXT/HTML).
290
+ # Optional.
291
+ # @param [String] language The language of the document (if not
292
+ # specified, the language is automatically detected). Both ISO and
293
+ # BCP-47 language codes are accepted. Optional.
294
+ # @param [String] encoding The encoding type used by the API to
295
+ # calculate offsets. Optional.
296
+ #
297
+ # @return [Annotation::Entities>] The results for the entities analysis.
298
+ #
299
+ # @example
300
+ # require "google/cloud"
301
+ #
302
+ # gcloud = Google::Cloud.new
303
+ # language = gcloud.language
304
+ #
305
+ # document = language.document "Hello Chris and Mike!"
306
+ #
307
+ # entities = language.entities document
308
+ # entities.count #=> 2
309
+ #
310
+ def entities content, format: :text, language: nil, encoding: nil
311
+ ensure_service!
312
+ doc = document content, language: language, format: format
313
+ grpc = service.entities doc.to_grpc, encoding: encoding
314
+ Annotation::Entities.from_grpc grpc
315
+ end
316
+
317
+ ##
318
+ # Sentiment analysis inspects the given text and identifies the
319
+ # prevailing emotional opinion within the text, especially to determine
320
+ # a writer's attitude as positive, negative, or neutral. Currently, only
321
+ # English is supported for sentiment analysis.
322
+ #
323
+ # @param [String, Document] content The content to annotate. This
324
+ # can be an {Document} instance, or any other type that converts to an
325
+ # {Document}. See {#document} for details.
326
+ # @param [String] format The format of the document (TEXT/HTML).
327
+ # Optional.
328
+ # @param [String] language The language of the document (if not
329
+ # specified, the language is automatically detected). Both ISO and
330
+ # BCP-47 language codes are accepted. Optional.
331
+ #
332
+ # @return [Annotation::Sentiment>] The results for the sentiment
333
+ # analysis.
334
+ #
335
+ # @example
336
+ # require "google/cloud"
337
+ #
338
+ # gcloud = Google::Cloud.new
339
+ # language = gcloud.language
340
+ #
341
+ # document = language.document "Hello Chris and Mike!"
342
+ #
343
+ # sentiment = language.sentiment document
344
+ # sentiment.polarity #=> 1.0
345
+ # sentiment.magnitude #=> 0.8999999761581421
346
+ #
347
+ def sentiment content, format: :text, language: nil
348
+ ensure_service!
349
+ doc = document content, language: language, format: format
350
+ grpc = service.sentiment doc.to_grpc
351
+ Annotation::Sentiment.from_grpc grpc
352
+ end
353
+
354
+ protected
355
+
356
+ ##
357
+ # @private Raise an error unless an active connection to the service is
358
+ # available.
359
+ def ensure_service!
360
+ fail "Must have active connection to service" unless service
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end