opener-opinion-detector-basic 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3345970ea78e554cf48e14b5293043bc5548d4b3
4
- data.tar.gz: 4a1628365168b79760beb9c01d052b81b13c4bc2
3
+ metadata.gz: fa83717460841775dcf28e9f640208bd16e2cc5d
4
+ data.tar.gz: 8c8f56b11a38b57c07945bffd666b646ef041f80
5
5
  SHA512:
6
- metadata.gz: b946c3cce88a034b2ed5952377004f2b5e2122f0d54c9996aa8d71bb6840d752f2e67ce0a059a346c5efcab3072c799a1c09fdc0608b77329fa61df2b3dd1615
7
- data.tar.gz: 8dc95b702adee1279a10820f746c99ecd0225308420c48c01ef954bea001650819e05d614bdb20bf4b10b8a13c6f25a839ddca6167e3eae05270eb5e3917476f
6
+ metadata.gz: 957e43027ccae0ab98becec3641eb82c10a9531d74f278d3557e3f1f8aa19e8ec59260bebd31a105e5e283e55bc2a04d67b70f9a582c00b93b771210e491fbe8
7
+ data.tar.gz: 02a6df21160370204fb1a72084d36663f974ff816a615028567e701370bd0a6cfabe96b16f7281f0576d7f656bbd21de010f129a05d1f2d3126e71ed4b1706ff
@@ -4,6 +4,44 @@ require 'opener/daemons'
4
4
 
5
5
  require_relative '../lib/opener/opinion_detector_basic'
6
6
 
7
+ Oga::XML::Parser.class_eval do
8
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
9
+ include NewRelic::Agent::MethodTracer
10
+
11
+ add_method_tracer(:parse)
12
+ end
13
+
14
+ Oga::XPath::Parser.class_eval do
15
+ class << self
16
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
17
+ include NewRelic::Agent::MethodTracer
18
+
19
+ add_method_tracer(:parse_with_cache, 'Oga::XPath::Parser/parse_with_cache')
20
+ end
21
+ end
22
+
23
+ Oga::XPath::Evaluator.class_eval do
24
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
25
+ include NewRelic::Agent::MethodTracer
26
+
27
+ add_method_tracer(:evaluate)
28
+ add_method_tracer(:evaluate_ast)
29
+ end
30
+
31
+ Opener::OpinionDetectorBasic::Processor.class_eval do
32
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
33
+ include NewRelic::Agent::MethodTracer
34
+
35
+ add_method_tracer(:process)
36
+ add_method_tracer(:terms)
37
+ add_method_tracer(:opinions)
38
+ add_method_tracer(:add_opinion_element)
39
+ add_method_tracer(:pretty_print)
40
+ add_method_tracer(:set_accumulated_strength)
41
+ add_method_tracer(:apply_modifiers)
42
+ add_method_tracer(:apply_conjunctions)
43
+ end
44
+
7
45
  daemon = Opener::Daemons::Daemon.new(Opener::OpinionDetectorBasic)
8
46
 
9
47
  daemon.start
@@ -1,6 +1,7 @@
1
+ gem 'slop', '~> 3.0'
2
+
1
3
  require 'slop'
2
4
  require 'oga'
3
- require 'monitor'
4
5
 
5
6
  require 'rexml/document'
6
7
  require 'rexml/formatters/pretty'
@@ -32,7 +33,7 @@ module Opener
32
33
  @args = options.delete(:args) || []
33
34
  @options = options
34
35
  end
35
-
36
+
36
37
  ##
37
38
  # Processes the input KAF document.
38
39
  #
@@ -40,8 +41,6 @@ module Opener
40
41
  # @return [String]
41
42
  #
42
43
  def run(input)
43
- options[:timestamp] = !options.delete(:no_time)
44
-
45
44
  return Processor.new(input, options).process
46
45
  end
47
46
  end # OpinionDetectorBasic
@@ -45,10 +45,17 @@ Example:
45
45
  abort "opinion-detector-basic v#{VERSION} on #{RUBY_DESCRIPTION}"
46
46
  end
47
47
 
48
+ on :p, :pretty, 'Enables pretty-printing of XML',
49
+ :default => false
50
+
51
+ on :'no-timestamp', 'Disables timestamps in XML output'
52
+
48
53
  run do |opts, args|
