class AlchemyAPI

Public Class Methods

new(key) click to toggle source
# File lib/alchemyapi.rb, line 90
def initialize(key)

  if key.is_a?(String) && key.size == 40
    @apiKey = key
  else
    raise 'Invalid key for AlchemyAPI.'
  end
end

Public Instance Methods

author(flavor, data, options = {}) click to toggle source

Extracts the author from a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/author-extraction/ For the docs, please refer to: www.alchemyapi.com/api/author-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: none

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 201
def author(flavor, data, options = {})
  unless @@ENDPOINTS['author'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'author extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['author'][flavor], options)
end
category(flavor, data, options = {}) click to toggle source

Categorizes the text for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/text-categorization/ For the docs, please refer to: www.alchemyapi.com/api/text-categorization/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: showSourceText -> 0: disabled (default), 1: enabled

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 276
def category(flavor, data, options = {})
  unless @@ENDPOINTS['category'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'text categorization for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['category'][flavor], options)
end
combined(flavor, data, options = {}) click to toggle source

Combined call (see options below for available extractions) for a URL or text.

INPUT: flavor -> which version of the call, i.e. url or text. data -> the data to analyze, either the the url or text. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: extract -> VALUE,VALUE,VALUE,… (possible VALUEs: page-image,entity,keyword,title,author,taxonomy,concept,relation,doc-sentiment) extractMode -> (only applies when ‘page-image’ VALUE passed to ‘extract’ option)

trust-metadata: less CPU-intensive, less accurate
always-infer: more CPU-intensive, more accurate

disambiguate -> whether to disambiguate detected entities, 0: disabled, 1: enabled (default) linkedData -> whether to include Linked Data content links with disambiguated entities, 0: disabled, 1: enabled (default). disambiguate must be enabled to use this. coreference -> whether to he/she/etc coreferences into detected entities, 0: disabled, 1: enabled (default) quotations -> whether to enable quotations extraction, 0: disabled (default), 1: enabled sentiment -> whether to enable entity-level sentiment analysis, 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled. showSourceText -> 0: disabled (default), 1: enabled. maxRetrieve -> maximum number of named entities to extract (default: 50)

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 519
def combined(flavor, data, options = {})
  unless @@ENDPOINTS['combined'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'Combined data for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['combined'][flavor], options)
end
concepts(flavor, data, options = {}) click to toggle source

Tags the concepts for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/concept-tagging/ For the docs, please refer to: www.alchemyapi.com/api/concept-tagging/

Available Options: maxRetrieve -> the maximum number of concepts to retrieve (default: 8) linkedData -> include linked data, 0: disabled, 1: enabled (default) showSourceText -> 0:disabled (default), 1: enabled

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 251
def concepts(flavor, data, options = {})
  unless @@ENDPOINTS['concepts'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'concept tagging for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['concepts'][flavor], options)
end
entities(flavor, data, options = {}) click to toggle source

Extracts the entities for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/entity-extraction/ For the docs, please refer to: www.alchemyapi.com/api/entity-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: disambiguate -> disambiguate entities (i.e. Apple the company vs. apple the fruit). 0: disabled, 1: enabled (default) linkedData -> include linked data on disambiguated entities. 0: disabled, 1: enabled (default) coreference -> resolve coreferences (i.e. the pronouns that correspond to named entities). 0: disabled, 1: enabled (default) quotations -> extract quotations by entities. 0: disabled (default), 1: enabled. sentiment -> analyze sentiment for each entity. 0: disabled (default), 1: enabled. Requires 1 additional API transction if enabled. showSourceText -> 0: disabled (default), 1: enabled maxRetrieve -> the maximum number of entities to retrieve (default: 50)

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 176
def entities(flavor, data, options = {})
  unless @@ENDPOINTS['entities'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'entity extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['entities'][flavor], options)
end
feeds(flavor, data, options = {}) click to toggle source

Detects the RSS/ATOM feeds for a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/feed-detection/ For the docs, please refer to: www.alchemyapi.com/api/feed-detection/

INPUT: flavor -> which version of the call, i.e. url or html. data -> the data to analyze, either the the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: none

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 461
def feeds(flavor, data, options = {})
  unless @@ENDPOINTS['feeds'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'feed detection for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['feeds'][flavor], options)
end
image_extract(flavor, data, options = {}) click to toggle source

Extract image from a URL.

INPUT: flavor -> which version of the call, i.e. url. data -> the data to analyze, i.e. the url. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: extractMode -> trust-metadata: less CPU-intensive and less accurate, always-infer: more CPU-intensive and more accurate

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 542
def image_extract(flavor, data, options = {})
  unless @@ENDPOINTS['image_extract'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'Image for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['image_extract'][flavor], options)
end
image_tag(flavor, data, options = {}, image = '') click to toggle source

Tag image from a URL or raw image data. For an overview, please refer to: www.alchemyapi.com/products/features/image-tagging/ For the docs, please refer to: www.alchemyapi.com/api/image-tagging/

INPUT: flavor -> which version of the call, i.e. url or image. data -> the data to analyze, the url options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: extractMode -> trust-metadata: less CPU-intensive and less accurate, always-infer: more CPU-intensive and more accurate (image flavor only) imagePostMode -> how you will post the image

raw: pass an unencoded image file using POST

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 570
def image_tag(flavor, data, options = {}, image = '')
  unless @@ENDPOINTS['image_tag'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'Image tagging for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  unless data.empty?
    options[flavor] = data
  end
  return analyze_image(@@ENDPOINTS['image_tag'][flavor], options, image)
end
keywords(flavor, data, options = {}) click to toggle source

Extracts the keywords from text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/keyword-extraction/ For the docs, please refer to: www.alchemyapi.com/api/keyword-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: keywordExtractMode -> normal (default), strict sentiment -> analyze sentiment for each keyword. 0: disabled (default), 1: enabled. Requires 1 additional API transaction if enabled. showSourceText -> 0: disabled (default), 1: enabled. maxRetrieve -> the max number of keywords returned (default: 50)

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 229
def keywords(flavor, data, options = {})
  unless @@ENDPOINTS['keywords'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'keyword extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['keywords'][flavor], options)
end
language(flavor, data, options = {}) click to toggle source

Detects the language for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/api/language-detection/ For the docs, please refer to: www.alchemyapi.com/products/features/language-detection/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: none

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 335
def language(flavor, data, options = {})
  unless @@ENDPOINTS['language'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'language detection for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['language'][flavor], options)
end
microformats(flavor, data, options = {}) click to toggle source

Parses the microformats for a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/microformats-parsing/ For the docs, please refer to: www.alchemyapi.com/api/microformats-parsing/

INPUT: flavor -> which version of the call, i.e. url or html. data -> the data to analyze, either the the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: none

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 436
def microformats(flavor, data, options = {})
  unless @@ENDPOINTS['microformats'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'microformats parsing for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['microformats'][flavor], options)
end
relations(flavor, data, options = {}) click to toggle source

Extracts the relations for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/relation-extraction/ For the docs, please refer to: www.alchemyapi.com/api/relation-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: sentiment -> 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled. keywords -> extract keywords from the subject and object. 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled. entities -> extract entities from the subject and object. 0: disabled (default), 1: enabled. Requires one additional API transaction if enabled. requireEntities -> only extract relations that have entities. 0: disabled (default), 1: enabled. sentimentExcludeEntities -> exclude full entity name in sentiment analysis. 0: disabled, 1: enabled (default) disambiguate -> disambiguate entities (i.e. Apple the company vs. apple the fruit). 0: disabled, 1: enabled (default) linkedData -> include linked data with disambiguated entities. 0: disabled, 1: enabled (default). coreference -> resolve entity coreferences. 0: disabled, 1: enabled (default) showSourceText -> 0: disabled (default), 1: enabled. maxRetrieve -> the maximum number of relations to extract (default: 50, max: 100)

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 310
def relations(flavor, data, options = {})
  unless @@ENDPOINTS['relations'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'relation extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['relations'][flavor], options)
end
sentiment(flavor, data, options = {}) click to toggle source

Calculates the sentiment for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/sentiment-analysis/ For the docs, please refer to: www.alchemyapi.com/api/sentiment-analysis/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: showSourceText -> 0: disabled (default), 1: enabled

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 114
def sentiment(flavor, data, options = {})
  unless @@ENDPOINTS['sentiment'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'sentiment analysis for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['sentiment'][flavor], options)
end
sentiment_targeted(flavor, data, target, options = {}) click to toggle source

Calculates the targeted sentiment for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/sentiment-analysis/ For the docs, please refer to: www.alchemyapi.com/api/sentiment-analysis/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. target -> the word or phrase to run sentiment analysis on. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: showSourceText -> 0: disabled, 1: enabled

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 140
def sentiment_targeted(flavor, data, target, options = {})
  if target == '' || target.nil?
    return { 'status' => 'ERROR', 'statusMessage' => 'targeted sentiment requires a non-null target' }
  end

  unless @@ENDPOINTS['sentiment_targeted'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'targeted sentiment analysis for ' + flavor + ' not available' }
  end

  # Add the URL encoded data and the target to the options and analyze
  options[flavor] = data
  options['target'] = target
  return analyze(@@ENDPOINTS['sentiment_targeted'][flavor], options)
end
taxonomy(flavor, data, options = {}) click to toggle source

Categorizes the text for a URL, text or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/text-categorization/ For the docs, please refer to: www.alchemyapi.com/api/taxonomy/

INPUT: flavor -> which version of the call, i.e. url, text or html. data -> the data to analyze, either the the url, text or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: showSourceText -> 0: disabled (default), 1: enabled.

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 486
def taxonomy(flavor, data, options = {})
  unless @@ENDPOINTS['taxonomy'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'Taxonomy info for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['taxonomy'][flavor], options)
end
text(flavor, data, options = {}) click to toggle source

Extracts the cleaned text (removes ads, navigation, etc.) for text, a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/text-extraction/ For the docs, please refer to: www.alchemyapi.com/api/text-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: useMetadata -> utilize meta description data, 0: disabled, 1: enabled (default) extractLinks -> include links, 0: disabled (default), 1: enabled.

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 361
def text(flavor, data, options = {})
  unless @@ENDPOINTS['text'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'clean text extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['text'][flavor], options)
end
text_raw(flavor, data, options = {}) click to toggle source

Extracts the raw text (includes ads, navigation, etc.) for a URL or HTML. For an overview, please refer to: www.alchemyapi.com/products/features/text-extraction/ For the docs, please refer to: www.alchemyapi.com/api/text-extraction/

INPUT: flavor -> which version of the call, i.e. text, url or html. data -> the data to analyze, either the text, the url or html code. options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.

Available Options: none

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 386
def text_raw(flavor, data, options = {})
  unless @@ENDPOINTS['text_raw'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'raw text extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['text_raw'][flavor], options)
end
title(flavor, data, options = {}) click to toggle source

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 411
def title(flavor, data, options = {})
  unless @@ENDPOINTS['title'].key?(flavor)
    return { 'status' => 'ERROR', 'statusInfo' => 'title extraction for ' + flavor + ' not available' }
  end

  # Add the URL encoded data to the options and analyze
  options[flavor] = data
  return analyze(@@ENDPOINTS['title'][flavor], options)
end

Private Instance Methods

analyze(url, options) click to toggle source

HTTP Request wrapper that is called by the endpoint functions. This function is not intended to be called through an external interface. It makes the call, then converts the returned JSON string into a Ruby object.

INPUT: url -> the full URI encoded url

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 593
def analyze(url, options)
  # Insert the base URL
  url = @@BASE_URL + url

  # Add the API key and set the output mode to JSON
  options['apikey'] = @apiKey
  options['outputMode'] = 'json'

  uri = URI.parse(url)

  # Force Faraday using excon, to avoid Zlib::BufError: buffer error
  Faraday.default_adapter = :excon

  request = Faraday.new(url: "#{uri.scheme}://#{uri.host}")

  # Fire off the HTTP request
  res = request.post uri.request_uri, options

  # parse and return the response
  return JSON.parse(res.body)
end
analyze_image(url, options, body) click to toggle source

HTTP Request wrapper that is called by the endpoint functions. This function is not intended to be called through an external interface. It makes the call, then converts the returned JSON string into a Ruby object.

INPUT: url -> the full URI encoded url body -> the raw binary image data

OUTPUT: The response, already converted from JSON to a Ruby object.

# File lib/alchemyapi.rb, line 625
def analyze_image(url, options, body)
  # Insert the base URL
  url = @@BASE_URL + url

  # Add the API key and set the output mode to JSON
  options['apikey'] = @apiKey
  options['outputMode'] = 'json'

  url += '?'
  options.each { |h, v|
    url += h + '=' + v + '&'
  }

  # Parse URL
  uri = URI.parse(url)

  # Force Faraday using excon, to avoid Zlib::BufError: buffer error
  Faraday.default_adapter = :excon

  request = Faraday.new(url: "#{uri.scheme}://#{uri.host}")

  # Fire off the HTTP request
  res = request.post uri.request_uri, body.to_s

  # parse and return the response
  return JSON.parse(res.body)
end