abstractor 1.0.23 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/assets/javascripts/abstractor/abstractor.js +7 -0
- data/app/assets/stylesheets/abstractor/abstractor_abstractions.css +20 -0
- data/app/models/abstractor/abstractor_abstraction.rb +2 -1
- data/app/models/abstractor/abstractor_abstraction_group_member.rb +0 -1
- data/app/models/abstractor/abstractor_abstraction_source_type.rb +5 -0
- data/app/models/abstractor/abstractor_indirect_source.rb +5 -0
- data/app/models/abstractor/abstractor_subject.rb +1 -1
- data/app/views/abstractor/abstractor_abstractions/_fields.html.haml +1 -1
- data/app/views/abstractor/abstractor_abstractions/edit.html.haml +17 -2
- data/db/migrate/20140718014952_refactor_abstractor_rule_types.rb +29 -0
- data/lib/abstractor/abstractable.rb +14 -8
- data/lib/abstractor/methods/models/abstractor_abstraction.rb +17 -2
- data/lib/abstractor/methods/models/abstractor_abstraction_source.rb +4 -1
- data/lib/abstractor/methods/models/abstractor_abstraction_source_type.rb +16 -0
- data/lib/abstractor/methods/models/abstractor_indirect_source.rb +17 -0
- data/lib/abstractor/methods/models/abstractor_rule_type.rb +1 -1
- data/lib/abstractor/methods/models/abstractor_subject.rb +191 -151
- data/lib/abstractor/setup.rb +9 -6
- data/lib/abstractor/version.rb +1 -1
- data/lib/generators/abstractor/install/install_generator.rb +4 -4
- data/lib/tasks/abstractor_tasks.rake +5 -5
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZmI1ZTY3ZWJlZTU1MjhhNWU1MDYxZWNkNWQxMWE5YTUzOTlmYjM3NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
M2YyMGQwOWFmMTRiYzdkZTRlY2IzOWFhNzAwYzIzYmU1MjUzMzdhMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTAxZDAyMzE0OTQ2YzYxYWE0OWY4ZmUyYzhmYzlkOWJjN2M1ZWE4YzcxZmE4
|
10
|
+
MDdiZTNjZDA1ZDljYTc3ZjJkZDZjNDY2ZDAwZTMxMGFiMzdjN2Y0NGRlYzk0
|
11
|
+
YTkwOTdmMjY5N2M3NjQ3ZDkxODYxZDRhOTI0ODE0ODRlYzQxMzY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YWM2YmE0MDI2ZmEzZjljMmU0OWVlMmE1MmQ5YTgzNzg3ZDk0Mzc0OTFlMWNk
|
14
|
+
YTA1M2JlMWZiY2QyZDU1ZGEwYjYxZWJiMzQ1NTg4ZmRhMTY2YWY0Mjc2Yzk4
|
15
|
+
YTU3YzdhNWUzMTk5NzgyMTY4ZmMzMDJlNzI3ZmRlZjM4MTE4Mzg=
|
@@ -71,6 +71,13 @@ Abstractor.AbstractionUI = function(){
|
|
71
71
|
zIndex: 40000,
|
72
72
|
dialogClass: "ui-dialog_abstractor"
|
73
73
|
});
|
74
|
+
|
75
|
+
$(document).on('change', 'select.indirect_source_list', function () {
|
76
|
+
var source_type = $(this).attr('rel'),
|
77
|
+
value = $(this).find('option:selected').prop('value');
|
78
|
+
$(this).siblings('.indirect_source_text').hide();
|
79
|
+
$(this).siblings('.' + source_type + '_' + value).show();
|
80
|
+
});
|
74
81
|
};
|
75
82
|
|
76
83
|
Abstractor.AbstractionSuggestionUI = function(){
|
@@ -310,4 +310,24 @@ span.tooltip_img {
|
|
310
310
|
}
|
311
311
|
.abstractor_abstraction_actions a {
|
312
312
|
margin: .25em;
|
313
|
+
}
|
314
|
+
|
315
|
+
.abstractor_abstraction_edit .indirect_source_list {
|
316
|
+
margin-bottom: 1em;
|
317
|
+
}
|
318
|
+
|
319
|
+
.indirect_sources label {
|
320
|
+
font-weight: bold !important;
|
321
|
+
}
|
322
|
+
|
323
|
+
.indirect_source_list {
|
324
|
+
width: 20em;
|
325
|
+
}
|
326
|
+
|
327
|
+
.indirect_source_text {
|
328
|
+
border: 1px solid #969696;
|
329
|
+
}
|
330
|
+
|
331
|
+
.indirect_source {
|
332
|
+
margin-bottom: 1em;
|
313
333
|
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Abstractor
|
2
2
|
class AbstractorAbstraction < ActiveRecord::Base
|
3
3
|
include Abstractor::Methods::Models::AbstractorAbstraction
|
4
|
-
# @!parse
|
4
|
+
# @!parse include Abstractor::Methods::Models::AbstractorAbstraction::InstanceMethods
|
5
|
+
# @!parse extend Abstractor::Methods::Models::AbstractorAbstraction::ClassMethods
|
5
6
|
end
|
6
7
|
end
|
@@ -57,7 +57,7 @@
|
|
57
57
|
%hr
|
58
58
|
- else
|
59
59
|
.column-9
|
60
|
-
- abstractor_abstraction.abstractor_subject.abstractor_abstraction_sources.each do |abstractor_abstraction_source|
|
60
|
+
- abstractor_abstraction.abstractor_subject.abstractor_abstraction_sources.select { |s| s.abstractor_abstraction_source_type.name == 'nlp suggestion' }.each do |abstractor_abstraction_source|
|
61
61
|
- from_method = abstractor_abstraction_source.from_method
|
62
62
|
- if about.respond_to?(from_method)
|
63
63
|
%span{ :class => 'abstractor_abstraction_source_tooltip_img label', :rel => "#abstraction_text_#{abstractor_abstraction_source.id}", :title => "#{about.class.to_s} #{from_method}"}
|
@@ -43,10 +43,9 @@
|
|
43
43
|
= f.label :unknown, 'unknown'
|
44
44
|
.column-3
|
45
45
|
- abstractor_abstraction = f.object
|
46
|
-
- abstraction_sources = abstractor_abstraction.abstractor_subject.abstractor_abstraction_sources.
|
46
|
+
- abstraction_sources = abstractor_abstraction.abstractor_subject.abstractor_abstraction_sources.select { |s| s.abstractor_abstraction_source_type.name == 'nlp suggestion' }
|
47
47
|
- abstraction_sources.each do |abstraction_source|
|
48
48
|
- from_method = abstraction_source.from_method
|
49
|
-
-#%b= from_method.titleize
|
50
49
|
%span{ :class => 'abstractor_abstraction_source_tooltip_img label', :rel => "#abstraction_text_#{abstraction_source.id}", :title => "#{abstractor_abstraction.about.class.to_s} #{from_method}"}
|
51
50
|
= image_tag('abstractor/page.png', :id => "abstraction_text_link_#{abstraction_source.id}")
|
52
51
|
%br
|
@@ -56,3 +55,19 @@
|
|
56
55
|
= f.submit 'Save', :class => 'button positive'
|
57
56
|
= link_to 'Cancel', abstractor_abstraction, :class => 'button negative', :remote => true
|
58
57
|
.clear
|
58
|
+
.indirect_sources
|
59
|
+
- abstraction_sources = abstractor_abstraction.abstractor_subject.abstractor_abstraction_sources.select { |s| s.abstractor_abstraction_source_type.name == 'indirect' }
|
60
|
+
= f.fields_for :abstractor_indirect_sources, f.object.abstractor_indirect_sources do |abstractor_indirect_source_form|
|
61
|
+
.indirect_source
|
62
|
+
- abstraction_source = abstraction_sources.select { |abstraction_source| abstraction_source.id == abstractor_indirect_source_form.object.abstractor_abstraction_source_id }.first
|
63
|
+
- source_setup = abstractor_abstraction.about.send(abstraction_source.from_method)
|
64
|
+
- sources = source_setup[:sources].all
|
65
|
+
%label
|
66
|
+
Indirect Source:
|
67
|
+
= source_setup[:source_type].tableize.humanize
|
68
|
+
%br
|
69
|
+
= abstractor_indirect_source_form.select :source_id, sources.map{ |s| [s.send(source_setup[:source_name_method]), s.id] }, { :include_blank => 'None' }, :size => "#{sources.size + 1}", class: 'indirect_source_list', rel: "#{source_setup[:source_type]}"
|
70
|
+
- sources.each do |source|
|
71
|
+
- hidden = abstractor_indirect_source_form.object.source_id == source.id ? '' : 'hidden'
|
72
|
+
%div{ class: "indirect_source_text #{hidden} #{source_setup[:source_type]}_#{source.id}"}
|
73
|
+
= source.send(source_setup[:source_method])
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class RefactorAbstractorRuleTypes < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
create_table :abstractor_abstraction_source_types do |t|
|
4
|
+
t.string :name
|
5
|
+
t.datetime :deleted_at
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
|
9
|
+
add_column :abstractor_abstraction_sources, :abstractor_abstraction_source_type_id, :integer
|
10
|
+
add_column :abstractor_abstraction_sources, :abstractor_rule_type_id, :integer
|
11
|
+
remove_column :abstractor_subjects, :abstractor_rule_type_id
|
12
|
+
|
13
|
+
create_table :abstractor_indirect_sources do |t|
|
14
|
+
t.integer :abstractor_abstraction_id
|
15
|
+
t.integer :abstractor_abstraction_source_id
|
16
|
+
t.string :source_type
|
17
|
+
t.integer :source_id
|
18
|
+
t.string :source_method
|
19
|
+
t.datetime :deleted_at
|
20
|
+
t.timestamps
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def down
|
25
|
+
drop_table :abstractor_abstraction_source_types
|
26
|
+
remove_column :abstractor_abstraction_sources, :abstractor_abstraction_source_type_id
|
27
|
+
add_column :abstractor_subjects, :abstractor_rule_type_id, :integer
|
28
|
+
end
|
29
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
module Abstractor
|
2
2
|
module Abstractable
|
3
|
+
# @!parse include Abstractor::Abstractable::InstanceMethods
|
4
|
+
# @!parse extend Abstractor::Abstractable::ClassMethods
|
3
5
|
def self.included(base)
|
4
6
|
base.class_eval do
|
5
7
|
has_many :abstractor_abstractions, class_name: Abstractor::AbstractorAbstraction, as: :about
|
@@ -66,16 +68,20 @@ module Abstractor
|
|
66
68
|
end
|
67
69
|
|
68
70
|
module ClassMethods
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
##
|
72
|
+
# Returns all abstractable entities filtered by the parameter abstractor_abstraction_status:
|
73
|
+
#
|
74
|
+
# * 'needs_review': Filter abstractable entites having at least one abstraction without a determined value (value, unknown or not_applicable).
|
75
|
+
# * 'reviewed': Filter abstractable entites having no abstractions without a determined value (value, unknown or not_applicable).
|
76
|
+
#
|
77
|
+
# @param [String] abstractor_abstraction_status Filter abstactable entities that an abstraction that 'needs_review' or are all abstractions are 'reviewed'.
|
78
|
+
# @return [ActiveRecord::Relation] List of abstractable entities.
|
79
|
+
def by_abstractor_abstraction_status(abstractor_abstraction_status)
|
80
|
+
case abstractor_abstraction_status
|
75
81
|
when 'needs_review'
|
76
|
-
where(["EXISTS (SELECT 1 FROM abstractor_subjects asb JOIN abstractor_abstractions aa ON asb.id = aa.abstractor_subject_id AND asb.subject_type = '#{self.to_s}'
|
82
|
+
where(["EXISTS (SELECT 1 FROM abstractor_subjects asb JOIN abstractor_abstractions aa ON asb.id = aa.abstractor_subject_id AND asb.subject_type = '#{self.to_s}' WHERE #{self.table_name}.id = aa.about_id AND aa.value IS NULL AND (aa.unknown IS NULL OR aa.unknown = ?) AND (aa.not_applicable IS NULL OR aa.not_applicable = ?))", false, false])
|
77
83
|
when 'reviewed'
|
78
|
-
where(["EXISTS (SELECT 1 FROM abstractor_subjects asb JOIN abstractor_abstractions aa ON asb.id = aa.abstractor_subject_id AND asb.subject_type = '#{self.to_s}'
|
84
|
+
where(["EXISTS (SELECT 1 FROM abstractor_subjects asb JOIN abstractor_abstractions aa ON asb.id = aa.abstractor_subject_id AND asb.subject_type = '#{self.to_s}' WHERE #{self.table_name}.id = aa.about_id) AND NOT EXISTS (SELECT 1 FROM abstractor_subjects asb JOIN abstractor_abstractions aa ON asb.id = aa.abstractor_subject_id AND asb.subject_type = '#{self.to_s}'WHERE #{self.table_name}.id = aa.about_id AND aa.value IS NOT NULL AND aa.unknown != ? AND aa.not_applicable != ?)", true, true])
|
79
85
|
else
|
80
86
|
where(nil)
|
81
87
|
end
|
@@ -11,19 +11,21 @@ module Abstractor
|
|
11
11
|
|
12
12
|
base.send :has_many, :abstractor_suggestions
|
13
13
|
base.send :has_many, :abstractor_abstraction_sources, :through => :abstractor_abstractor_suggestions
|
14
|
+
base.send :has_many, :abstractor_indirect_sources
|
14
15
|
|
15
16
|
base.send :has_one, :abstractor_abstraction_group_member
|
16
17
|
base.send :has_one, :abstractor_abstraction_group, :through => :abstractor_abstraction_group_member
|
17
18
|
base.send :has_one, :abstractor_abstraction_schema, :through => :abstractor_subject
|
18
19
|
|
19
20
|
base.send :accepts_nested_attributes_for, :abstractor_suggestions
|
21
|
+
base.send :accepts_nested_attributes_for, :abstractor_indirect_sources
|
20
22
|
|
21
23
|
base.send :belongs_to, :about, polymorphic: true
|
22
24
|
|
23
|
-
base.send :attr_accessible, :about, :abstractor_subject, :abstractor_subject_id, :value, :about_type, :about_id, :unknown, :not_applicable, :deleted_at
|
25
|
+
base.send :attr_accessible, :about, :abstractor_subject, :abstractor_subject_id, :value, :about_type, :about_id, :unknown, :not_applicable, :deleted_at, :abstractor_indirect_sources_attributes
|
24
26
|
|
25
27
|
# Hooks
|
26
|
-
base.send :after_save, :review_matching_suggestions
|
28
|
+
base.send :after_save, :review_matching_suggestions
|
27
29
|
|
28
30
|
base.send(:include, InstanceMethods)
|
29
31
|
base.extend(ClassMethods)
|
@@ -68,6 +70,19 @@ module Abstractor
|
|
68
70
|
abstractor_suggestion_status_needs_review = Abstractor::AbstractorSuggestionStatus.where(name: 'Needs review').first
|
69
71
|
abstractor_suggestions.any? { |abstractor_suggestion| abstractor_suggestion.abstractor_suggestion_status == abstractor_suggestion_status_needs_review }
|
70
72
|
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# Detects if the abstraction already has an Abstractor::AbstractorIndirectSource based on the Abstractor::AbstractorAbstractionSource passed via the abstractor_abstraction_source parameter.
|
76
|
+
# Retuns it if present. Otherwise nil.
|
77
|
+
#
|
78
|
+
# @param [Abstractor::AbstractorAbstractionSource] abstractor_abstraction_source An instance of Abstractor::AbstractorAbstractionSource to check for the presence of an Abstractor::AbstractorIndirectSource.
|
79
|
+
# @return [Abstractor::AbstractorIndirectSource, nil]
|
80
|
+
def detect_abstractor_indirect_source(abstractor_abstraction_source)
|
81
|
+
abstractor_indirect_source = nil
|
82
|
+
abstractor_indirect_source = abstractor_indirect_sources(true).detect do |ais|
|
83
|
+
ais.abstractor_abstraction_source == abstractor_abstraction_source
|
84
|
+
end
|
85
|
+
end
|
71
86
|
end
|
72
87
|
|
73
88
|
module ClassMethods
|
@@ -7,10 +7,13 @@ module Abstractor
|
|
7
7
|
|
8
8
|
# Associations
|
9
9
|
base.send :belongs_to, :abstractor_subject
|
10
|
+
base.send :belongs_to, :abstractor_rule_type
|
11
|
+
base.send :belongs_to, :abstractor_abstraction_source_type
|
10
12
|
base.send :has_many, :abstractor_suggestion_sources
|
11
13
|
base.send :has_many, :abstractor_abstractions, :through => :abstractor_suggestion_sources
|
14
|
+
base.send :has_many, :abstractor_indirect_sources
|
12
15
|
|
13
|
-
base.send :attr_accessible, :abstractor_subject, :abstractor_subject_id, :deleted_at, :from_method, :custom_method
|
16
|
+
base.send :attr_accessible, :abstractor_subject, :abstractor_subject_id, :deleted_at, :from_method, :custom_method, :abstractor_rule_type, :abstractor_rule_type_id, :abstractor_abstraction_source_type, :abstractor_abstraction_source_type_id
|
14
17
|
end
|
15
18
|
|
16
19
|
def normalize_from_method_to_sources(about)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Abstractor
|
2
|
+
module Methods
|
3
|
+
module Models
|
4
|
+
module AbstractorAbstractionSourceType
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, SoftDelete
|
7
|
+
|
8
|
+
# Associations
|
9
|
+
base.send :has_many, :abstractor_abstraction_sources
|
10
|
+
|
11
|
+
base.send :attr_accessible, :deleted_at, :name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Abstractor
|
2
|
+
module Methods
|
3
|
+
module Models
|
4
|
+
module AbstractorIndirectSource
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, SoftDelete
|
7
|
+
|
8
|
+
# Associations
|
9
|
+
base.send :belongs_to, :abstractor_abstraction_source
|
10
|
+
base.send :belongs_to, :abstractor_abstraction
|
11
|
+
|
12
|
+
base.send :attr_accessible, :abstractor_abstraction_id, :abstractor_abstraction, :abstractor_abstraction_source_id, :abstractor_abstraction_source, :source_type, :source_id, :source_method, :reviewed
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -6,7 +6,6 @@ module Abstractor
|
|
6
6
|
base.send :include, SoftDelete
|
7
7
|
|
8
8
|
# Associations
|
9
|
-
base.send :belongs_to, :abstractor_rule_type
|
10
9
|
base.send :belongs_to, :abstractor_abstraction_schema
|
11
10
|
|
12
11
|
base.send :has_one, :abstractor_subject_group_member
|
@@ -19,119 +18,168 @@ module Abstractor
|
|
19
18
|
base.send :has_many, :subject_relations, :class_name => "Abstractor::AbstractorSubjectRelation", :foreign_key => "subject_id"
|
20
19
|
|
21
20
|
|
22
|
-
base.send :attr_accessible, :abstractor_abstraction_schema, :abstractor_abstraction_schema_id, :
|
21
|
+
base.send :attr_accessible, :abstractor_abstraction_schema, :abstractor_abstraction_schema_id, :subject_type, :dynamic_list_method
|
23
22
|
base.send(:include, InstanceMethods)
|
24
23
|
end
|
25
24
|
|
26
25
|
module InstanceMethods
|
27
26
|
##
|
28
|
-
# Creates or finds
|
27
|
+
# Creates or finds an instance of an Abstractor::AbstractorAbstraction.
|
29
28
|
# The method will create instances of Abstractor::AbstractorSuggestion and
|
30
29
|
# Abstractor::AbstractorSuggestionSource for the abstractable entity
|
31
30
|
# passed via the about parameter.
|
32
31
|
#
|
33
|
-
# The
|
32
|
+
# The method cycles through each Abstractor::AbstractorAbstractionSource setup
|
33
|
+
# for the instance of the Abstractor::AbstractorSubject.
|
34
|
+
# The Abstractor::AbstractorSubject#abstractor_abstraction_source_type
|
35
|
+
# attribute determines the abstraction strategy:
|
36
|
+
#
|
37
|
+
# * 'nlp suggestion': creates instances of Abstractor::AbstractorSuggestion based on natural language processing (nlp) logic searching the text provided by the Abstractor::AbstractorSubject#from_methd attribute.
|
38
|
+
# * 'custom suggestion': creates instances of Abstractor::AbstractorSuggestion based on custom logic delegated to the method configured in AbstractorAbstractionSource#custom_method.
|
39
|
+
# * 'indirect': creates an instance of Abstractor::AbstractorIndirectSource wih null source_type, source_id, source_method attributes -- all waiting to be set upon selection of an indirect source.
|
40
|
+
#
|
41
|
+
# @param [ActiveRecord::Base] about The entity to abstract. An instance of the class specified in the Abstractor::AbstractorSubject#subject_type attribute.
|
42
|
+
# @return [void]
|
43
|
+
def abstract(about)
|
44
|
+
abstractor_abstraction = about.find_or_create_abstractor_abstraction(abstractor_abstraction_schema, self)
|
45
|
+
|
46
|
+
abstractor_abstraction_sources.each do |abstractor_abstraction_source|
|
47
|
+
case abstractor_abstraction_source.abstractor_abstraction_source_type.name
|
48
|
+
when 'nlp suggestion'
|
49
|
+
abstract_nlp_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
50
|
+
when 'custom suggestion'
|
51
|
+
abstract_custom_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
52
|
+
when 'indirect'
|
53
|
+
abstract_indirect_source(about, abstractor_abstraction, abstractor_abstraction_source)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Creates an instance of Abstractor::AbstractorIndirectSource -- if one does not already exist --
|
60
|
+
# for the abstractor_abstraction and abstraction_source parameters.
|
61
|
+
# An 'indirect' Abstractor::AbstractorAbstractionSources give developers
|
62
|
+
# the ability to define a pool of documents that are indrectly related to an
|
63
|
+
# abstraction. The developer is responsible for implementing a
|
64
|
+
# method on the abstractable enttiy specified in Abstractor::AbstractorAbstractionSource#from_method.
|
65
|
+
# The method should return a hash with the following keys populated:
|
66
|
+
#
|
67
|
+
# * [Array<ActiveRecord::Base>] :sources An array of active record objects that constitute the list of indirect sources.
|
68
|
+
# * [Symbol] :source_id A method specifying the primary key of each member in sources.
|
69
|
+
# * [Symbol] :source_method A method specifying the source text of each member in sources.
|
70
|
+
#
|
71
|
+
# @param [ActiveRecord::Base] about The entity to abstract. An instance of the class specified in the Abstractor::AbstractorSubject#subject_type attribute.
|
72
|
+
# @param [Abstractor::AbstractorAbstraction] abstractor_abstraction The instance of Abstractor::AbstractorAbstraction to insert an indirect source.
|
73
|
+
# @param [Abstractor::AbstractorAbstractionSource] abstractor_abstraction_source The instance of the Abstractor::AbstractorAbstractionSource that provides the indirec source.
|
74
|
+
# @return [void]
|
75
|
+
def abstract_indirect_source(about, abstractor_abstraction, abstractor_abstraction_source)
|
76
|
+
if !abstractor_abstraction.detect_abstractor_indirect_source(abstractor_abstraction_source)
|
77
|
+
source = about.send(abstractor_abstraction_source.from_method)
|
78
|
+
abstractor_abstraction.abstractor_indirect_sources.build(abstractor_abstraction_source: abstractor_abstraction_source, source_type: source[:source_type], source_method: source[:source_method])
|
79
|
+
abstractor_abstraction.save!
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# Creates instances of Abstractor::AbstractorSuggestion and Abstractor::AbstractorSuggestionSource
|
85
|
+
# based on natural languange processing (nlp).
|
86
|
+
#
|
87
|
+
# The Abstractor::AbstractorSubject#abstractor_rule_type attribute determines the nlp strategy to employ:
|
34
88
|
#
|
35
89
|
# * 'name/value': attempts to search for non-negated sentences mentioning of an Abstractor::AbstractorAbstractionSchema#predicate and an Abstractor::AbstractorObjectValue
|
36
90
|
# * 'value': attempts to search for non-negated sentences mentioning an Abstractor::AbstractorObjectValue
|
37
91
|
# * 'unknown': will automatically create an 'unknown' Abstractor::AbstractorSuggestion
|
38
|
-
# * 'custom': will create instances of Abstractor::AbstractorSuggestion based on custom logic delegated to the method on the about parameter configured in AbstractorAbstractionSource#custom_method
|
39
92
|
#
|
40
|
-
# @param [ActiveRecord::Base] about
|
93
|
+
# @param [ActiveRecord::Base] about The entity to abstract. An instance of the class specified in the Abstractor::AbstractorSubject#subject_type attribute.
|
94
|
+
# @param [Abstractor::AbstractorAbstraction] abstractor_abstraction The instance of Abstractor::AbstractorAbstraction to make suggestions against.
|
95
|
+
# @param [Abstractor::AbstractorAbstractionSource] abstractor_abstraction_source The instance of the Abstractor::AbstractorAbstractionSource that provides the rule type and from method to make nlp suggestions.
|
41
96
|
# @return [void]
|
42
|
-
|
43
|
-
|
44
|
-
case abstractor_rule_type.name
|
97
|
+
|
98
|
+
def abstract_nlp_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
99
|
+
case abstractor_abstraction_source.abstractor_rule_type.name
|
45
100
|
when 'name/value'
|
46
|
-
abstract_name_value(about, abstractor_abstraction)
|
101
|
+
abstract_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
47
102
|
when 'value'
|
48
|
-
abstract_value(about, abstractor_abstraction)
|
103
|
+
abstract_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
49
104
|
when 'unknown'
|
50
|
-
abstract_unknown(about, abstractor_abstraction)
|
51
|
-
when 'custom'
|
52
|
-
abstract_custom(about, abstractor_abstraction)
|
105
|
+
abstract_unknown(about, abstractor_abstraction, abstractor_abstraction_source)
|
53
106
|
end
|
54
107
|
end
|
55
108
|
|
56
|
-
#
|
57
|
-
#
|
58
|
-
# the
|
59
|
-
#
|
60
|
-
#
|
109
|
+
# Creates instances of Abstractor::AbstractorSuggestion and Abstractor::AbstractorSuggestionSource
|
110
|
+
# based on calling the method configured by the AbstractorAbstractionSource#custom_method attribute.
|
111
|
+
# The method is called on the abstractable entity passed via the about parameter.
|
112
|
+
#
|
113
|
+
# Setting up an Abstractor::AbstractorSubject with an AbstractorAbstractionSource
|
114
|
+
# with an AbstractorAbstractionSource#abstractor_abstraction_source_type attribute
|
115
|
+
# set to 'custom suggestion' obligates the developer to implement an instance
|
61
116
|
# method on the abstractable entitty to make suggestions as
|
62
|
-
# appropriate. The 'custom'
|
63
|
-
#
|
117
|
+
# appropriate. The 'custom suggestion' source type is
|
118
|
+
# intended to faciliate the generation of suggestions in a customizable way.
|
64
119
|
#
|
65
|
-
# @param [ActiveRecord::Base] about
|
66
|
-
# @param [Abstractor::AbstractorAbstraction] abstractor_abstraction
|
120
|
+
# @param [ActiveRecord::Base] about The entity to abstract. An instance of the class specified in the Abstractor::AbstractorSubject#subject_type attribute.
|
121
|
+
# @param [Abstractor::AbstractorAbstraction] abstractor_abstraction The instance of Abstractor::AbstractorAbstraction to make suggestions against.
|
122
|
+
# @param [Abstractor::AbstractorAbstractionSource] abstractor_abstraction_source The instance of the Abstractor::AbstractorAbstractionSource that provides the custom method to invoke on the abstractable entity to make custom suggestions.
|
67
123
|
# @return [void]
|
68
|
-
def
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
suggest(abstractor_abstraction, abstractor_abstraction_source, nil, nil, about.id, about.class.to_s, abstractor_abstraction_source.from_method, suggested_value, nil, nil, abstractor_abstraction_source.custom_method)
|
73
|
-
end
|
74
|
-
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
124
|
+
def abstract_custom_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
125
|
+
suggested_values = about.send(abstractor_abstraction_source.custom_method)
|
126
|
+
suggested_values.each do |suggested_value|
|
127
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, nil, nil, about.id, about.class.to_s, abstractor_abstraction_source.from_method, suggested_value, nil, nil, abstractor_abstraction_source.custom_method)
|
75
128
|
end
|
129
|
+
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
76
130
|
end
|
77
131
|
|
78
|
-
def abstract_unknown(about, abstractor_abstraction)
|
79
|
-
|
80
|
-
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
81
|
-
end
|
132
|
+
def abstract_unknown(about, abstractor_abstraction, abstractor_abstraction_source)
|
133
|
+
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
82
134
|
end
|
83
135
|
|
84
|
-
def abstract_value(about, abstractor_abstraction)
|
85
|
-
abstract_sentential_value(about, abstractor_abstraction)
|
86
|
-
|
87
|
-
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
88
|
-
end
|
136
|
+
def abstract_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
137
|
+
abstract_sentential_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
138
|
+
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
89
139
|
end
|
90
140
|
|
91
|
-
def abstract_sentential_value(about, abstractor_abstraction)
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
abstractor_object_value_ids = abstractor_abstraction_schema.abstractor_object_values.map(&:id)
|
96
|
-
|
97
|
-
adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
|
98
|
-
case adapter
|
99
|
-
when 'sqlserver'
|
100
|
-
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_value_variants.value + '%'))", abstractor_object_value_ids, source[:source_id]).all
|
101
|
-
when 'sqlite3'
|
102
|
-
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
|
103
|
-
when 'postgresql'
|
104
|
-
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
|
105
|
-
end
|
141
|
+
def abstract_sentential_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
142
|
+
abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
|
143
|
+
abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
|
144
|
+
abstractor_object_value_ids = abstractor_abstraction_schema.abstractor_object_values.map(&:id)
|
106
145
|
|
107
|
-
|
146
|
+
adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
|
147
|
+
case adapter
|
148
|
+
when 'sqlserver'
|
149
|
+
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_value_variants.value + '%'))", abstractor_object_value_ids, source[:source_id]).all
|
150
|
+
when 'sqlite3'
|
151
|
+
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
|
152
|
+
when 'postgresql'
|
153
|
+
abstractor_object_value_variants = Abstractor::AbstractorObjectValueVariant.where("abstractor_object_value_id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_value_variants.value || '%'))", abstractor_object_value_ids, source[:source_id]).all
|
154
|
+
end
|
108
155
|
|
109
|
-
|
110
|
-
case adapter
|
111
|
-
when 'sqlserver'
|
112
|
-
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_values.value + '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
113
|
-
when 'sqlite3'
|
114
|
-
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
115
|
-
when 'postgresql'
|
116
|
-
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
117
|
-
end
|
156
|
+
abstractor_object_values = abstractor_object_value_variants.map(&:abstractor_object_value).uniq
|
118
157
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
158
|
+
adapter = ActiveRecord::Base.connection.instance_values["config"][:adapter]
|
159
|
+
case adapter
|
160
|
+
when 'sqlserver'
|
161
|
+
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' + abstractor_object_values.value + '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
162
|
+
when 'sqlite3'
|
163
|
+
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} LIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
164
|
+
when 'postgresql'
|
165
|
+
abstractor_object_values.concat(Abstractor::AbstractorObjectValue.where("abstractor_object_values.id in (?) AND EXISTS (SELECT 1 FROM #{source[:source_type].table_name} WHERE #{source[:source_type].table_name}.id = ? AND #{source[:source_type].table_name}.#{source[:source_method]} ILIKE ('%' || abstractor_object_values.value || '%'))", abstractor_object_value_ids, source[:source_id]).all).uniq
|
166
|
+
end
|
167
|
+
|
168
|
+
parser = Abstractor::Parser.new(abstractor_text)
|
169
|
+
abstractor_object_values.each do |abstractor_object_value|
|
170
|
+
object_variants(abstractor_object_value, abstractor_object_value_variants).each do |object_variant|
|
171
|
+
ranges = parser.range_all(Regexp.escape(object_variant.downcase))
|
172
|
+
if ranges.any?
|
173
|
+
ranges.each do |range|
|
174
|
+
sentence = parser.find_sentence(range)
|
175
|
+
if sentence
|
176
|
+
scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
|
177
|
+
reject = (
|
178
|
+
Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
|
179
|
+
Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
|
180
|
+
)
|
181
|
+
if !reject
|
182
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, object_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
|
135
183
|
end
|
136
184
|
end
|
137
185
|
end
|
@@ -141,34 +189,30 @@ module Abstractor
|
|
141
189
|
end
|
142
190
|
end
|
143
191
|
|
144
|
-
def abstract_name_value(about, abstractor_abstraction)
|
145
|
-
abstract_canonical_name_value(about, abstractor_abstraction)
|
146
|
-
abstract_sentential_name_value(about, abstractor_abstraction)
|
147
|
-
create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
|
148
|
-
|
149
|
-
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
150
|
-
end
|
192
|
+
def abstract_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
193
|
+
abstract_canonical_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
194
|
+
abstract_sentential_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
195
|
+
create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction, abstractor_abstraction_source)
|
196
|
+
create_unknown_abstractor_suggestion(about, abstractor_abstraction, abstractor_abstraction_source)
|
151
197
|
end
|
152
198
|
|
153
|
-
def abstract_canonical_name_value(about, abstractor_abstraction)
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
abstractor_abstraction_schema.
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
end
|
199
|
+
def abstract_canonical_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
200
|
+
abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
|
201
|
+
abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
|
202
|
+
parser = Abstractor::Parser.new(abstractor_text)
|
203
|
+
abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
|
204
|
+
abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
|
205
|
+
abstractor_object_value.object_variants.each do |object_variant|
|
206
|
+
match_value = "#{Regexp.escape(predicate_variant)}:\s*#{Regexp.escape(object_variant)}"
|
207
|
+
matches = parser.scan(match_value, word_boundary: true).uniq
|
208
|
+
matches.each do |match|
|
209
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
|
210
|
+
end
|
166
211
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
end
|
212
|
+
match_value = "#{Regexp.escape(predicate_variant)}#{Regexp.escape(object_variant)}"
|
213
|
+
matches = parser.scan(match_value, word_boundary: true).uniq
|
214
|
+
matches.each do |match|
|
215
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, match, match, source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
|
172
216
|
end
|
173
217
|
end
|
174
218
|
end
|
@@ -176,31 +220,29 @@ module Abstractor
|
|
176
220
|
end
|
177
221
|
end
|
178
222
|
|
179
|
-
def abstract_sentential_name_value(about, abstractor_abstraction)
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
suggest(abstractor_abstraction, abstractor_abstraction_source, sentence[:sentence], sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
|
203
|
-
end
|
223
|
+
def abstract_sentential_name_value(about, abstractor_abstraction, abstractor_abstraction_source)
|
224
|
+
abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
|
225
|
+
abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
|
226
|
+
parser = Abstractor::Parser.new(abstractor_text)
|
227
|
+
abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
|
228
|
+
ranges = parser.range_all(Regexp.escape(predicate_variant))
|
229
|
+
if ranges.any?
|
230
|
+
ranges.each do |range|
|
231
|
+
sentence = parser.find_sentence(range)
|
232
|
+
if sentence
|
233
|
+
abstractor_abstraction_schema.abstractor_object_values.each do |abstractor_object_value|
|
234
|
+
abstractor_object_value.object_variants.each do |object_variant|
|
235
|
+
match = parser.match_sentence(sentence[:sentence], Regexp.escape(object_variant))
|
236
|
+
if match
|
237
|
+
scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
|
238
|
+
reject = (
|
239
|
+
Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
|
240
|
+
Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant) ||
|
241
|
+
Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], object_variant) ||
|
242
|
+
Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], object_variant)
|
243
|
+
)
|
244
|
+
if !reject
|
245
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, sentence[:sentence], sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], abstractor_object_value, nil, nil, nil)
|
204
246
|
end
|
205
247
|
end
|
206
248
|
end
|
@@ -253,27 +295,25 @@ module Abstractor
|
|
253
295
|
suggested_value.instance_of?(Abstractor::AbstractorObjectValue)
|
254
296
|
end
|
255
297
|
|
256
|
-
def create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction)
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
suggest(abstractor_abstraction, abstractor_abstraction_source, predicate_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil, nil)
|
276
|
-
end
|
298
|
+
def create_unknown_abstractor_suggestion_name_only(about, abstractor_abstraction, abstractor_abstraction_source)
|
299
|
+
abstractor_abstraction_source.normalize_from_method_to_sources(about).each do |source|
|
300
|
+
abstractor_text = source[:source_type].find(source[:source_id]).send(source[:source_method])
|
301
|
+
parser = Abstractor::Parser.new(abstractor_text)
|
302
|
+
#Create an 'unknown' suggestion based on match name only if we have not made a suggstion
|
303
|
+
if abstractor_abstraction.abstractor_suggestions(true).empty?
|
304
|
+
abstractor_abstraction_schema.predicate_variants.each do |predicate_variant|
|
305
|
+
ranges = parser.range_all(Regexp.escape(predicate_variant))
|
306
|
+
if ranges
|
307
|
+
ranges.each do |range|
|
308
|
+
sentence = parser.find_sentence(range)
|
309
|
+
if sentence
|
310
|
+
scoped_sentence = Abstractor::NegationDetection.parse_negation_scope(sentence[:sentence])
|
311
|
+
reject = (
|
312
|
+
Abstractor::NegationDetection.negated_match_value?(scoped_sentence[:scoped_sentence], predicate_variant) ||
|
313
|
+
Abstractor::NegationDetection.manual_negated_match_value?(sentence[:sentence], predicate_variant)
|
314
|
+
)
|
315
|
+
if !reject
|
316
|
+
suggest(abstractor_abstraction, abstractor_abstraction_source, predicate_variant.downcase, sentence[:sentence], source[:source_id], source[:source_type].to_s, source[:source_method], nil, true, nil, nil)
|
277
317
|
end
|
278
318
|
end
|
279
319
|
end
|
data/lib/abstractor/setup.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Abstractor
|
2
2
|
module Setup
|
3
3
|
def self.system
|
4
|
-
puts 'Setting up AbstractorObjectType'
|
4
|
+
puts 'Setting up Abstractor::AbstractorObjectType'
|
5
5
|
Abstractor::AbstractorObjectType.find_or_create_by_value('list')
|
6
6
|
Abstractor::AbstractorObjectType.find_or_create_by_value('number')
|
7
7
|
Abstractor::AbstractorObjectType.find_or_create_by_value('boolean')
|
@@ -10,21 +10,24 @@ module Abstractor
|
|
10
10
|
Abstractor::AbstractorObjectType.find_or_create_by_value('date')
|
11
11
|
Abstractor::AbstractorObjectType.find_or_create_by_value('dynamic list')
|
12
12
|
|
13
|
-
puts 'Setting up AbstractorRuleType'
|
13
|
+
puts 'Setting up Abstractor::AbstractorRuleType'
|
14
14
|
Abstractor::AbstractorRuleType.find_or_create_by_name_and_description(name: 'name/value', description:'search for value associated with name')
|
15
|
-
Abstractor::AbstractorRuleType.find_or_create_by_name_and_description(name:'name', description: 'search for name match')
|
16
15
|
Abstractor::AbstractorRuleType.find_or_create_by_name_and_description(name:'value', description: 'search for value match')
|
17
16
|
Abstractor::AbstractorRuleType.find_or_create_by_name_and_description(name: 'unknown', description: 'do not try to abstract, always assign "unknown"')
|
18
|
-
Abstractor::AbstractorRuleType.find_or_create_by_name_and_description(name:'custom', description: 'use whatever from_method returns as a value')
|
19
17
|
|
20
|
-
puts 'Setting up AbstractorSuggestionStatus'
|
18
|
+
puts 'Setting up Abstractor::AbstractorSuggestionStatus'
|
21
19
|
Abstractor::AbstractorSuggestionStatus.find_or_create_by_name('Needs review')
|
22
20
|
Abstractor::AbstractorSuggestionStatus.find_or_create_by_name('Accepted')
|
23
21
|
Abstractor::AbstractorSuggestionStatus.find_or_create_by_name('Rejected')
|
24
22
|
|
25
|
-
puts 'Setting up AbstractorRelationType'
|
23
|
+
puts 'Setting up Abstractor::AbstractorRelationType'
|
26
24
|
Abstractor::AbstractorRelationType.find_or_create_by_name('member_of')
|
27
25
|
Abstractor::AbstractorRelationType.find_or_create_by_name('preceded_by')
|
26
|
+
|
27
|
+
puts 'Setting up Abstractor::AbstractorAbstractionSourceType'
|
28
|
+
Abstractor::AbstractorAbstractionSourceType.find_or_create_by_name('nlp suggestion')
|
29
|
+
Abstractor::AbstractorAbstractionSourceType.find_or_create_by_name('custom suggestion')
|
30
|
+
Abstractor::AbstractorAbstractionSourceType.find_or_create_by_name('indirect')
|
28
31
|
end
|
29
32
|
end
|
30
33
|
end
|
data/lib/abstractor/version.rb
CHANGED
@@ -63,13 +63,13 @@ module Abstractor
|
|
63
63
|
insert_into_file("#{Rails.root}/config/environments/development.rb", :after => /::Application.configure do\n/) do
|
64
64
|
' StanfordCoreNLP.use :english
|
65
65
|
StanfordCoreNLP.model_files = {}
|
66
|
-
StanfordCoreNLP.jar_path = "#{Rails.root}/lib/stanford-corenlp-full-2014-
|
67
|
-
StanfordCoreNLP.model_path = "#{Rails.root}/lib/stanford-corenlp-full-2014-
|
66
|
+
StanfordCoreNLP.jar_path = "#{Rails.root}/lib/stanford-corenlp-full-2014-06-16/"
|
67
|
+
StanfordCoreNLP.model_path = "#{Rails.root}/lib/stanford-corenlp-full-2014-06-16/"
|
68
68
|
StanfordCoreNLP.default_jars = [
|
69
69
|
"joda-time.jar",
|
70
70
|
"xom.jar",
|
71
|
-
"stanford-corenlp-3.
|
72
|
-
"stanford-corenlp-3.
|
71
|
+
"stanford-corenlp-3.4.jar",
|
72
|
+
"stanford-corenlp-3.4-models.jar",
|
73
73
|
"jollyday.jar",
|
74
74
|
"bridge.jar"
|
75
75
|
]
|
@@ -8,20 +8,20 @@ namespace :abstractor do
|
|
8
8
|
Abstractor::Setup.system
|
9
9
|
end
|
10
10
|
|
11
|
-
desc "Setup Stanford CoreNLP library in lib/stanford-corenlp-full-2014-
|
11
|
+
desc "Setup Stanford CoreNLP library in lib/stanford-corenlp-full-2014-06-16/ directory"
|
12
12
|
task :stanford_core_nlp => :environment do
|
13
13
|
puts 'Please be patient...This could take a while.'
|
14
|
-
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-
|
14
|
+
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-06-16.zip"
|
15
15
|
open(file, 'wb') do |fo|
|
16
|
-
fo.print open('http://nlp.stanford.edu/software/stanford-corenlp-full-2014-
|
16
|
+
fo.print open('http://nlp.stanford.edu/software/stanford-corenlp-full-2014-06-16.zip').read
|
17
17
|
end
|
18
18
|
|
19
|
-
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-
|
19
|
+
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-06-16.zip"
|
20
20
|
destination = "#{Rails.root}/lib/"
|
21
21
|
puts 'Unzipping...'
|
22
22
|
unzip_file(file, destination)
|
23
23
|
|
24
|
-
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-
|
24
|
+
file = "#{Rails.root}/lib/stanford-corenlp-full-2014-06-16/bridge.jar"
|
25
25
|
open(file, 'wb') do |fo|
|
26
26
|
fo.print open('https://github.com/louismullie/stanford-core-nlp/blob/master/bin/bridge.jar?raw=true').read
|
27
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abstractor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Gurley, Yulia Bushmanova
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -438,6 +438,8 @@ files:
|
|
438
438
|
- app/models/abstractor/abstractor_abstraction_schema_predicate_variant.rb
|
439
439
|
- app/models/abstractor/abstractor_abstraction_schema_relation.rb
|
440
440
|
- app/models/abstractor/abstractor_abstraction_source.rb
|
441
|
+
- app/models/abstractor/abstractor_abstraction_source_type.rb
|
442
|
+
- app/models/abstractor/abstractor_indirect_source.rb
|
441
443
|
- app/models/abstractor/abstractor_object_type.rb
|
442
444
|
- app/models/abstractor/abstractor_object_value.rb
|
443
445
|
- app/models/abstractor/abstractor_object_value_variant.rb
|
@@ -484,6 +486,7 @@ files:
|
|
484
486
|
- db/migrate/20140618140759_add_custom_method_to_abstractor_abstraction_sources.rb
|
485
487
|
- db/migrate/20140618140828_add_custom_method_to_abstractor_suggestion_sources.rb
|
486
488
|
- db/migrate/20140716184049_add_dynamic_list_method_to_abstractor_subjects.rb
|
489
|
+
- db/migrate/20140718014952_refactor_abstractor_rule_types.rb
|
487
490
|
- db/seeds.rb
|
488
491
|
- lib/abstractor.rb
|
489
492
|
- lib/abstractor/abstractable.rb
|
@@ -501,6 +504,8 @@ files:
|
|
501
504
|
- lib/abstractor/methods/models/abstractor_abstraction_schema_predicate_variant.rb
|
502
505
|
- lib/abstractor/methods/models/abstractor_abstraction_schema_relation.rb
|
503
506
|
- lib/abstractor/methods/models/abstractor_abstraction_source.rb
|
507
|
+
- lib/abstractor/methods/models/abstractor_abstraction_source_type.rb
|
508
|
+
- lib/abstractor/methods/models/abstractor_indirect_source.rb
|
504
509
|
- lib/abstractor/methods/models/abstractor_object_type.rb
|
505
510
|
- lib/abstractor/methods/models/abstractor_object_value.rb
|
506
511
|
- lib/abstractor/methods/models/abstractor_object_value_variant.rb
|