49
54
  detector = OpinionDetectorBasic.new(
50
- :args => args,
51
- :domain => opts[:domain]
55
+ :args => args,
56
+ :domain => opts[:domain],
57
+ :pretty => opts[:pretty],
58
+ :timestamp => !opts[:'no-timestamp']
52
59
  )
53
60
 
54
61
  input = STDIN.tty? ? nil : STDIN.read
@@ -3,7 +3,22 @@ module Opener
3
3
  class Opinion
4
4
  attr_reader :term
5
5
  attr_accessor :left_candidates, :right_candidates, :target_ids, :holders
6
-
6
+
7
+ # Opinion holders for each language code.
8
+ OPINION_HOLDERS = {
9
+ 'nl' => [
10
+ 'ik','we','wij','ze','zij','jullie','u','hij','het','jij','je','mij',
11
+ 'me','hem','haar','ons','hen','hun'
12
+ ],
13
+ 'en' => ['i','we','he','she','they','it','you'],
14
+ 'es' => [
15
+ 'yo','tu','nosotros','vosotros','ellos','ellas','nosotras','vosotras'
16
+ ],
17
+ 'it' => ['io','tu','noi','voi','loro','lei','lui'],
18
+ 'de' => ['ich','du','wir','ihr','sie','er'],
19
+ 'fr' => ['je','tu','lui','elle','nous','vous','ils','elles']
20
+ }
21
+
7
22
  def initialize(term)
8
23
  @term = term
9
24
  @left_candidates = []
@@ -11,7 +26,7 @@ module Opener
11
26
  @holders = []
12
27
  @target_ids = []
13
28
  end
14
-
29
+
15
30
  ##
16
31
  # Returns the term ids of the opinion expression.
17
32
  #
@@ -20,7 +35,7 @@ module Opener
20
35
  def ids
21
36
  @ids ||= term.list_ids.sort
22
37
  end
23
-
38
+
24
39
  ##
25
40
  # Returns the sentence id of the opinion.
26
41
  #
@@ -29,7 +44,7 @@ module Opener
29
44
  def sentence
30
45
  @sentence ||= term.sentence
31
46
  end
32
-
47
+
33
48
  ##
34
49
  # Returns the strength of the opinion.
35
50
  #
@@ -38,7 +53,7 @@ module Opener
38
53
  def strength
39
54
  @strength ||= term.accumulated_strength
40
55
  end
41
-
56
+
42
57
  ##
43
58
  # Returns the polarity of the opinion.
44
59
  #
@@ -53,7 +68,7 @@ module Opener
53
68
  "neutral"
54
69
  end
55
70
  end
56
-
71
+
57
72
  ##
58
73
  # Obtain the opinion holders from the terms that belong to the same
59
74
  # sentence.
@@ -61,13 +76,13 @@ module Opener
61
76
  def obtain_holders(sentences, language)
62
77
  sentence_terms = sentences[sentence]
63
78
  sentence_terms.each do |term|
64
- if opinion_holders[language].include?(term.lemma)
79
+ if OPINION_HOLDERS[language].include?(term.lemma)
65
80
  @holders << term.id
66
81
  break
67
82
  end
68
83
  end
69
84
  end
70
-
85
+
71
86
  ##
72
87
  # Get the potential right and left candidates of the sentence and
73
88
  # decide which ones are the actual targets of the opinion
@@ -76,20 +91,20 @@ module Opener
76
91
  sentence_terms = sentences[sentence]
77
92
  max_distance = 3
78
93
  terms_count = sentence_terms.count
79
-
94
+
80
95
  index = -1
81
96
  sentence_terms.each_with_index do |term, i|
82
97
  if ids.include?(term.id)
83
98
  index = i
84
99
  end
85
100
  end
86
-
101
+
87
102
  unless index+1 >= terms_count
88
103
  min = index+1
89
104
  max = [index+1+max_distance,terms_count].min
90
105
  @right_candidates = filter_candidates(sentence_terms[min..max])
91
106
  end
92
-
107
+
93
108
  index = 0
94
109
  sentence_terms.each_with_index do |term, i|
95
110
  if ids.include?(term.id)
@@ -97,7 +112,7 @@ module Opener
97
112
  break # needed for left_candidates
98
113
  end
