diff --git a/lib/alchemy_api.rb b/lib/alchemy_api.rb index 6f07d68..c357970 100644 --- a/lib/alchemy_api.rb +++ b/lib/alchemy_api.rb @@ -9,6 +9,7 @@ require 'alchemy_api/language_detection' require 'alchemy_api/term_extraction' require 'alchemy_api/text_extraction' +require 'alchemy_api/named_entity_extraction' module AlchemyApi @api_key = nil diff --git a/lib/alchemy_api/concept_tagging.rb b/lib/alchemy_api/concept_tagging.rb index 516e346..68a1c46 100644 --- a/lib/alchemy_api/concept_tagging.rb +++ b/lib/alchemy_api/concept_tagging.rb @@ -1,7 +1,6 @@ # TODO: add support for linkedData return fields module AlchemyApi ConceptTaggingResult = Struct.new(:concepts, :language, :url, :source_text) - Concept = Struct.new(:text, :relevance) class ConceptTagging < Base # http://www.alchemyapi.com/api/concept/textc.html @@ -51,10 +50,8 @@ class ConceptTagging < Base def self.get_concepts_handler(response) json = get_json(response) - concepts = json['concepts'].map do |c| - Concept.new(c['text'], c['relevance'].to_f) - end - ConceptTaggingResult.new(concepts, json['language'], json['url'], json['text']) + + ConceptTaggingResult.new(json['concepts'], json['language'], json['url'], json['text']) end end end diff --git a/lib/alchemy_api/named_entity_extraction.rb b/lib/alchemy_api/named_entity_extraction.rb new file mode 100644 index 0000000..7b954f8 --- /dev/null +++ b/lib/alchemy_api/named_entity_extraction.rb @@ -0,0 +1,25 @@ +module AlchemyApi + NamedEntitiesResult = Struct.new(:entities, :language, :url, :source_text) + + class NamedEntityExtraction < Base + + post(:get_named_entities_from_text) do |text, *args| + options = args.first || {} + uri "#{AlchemyApi.base_text_uri}/TextGetRankedNamedEntities" + params :text => text, + :url => options[:url], + :maxRetrieve => options[:max_retrieve] || 10, + :showSourceText => options[:show_source_text] ? 1 : 0 + handler do |response| + AlchemyApi::NamedEntityExtraction.get_ranked_entities_handler(response) + end + end + + def self.get_ranked_entities_handler(response) + json = get_json(response) + + NamedEntitiesResult.new(json['entities'], json['language'], + json['url'], json['text']) + end + end +end diff --git a/lib/alchemy_api/term_extraction.rb b/lib/alchemy_api/term_extraction.rb index 97974a7..b737e41 100644 --- a/lib/alchemy_api/term_extraction.rb +++ b/lib/alchemy_api/term_extraction.rb @@ -1,6 +1,5 @@ module AlchemyApi TermExtractionResult = Struct.new(:keywords, :language, :url, :source_text) - Keyword = Struct.new(:text, :relevance) class TermExtraction < Base post(:get_ranked_keywords_from_html) do |html, *args| @@ -46,10 +45,8 @@ class TermExtraction < Base def self.get_ranked_keywords_handler(response) json = get_json(response) - keywords = json['keywords'].map do |kw| - Keyword.new(kw['text'], kw['relevance'].to_f) - end - TermExtractionResult.new(keywords, json['language'], + + TermExtractionResult.new(json['keywords'], json['language'], json['url'], json['text']) end end diff --git a/spec/alchemy_api/named_entity_extraction_spec.rb b/spec/alchemy_api/named_entity_extraction_spec.rb new file mode 100644 index 0000000..dcbc850 --- /dev/null +++ b/spec/alchemy_api/named_entity_extraction_spec.rb @@ -0,0 +1,24 @@ +require File.dirname(__FILE__) + "/../spec_helper" + +describe AlchemyApi::NamedEntityExtraction do + + typhoeus_spec_cache('spec/cache/named_entity_extraction/get_named_entity_text') do |hydra| + describe "#get_named_entities_from_text" do + before(:each) do + @url = "http://test.com" + text = fixture_for('article.txt') + @result = AlchemyApi::NamedEntityExtraction. + get_named_entities_from_text(text, + :url => @url, + :max_retrieve => 5, + :show_source_text => true) + end + + it "should return at least one entity" do + @results.entites.should_not be_empty + end + end + end + +end +