99
114
  end
100
-
115
+
101
116
  unless index == 0
102
117
  min = [0, index-1-max_distance].max
103
118
  max = index
@@ -108,7 +123,7 @@ module Opener
108
123
  candidate = right_candidates.first
109
124
  @target_ids << candidate.id
110
125
  end
111
-
126
+
112
127
  if target_ids.empty?
113
128
  list = mix_lists(right_candidates, left_candidates)
114
129
  list.each do |l|
@@ -117,9 +132,9 @@ module Opener
117
132
  end
118
133
  end
119
134
  end
120
-
135
+
121
136
  protected
122
-
137
+
123
138
  ##
124
139
  # If there are no opinion targets, right and left candidates
125
140
  # are mixed into one list and the first one is picked as the target.
@@ -140,7 +155,7 @@ module Opener
140
155
  end
141
156
  return list.compact
142
157
  end
143
-
158
+
144
159
  ##
145
160
  # Filters candidate terms depending on their part of speech and if
146
161
  # they are already part of the expression.
@@ -150,22 +165,6 @@ module Opener
150
165
  def filter_candidates(sentence_terms)
151
166
  sentence_terms.select{|t| (t.pos == "N" || t.pos == "R") && !ids.include?(t.id)}
152
167
  end
153
-
154
- ##
155
- # Opinion holders for each language code.
156
- #
157
- # @return [Hash]
158
- #
159
- def opinion_holders
160
- {
161
- 'nl' => ['ik','we','wij','ze','zij','jullie','u','hij','het','jij','je','mij','me','hem','haar','ons','hen','hun'],
162
- 'en' => ['i','we','he','she','they','it','you'],
163
- 'es' => ['yo','tu','nosotros','vosotros','ellos','ellas','nosotras','vosotras'],
164
- 'it' => ['io','tu','noi','voi','loro','lei','lui'],
165
- 'de' => ['ich','du','wir','ihr','sie','er'],
166
- 'fr' => ['je','tu','lui','elle','nous','vous','ils','elles']
167
- }
168
- end
169
168
  end # Opinion
170
169
  end # OpinionDetectorBasic
171
- end # Opener
170
+ end # Opener
@@ -17,11 +17,11 @@ module Opener
17
17
  # by default due to the performance overhead.
18
18
  #
19
19
  def initialize(file, options = {})
20
- @document = Oga.parse_xml(file)
20
+ @document = Oga.parse_xml(file)
21
21
 
22
- @timestamp = !!options[:timestamp]
23
- @opinion_strength = !!options[:opinion_strength]
24
- @pretty = options[:pretty] || false
22
+ @timestamp = options[:timestamp]
23
+ @opinion_strength = options[:opinion_strength]
24
+ @pretty = options[:pretty] || false
25
25
 
26
26
  raise 'Error parsing input. Input is required to be KAF' unless is_kaf?
27
27
  end
@@ -30,18 +30,18 @@ module Opener
30
30
  # Processes the input and returns the new KAF output.
31
31
  # @return [String]
32
32
  #
33
- def process
33
+ def process
34
34
  add_opinions_layer
35
-
35
+
36
36
  index = 1
37
- opinions.each do |opinion|
37
+ opinions.each do |opinion|
38
38
  add_opinion(opinion, index)
39
39
  index += 1
40
40
  end
41
41
 
42
42
  add_linguistic_processor
43
43
 
44
- return pretty ? pretty_print(document) : document.to_xml
44
+ pretty ? pretty_print(document) : document.to_xml
45
45
  end
46
46
 
47
47
  ##
@@ -50,25 +50,19 @@ module Opener
50
50
  # @return [String]
51
51
  #
52
52
  def language
53
- return @language ||= document.at_xpath('KAF').get('xml:lang')
53
+ @language ||= document.at_xpath('KAF').get('xml:lang')
54
54
  end
55
-
55
+
56
56
  ##
57
57
  # Get the terms from the input file
58
58
  # @return [Hash]
59
59
  #
60
60
  def terms
61
- unless @terms
62
- @terms = []
63
-
64
- document.xpath('KAF/terms/term').each do |term|
65
- @terms << Term.new(term, document, language)
66
- end
61
+ @terms ||= document.xpath('KAF/terms/term').map do |term|
62
+ Term.new(term, document, language)
67
63
  end
68
-
69
- return @terms
70
64
  end
71
-
65
+
72
66
  ##
73
67
  # Get the opinions.
74
68
  #
@@ -79,7 +73,7 @@ module Opener
79
73
  set_accumulated_strength
80
74
  apply_modifiers
81
75
  apply_conjunctions
82
-
76
+
83
77
  ##
84
78
  # Initialize opinions with their expressions.
85
79
  #
@@ -88,14 +82,14 @@ module Opener
88
82
  o = Opinion.new(term)
89
83
  end
90
84
  end.compact
91
-
85
+
92
86
  ##
93
87
  # Obtain targets for each opinion.
94
88
  #
95
89
  @opinions.each do |opinion|
96
90
  opinion.obtain_targets(sentences)
97
91
  end
98
-
92
+
99
93
  ##
100
94
  # Obtain holders for each opinion.
101
95
  #
@@ -103,10 +97,10 @@ module Opener
103
97
  opinion.obtain_holders(sentences, language)
104
98
  end
105
99
  end
106
-
107
- return @opinions
100
+
101
+ @opinions
108
102
  end
109
-
103
+
110
104
  ##
111
105
  # Remove the opinions layer from the KAF file if it exists and add a new
112
106
  # one.
@@ -117,30 +111,32 @@ module Opener
117
111
 
118
112
  new_node('opinions', 'KAF')
119
113
  end
120
-
114
+
121
115
  ##
122
116
  # Adds the entire opinion in the KAF file.
123
117
  #
124
118
  def add_opinion(opinion, index)
125
119
  opinion_node = new_node("opinion", "KAF/opinions")
126
120
  opinion_node.set('oid', "o#{index.to_s}")
127
-
121
+
128
122
  unless opinion.holders.empty?
129
123
  opinion_holder_node = new_node("opinion_holder", opinion_node)
130
124
  add_opinion_element(opinion_holder_node, opinion.holders)
131
125
  end
132
-
126
+
133
127
  opinion_target_node = new_node("opinion_target", opinion_node)
128
+
134
129
  unless opinion.target_ids.empty?
135
130
  add_opinion_element(opinion_target_node, opinion.target_ids)
136
131
  end
137
-
132
+
138
133
  expression_node = new_node("opinion_expression", opinion_node)
139
134
  expression_node.set('polarity', opinion.polarity)
140
135
  expression_node.set('strength', opinion.strength.to_s)
136
+
141
137
  add_opinion_element(expression_node, opinion.ids)
142
138
  end
143
-
139
+
144
140
  ##
145
141
  # Method for adding opinion holders, targets and expressions.
146
142
  #
@@ -149,12 +145,13 @@ module Opener
149
145
  comment = Oga::XML::Comment.new(:text => "#{lemmas}")
150
146
  node.children << comment
151
147
  span_node = new_node("span", node)
148
+
152
149
  ids.each do |id|
153
150
  target_node = new_node("target", span_node)
154
151
  target_node.set('id', id.to_s)
155
152
  end
156
153
  end
157
-
154
+
158
155
  ##
159
156
  # Add linguistic processor layer with basic information
160
157
  # (version, timestamp, description etc) in the KAF file.
@@ -171,7 +168,7 @@ module Opener
171
168
 
172
169
  lp_node.set('version', "#{last_edited}-#{version}")
173
170
  lp_node.set('name', description)
174
-
171
+
175
172
  if timestamp
176
173
  format = '%Y-%m-%dT%H:%M:%S%Z'
177
174
 
@@ -180,7 +177,7 @@ module Opener
180
177
  lp_node.set('timestamp', '*')
181
178
  end
182
179
  end
183
-
180
+
184
181
  ##
185
182
  # Format the output document properly.
186
183
  #
@@ -196,18 +193,18 @@ module Opener
196
193
  formatter.compact = true
197
194
  formatter.write(doc, out)
198
195
 
199
- return out.strip
196
+ out.strip
200
197
  end
201
-
198
+
202
199
  ##
203
200
  # Get terms grouped by sentence.
204
201
  #
205
202
  def sentences
206
203
  @sentences ||= terms.group_by{|t| t.sentence}
207
204
  end
208
-
205
+
209
206
  protected
210
-
207
+
211
208
  ##
212
209
  # The strength of a term depends heavily on the type of the previous
213
210
  # one. For example if the previous one is a shifter, it needs
@@ -228,7 +225,7 @@ module Opener
228
225
  symbol = terms[i+1].accumulated_strength > 0 ? :+ : :-
229
226
  else
230
227
  symbol = :*
231
- end
228
+ end
232
229
  elsif terms[i+1].is_intensifier?
233
230
  terms[i+1].accumulated_strength = term.accumulated_strength.send(symbol, terms[i+1].accumulated_strength)
234
231
  term.use = false
@@ -242,7 +239,7 @@ module Opener
242
239
  end
243
240
  end
244
241
  end
245
-
242
+
246
243
  ##
247
244
  # Apply strength to the next term after a shifter or intensifier.
248
245
  #
@@ -258,7 +255,7 @@ module Opener
258
255
  end
259
256
  end
260
257
  end
261
-
258
+
262
259
  ##
263
260
  # Ignore conjunctions when applying strength.
264
261
  #
@@ -276,7 +273,7 @@ module Opener
276
273
  if j >= terms_count
277
274
  break
278
275
  end
279
-
276
+
280
277
  if terms[j].is_conjunction
281
278
  terms[j].use = false
282
279
  j += 1
@@ -297,9 +294,9 @@ module Opener
297
294
  i = j
298
295
  end
299
296
  i += 1
300
- end
297
+ end
301
298
  end
302
-
299
+
303
300
  ##
304
301
  # Creates a new node in the KAF file.
305
302
  #
@@ -314,7 +311,7 @@ module Opener
314
311
 
315
312
  parent_node.children << node
316
313
 
317
- return node
314
+ node
318
315
  end
319
316
 
320
317
  ##
@@ -322,7 +319,7 @@ module Opener
322
319
  # @return [Boolean]
323
320
  #
324
321
  def is_kaf?
325
- return !!document.at_xpath('KAF')
322
+ !!document.at_xpath('KAF')
326
323
  end
327
324
  end # Processor
328
325
  end # OpinionDetectorBasic
@@ -3,7 +3,17 @@ module Opener
3
3
  class Term
4
4
  attr_reader :node, :sentence, :is_conjunction
5
5
  attr_accessor :use, :accumulated_strength, :list_ids
6
-
6
+
7
+ # Map of conjunctions per language code
8
+ CONJUNCTIONS = {
9
+ 'nl' => %w{, en},
10
+ 'en' => %w{, and},
11
+ 'es' => %w{, y e},
12
+ 'it' => %w{, e ed},
13
+ 'de' => %w{, und},
14
+ 'fr' => %w{, et}
15
+ }
16
+
7
17
  def initialize(node, document, language)
8
18
  @node = node
9
19
  @sentence = get_sentence(document)
@@ -12,7 +22,7 @@ module Opener
12
22
  @list_ids = [id]
13
23
  @is_conjunction = is_conjunction?(language)
14
24
  end
15
-
25
+
16
26
  ##
17
27
  # Returns the term id.
18
28
  #
@@ -21,16 +31,16 @@ module Opener
21
31
  def id
22
32
  @id ||= node.get('tid')
23
33
  end
24
-
34
+
25
35
  ##
26
36
  # Returns the lemma of the term.
27
- #
37
+ #
28
38
  # @return [String]
29
39
  #
30
40
  def lemma
31
41
  @lemma ||= node.get('lemma')
32
42
  end
33
-
43
+
34
44
  ##
35
45
  # Returns the part of speech of the term.
36
46
  #
@@ -39,38 +49,36 @@ module Opener
39
49
  def pos
40
50
  @pos ||= node.get('pos')
41
51
  end
42
-
52
+
43
53
  ##
44
54
  # Returns the sentiment modifier type if it exists.
45
55
  #
46
56
  # @return [String|NilClass]
47
57
  #
48
58
  def sentiment_modifier
49
- @sentiment_modifier ||= if sentiment = node.xpath('sentiment').first
50
- sentiment.get('sentiment_modifier')
51
- end
59
+ @sentiment_modifier ||=
60
+ first_sentiment ? first_sentiment.get('sentiment_modifier') : nil
52
61
  end
53
-
62
+
54
63
  ##
55
64
  # Returns the polarity of the term if it exists.
56
65
  #
57
66
  # @return [String|NilClass]
58
67
  #
59
68
  def polarity
60
- @polarity ||= if sentiment = node.xpath('sentiment').first
61
- sentiment.get('polarity')
62
- end
69
+ @polarity ||= first_sentiment ? first_sentiment.get('polarity') : nil
63
70
  end
64
-
71
+
65
72
  ##
66
73
  # Returns the actual word ids that construct the lemma.
67
74
  #
68
75
  # @return [Array]
69
76
  #
70
77
  def target_ids
71
- @target_ids ||= node.xpath('span/target').map {|target| target.get('id')}
78
+ @target_ids ||= node.xpath('span/target')
79
+ .map { |target| target.get('id') }
72
80
  end
73
-
81
+
74
82
  ##
75
83
  # Returns the strength of the term depending on its type.
76
84
  #
@@ -82,16 +90,16 @@ module Opener
82
90
  elsif polarity == "negative"
83
91
  return -1
84
92
  end
85
-
93
+
86
94
  if is_intensifier?
87
95
  return 2
88
96
  elsif is_shifter?
89
97
  return -1
90
98
  end
91
-
99
+
92
100
  return 0
93
101
  end
94
-
102
+
95
103
  ##
96
104
  # Returns the sentence id that the term belongs to in the document.
97
105
  #
@@ -103,7 +111,7 @@ module Opener
103
111
  .first
104
112
  .get('sent')
105
113
  end
106
-
114
+
107
115
  ##
108
116
  # Checks if a term is an intensifier.
109
117
  #
@@ -112,7 +120,7 @@ module Opener
112
120
  def is_intensifier?
113
121
  sentiment_modifier == "intensifier"
114
122
  end
115
-
123
+
116
124
  ##
117
125
  # Checks if a term is a shifter.
118
126
  #
@@ -121,7 +129,7 @@ module Opener
121
129
  def is_shifter?
122
130
  sentiment_modifier == "shifter"
123
131
  end
124
-
132
+
125
133
  ##
126
134
  # Checks if a term is an expression.
127
135
  #
@@ -130,31 +138,22 @@ module Opener
130
138
  def is_expression?
131
139
  use && !!polarity
132
140
  end
133
-
141
+
134
142
  ##
135
143
  # Checks if a term is a conjunction.
136
144
  #
137
145
  # @return [TrueClass|FalseClass]
138
146
  #
139
147
  def is_conjunction?(language)
140
- conjunctions[language].include?(lemma)
148
+ CONJUNCTIONS[language].include?(lemma)
141
149
  end
142
-
143
- ##
144
- # Map of conjunctions per language code
145
- #
146
- # @return [Hash]
147
- #
148
- def conjunctions
149
- {
150
- 'nl' => [',','en'],
151
- 'en' => [',','and'],
152
- 'es' => [',','y','e'],
153
- 'it' => [',','e','ed'],
154
- 'de' => [',','und'],
155
- 'fr' => [',','et']
156
- }
150
+
151
+ private
152
+
153
+ # @return [Oga::XML::Element]
154
+ def first_sentiment
155
+ @first_sentiment ||= node.xpath('sentiment').first
157
156
  end
158
157
  end # Term
159
158
  end # OpinionDetectorBasic
160
- end # Opener
159
+ end # Opener
@@ -1,5 +1,5 @@
1
1
  module Opener
2
2
  class OpinionDetectorBasic
3
- VERSION = '3.0.1'
3
+ VERSION = '3.0.2'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opener-opinion-detector-basic
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - development@olery.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-15 00:00:00.000000000 Z
11
+ date: 2015-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opener-daemons
@@ -125,9 +125,9 @@ dependencies:
125
125
  description: Basic Opinion Detector.
126
126
  email:
127
127
  executables:
128
+ - opinion-detector-basic-server
128
129
  - opinion-detector-basic
129
130
  - opinion-detector-basic-daemon
130
- - opinion-detector-basic-server
131
131
  extensions: []
132
132
  extra_rdoc_files: []
133
133
  files:
@@ -169,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  version: '0'
170
170
  requirements: []
171
171
  rubyforge_project:
172
- rubygems_version: 2.2.2
172
+ rubygems_version: 2.4.8
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: Basic Opinion Detector.