opener-polarity-tagger 3.1.0 → 3.2.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
  SHA256:
3
- metadata.gz: 1407a3f9dab798e58f92e033a6255151545d225c03a5e056a2f2dbb6878832ed
4
- data.tar.gz: 9c79bb5e40a5882effff686d11f180f7d0ababbd5e2c9d11c0a4bab1a835eb22
3
+ metadata.gz: 27bfb633058aa56d6b5d30fd5557dcfa7e00ecee25005d9258fede4a3544ae47
4
+ data.tar.gz: 8c2877d8c288360c77e64f828587ddd0781cde0171237d85c87dc8a435f0cde8
5
5
  SHA512:
6
- metadata.gz: 53b7b5649087d0ab9728df51ccf67dd7c6ff48eeaa0c6f4c3f74a257f07b610f29dc05b0919b1d2c379becb5b31f36c5609bca49583a3eb1d0b085df256ad9e7
7
- data.tar.gz: f510909ce50427bb126773dedb60b21f3998fb80f49b9e602254e3adf1de1a658ce5d5a3b8ba7a452a78d764fa3960e455ce89d3d495c82147440e17780237ea
6
+ metadata.gz: 9c9c8b158fe73cae1d095cfad59b774eca29e034d635baf6795dd9bc96c63e19cc0cd63fab12fa3c560df75e4451f1bbabcd2814ac92bcfa5e3002a966b0eb56
7
+ data.tar.gz: aadffb4278642a1b3e04483a486def241f1be6d2adbce911428588f1962a19fc5392903b805bec04411b128a67f8d6ebca37be285c38b4805617f0f3eb125bae
@@ -2,6 +2,7 @@ require 'open3'
2
2
  require 'opener/core'
3
3
  require 'nokogiri'
4
4
  require 'hashie'
5
+ require 'active_support/all'
5
6
 
6
7
  require_relative 'polarity_tagger/version'
7
8
  require_relative 'polarity_tagger/cli'
@@ -19,8 +20,12 @@ module Opener
19
20
  @proc = @klass.new args: @args
20
21
  end
21
22
 
22
- def run input
23
- @proc.run input
23
+ def clear_cache params = {}
24
+ @proc.clear_cache(**params)
25
+ end
26
+
27
+ def run input, params = {}
28
+ @proc.run input, params
24
29
  end
25
30
 
26
31
  end
@@ -52,7 +52,7 @@ module Opener
52
52
  # @param [String] input The text of which to detect the language.
53
53
  # @return [Array]
54
54
  #
55
- def run(input)
55
+ def run input, params
56
56
  stdout, stderr, process = capture(input)
57
57
 
58
58
  raise stderr unless process.success?
@@ -10,17 +10,22 @@ module Opener
10
10
  LAST_EDITED = '21may2014'
11
11
  VERSION = '1.2'
12
12
 
13
- def initialize ignore_pos: false, **params
14
- @cache = LexiconsCache.new
13
+ CACHE = LexiconsCache.new
15
14
 
15
+ def initialize ignore_pos: false, **params
16
16
  @ignore_pos = ignore_pos
17
17
  end
18
18
 
19
- def run input
19
+ def clear_cache lang: nil, environment:
20
+ end
21
+
22
+ def run input, params = {}
20
23
  @kaf = KAF::Document.from_xml input
21
- @map = @kaf.map = @cache[@kaf.language]
22
24
 
23
- negators = 0
25
+ @cache_keys = params[:cache_keys] ||= {}
26
+ @cache_keys.merge! lang: @kaf.language
27
+ @map = @kaf.map = CACHE[**@cache_keys].lexicons
28
+
24
29
  @kaf.terms.each do |t|
25
30
  lemma = t.lemma&.downcase
26
31
  pos = if @ignore_pos then nil else t.pos end
@@ -32,12 +37,11 @@ module Opener
32
37
  attrs.polarity = lexicon.polarity
33
38
  end
34
39
  if l = @map.by_negator(lemma)
35
- negators += 1
36
- lexicon, polarity = l, nil
40
+ lexicon, polarity_pos = l, nil
37
41
  attrs.sentiment_modifier = 'shifter'
38
42
  end
39
43
  if l = @map.by_intensifier(lemma)
40
- lexicon, polarity = l, nil
44
+ lexicon, polarity_pos = l, nil
41
45
  attrs.sentiment_modifier = 'intensifier'
42
46
  end
43
47
 
@@ -26,9 +26,9 @@ module Opener
26
26
  end
27
27
 
28
28
  def add_linguistic_processor name, version, layer, timestamp: false
29
- header = @document.at('kafHeader') || @document.root.add_child('<kafHeader/>')
29
+ header = @document.at('kafHeader') || @document.root.add_child('<kafHeader/>').first
30
30
  procs = header.css('linguisticProcessors').find{ |l| l.attr(:layer) == layer }
31
- procs ||= header.add_child("<linguisticProcessors layer='#{layer}'/>")
31
+ procs ||= header.add_child("<linguisticProcessors layer='#{layer}'/>").first
32
32
  lp = procs.add_child('<lp/>')
33
33
  lp.attr(
34
34
  timestamp: if timestamp then Time.now.iso8601 else '*' end,
@@ -7,21 +7,10 @@ module Opener
7
7
  attr_reader :intensifiers
8
8
  attr_reader :with_polarity
9
9
 
10
- POS_ORDER = 'NRVGAO'
11
- UNKNOWN = Hashie::Mash.new polarity: 'unknown'
12
-
13
- def initialize lang:, lexicons:
14
- @lang = lang
15
- @lexicons = lexicons
16
-
17
- @negators = {}
18
- @intensifiers = {}
19
- @with_polarity = {}
20
- map lexicons
21
- end
22
-
23
- DEFAULT_POS = 'O'
10
+ UNKNOWN = Hashie::Mash.new polarity: 'unknown'
24
11
 
12
+ POS_ORDER = 'NRVGAO'
13
+ DEFAULT_POS = 'O'
25
14
  POS_SHORT_MAP = {
26
15
  adj: 'G',
27
16
  adv: 'A',
@@ -34,6 +23,20 @@ module Opener
34
23
  multi_word_expression: 'O',
35
24
  }
36
25
 
26
+ def initialize lang:, lexicons:
27
+ @lang = lang
28
+ @lexicons = lexicons
29
+
30
+ @negators = {}
31
+ @intensifiers = {}
32
+ @with_polarity = {}
33
+ map lexicons
34
+ end
35
+
36
+ def blank?
37
+ @lexicons.blank?
38
+ end
39
+
37
40
  def by_negator lemma
38
41
  @negators[lemma]
39
42
  end
@@ -58,6 +61,8 @@ module Opener
58
61
  protected
59
62
 
60
63
  def map lexicons
64
+ return if blank?
65
+
61
66
  lexicons.each do |l|
62
67
  next if l.lemma.nil?
63
68
 
@@ -2,36 +2,59 @@ module Opener
2
2
  class PolarityTagger
3
3
  class LexiconsCache
4
4
 
5
+ include MonitorMixin
6
+
7
+ UPDATE_INTERVAL = (ENV['CACHE_EXPIRE_MINS']&.to_i || 5).minutes
8
+
5
9
  def initialize
6
- extend MonitorMixin
10
+ super #MonitorMixin
7
11
 
8
12
  @url = ENV['POLARITY_LEXICON_URL']
9
13
  @path = ENV['POLARITY_LEXICON_PATH']
10
14
  @cache = {}
11
15
  end
12
16
 
13
- def [] lang
17
+ def [] **params
14
18
  synchronize do
15
- @cache[lang] ||= load_lexicons lang
19
+ existing = @cache[params]
20
+ break existing if existing and existing.from > UPDATE_INTERVAL.ago
21
+ @cache[params] = cache_update existing, **params
16
22
  end
17
23
  end
18
24
  alias_method :get, :[]
19
25
 
20
- def load_lexicons lang
21
- lexicons = if @url then load_from_url lang else load_from_path lang end
26
+ def cache_update existing = nil, **params
27
+ from = Time.now
28
+ lexicons = load_lexicons cache: existing, **params
29
+
30
+ if existing and lexicons.blank?
31
+ existing.from = from
32
+ return existing
33
+ end
34
+
35
+ Hashie::Mash.new(
36
+ lexicons: lexicons,
37
+ from: from,
38
+ )
39
+ end
40
+
41
+ def load_lexicons lang:, **params
42
+ lexicons = if @url then load_from_url lang: lang, **params else load_from_path lang: lang, **params end
22
43
 
23
44
  LexiconMap.new lang: lang, lexicons: lexicons
24
45
  end
25
46
 
26
- def load_from_url lang
27
- url = "#{@url}&language_code=#{lang}"
47
+ def load_from_url lang:, cache:, **params
48
+ url = "#{@url}&language_code=#{lang}&#{params.to_query}"
49
+ url += "&if_updated_since=#{cache.from.iso8601}" if cache
28
50
  puts "#{lang}: loading lexicons from url #{url}"
29
- lexicons = JSON.parse HTTPClient.new.get(url).body
51
+
52
+ lexicons = JSON.parse http.get(url).body
30
53
  lexicons = lexicons['data'].map{ |l| Hashie::Mash.new l }
31
54
  lexicons
32
55
  end
33
56
 
34
- def load_from_path lang
57
+ def load_from_path lang:, **params
35
58
  @path ||= 'core/general-lexicons'
36
59
  dir = "#{@path}/#{lang.upcase}-lexicon"
37
60
  config = Nokogiri::XML File.read "#{dir}/config.xml"
@@ -62,6 +85,16 @@ module Opener
62
85
  lexicons
63
86
  end
64
87
 
88
+ def http
89
+ return @http if @http
90
+
91
+ @http = HTTPClient.new
92
+ @http.send_timeout = 120
93
+ @http.receive_timeout = 120
94
+ @http.connect_timeout = 120
95
+ @http
96
+ end
97
+
65
98
  end
66
99
  end
67
100
  end
@@ -1,7 +1,7 @@
1
1
  module Opener
2
2
  class PolarityTagger
3
3
 
4
- VERSION = '3.1.0'
4
+ VERSION = '3.2.2'
5
5
 
6
6
  end
7
7
  end
@@ -33,6 +33,7 @@ Gem::Specification.new do |gem|
33
33
  gem.add_dependency 'opener-webservice', '~> 2.1'
34
34
  gem.add_dependency 'opener-core', '~> 2.2'
35
35
 
36
+ gem.add_dependency 'activesupport'
36
37
  gem.add_dependency 'hashie'
37
38
  gem.add_dependency 'rake'
38
39
  gem.add_dependency 'nokogiri'
metadata CHANGED
@@ -1,164 +1,178 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opener-polarity-tagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.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: 2020-09-22 00:00:00.000000000 Z
11
+ date: 2020-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: opener-daemons
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
18
  version: '2.2'
20
- type: :runtime
19
+ name: opener-daemons
21
20
  prerelease: false
21
+ type: :runtime
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: opener-webservice
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
32
  version: '2.1'
34
- type: :runtime
33
+ name: opener-webservice
35
34
  prerelease: false
35
+ type: :runtime
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: opener-core
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
46
  version: '2.2'
48
- type: :runtime
47
+ name: opener-core
49
48
  prerelease: false
49
+ type: :runtime
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.2'
55
55
  - !ruby/object:Gem::Dependency
56
- name: hashie
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ">="
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
62
- type: :runtime
61
+ name: activesupport
63
62
  prerelease: false
63
+ type: :runtime
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - ">="
74
73
  - !ruby/object:Gem::Version
75
74
  version: '0'
76
- type: :runtime
75
+ name: hashie
77
76
  prerelease: false
77
+ type: :runtime
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: nokogiri
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
86
  - - ">="
88
87
  - !ruby/object:Gem::Version
89
88
  version: '0'
90
- type: :runtime
89
+ name: rake
91
90
  prerelease: false
91
+ type: :runtime
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: cliver
99
98
  requirement: !ruby/object:Gem::Requirement
100
99
  requirements:
101
100
  - - ">="
102
101
  - !ruby/object:Gem::Version
103
102
  version: '0'
103
+ name: nokogiri
104
+ prerelease: false
104
105
  type: :runtime
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ name: cliver
105
118
  prerelease: false
119
+ type: :runtime
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: slop
113
126
  requirement: !ruby/object:Gem::Requirement
114
127
  requirements:
115
128
  - - "~>"
116
129
  - !ruby/object:Gem::Version
117
130
  version: '3.5'
118
- type: :runtime
131
+ name: slop
119
132
  prerelease: false
133
+ type: :runtime
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
138
  version: '3.5'
125
139
  - !ruby/object:Gem::Dependency
126
- name: pry
127
140
  requirement: !ruby/object:Gem::Requirement
128
141
  requirements:
129
142
  - - ">="
130
143
  - !ruby/object:Gem::Version
131
144
  version: '0'
132
- type: :development
145
+ name: pry
133
146
  prerelease: false
147
+ type: :development
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
- name: rspec
141
154
  requirement: !ruby/object:Gem::Requirement
142
155
  requirements:
143
156
  - - "~>"
144
157
  - !ruby/object:Gem::Version
145
158
  version: '3.0'
146
- type: :development
159
+ name: rspec
147
160
  prerelease: false
161
+ type: :development
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
166
  version: '3.0'
153
167
  - !ruby/object:Gem::Dependency
154
- name: cucumber
155
168
  requirement: !ruby/object:Gem::Requirement
156
169
  requirements:
157
170
  - - ">="
158
171
  - !ruby/object:Gem::Version
159
172
  version: '0'
160
- type: :development
173
+ name: cucumber
161
174
  prerelease: false
175
+ type: :development
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
178
  - - ">="
@@ -237,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
251
  version: '0'
238
252
  requirements: []
239
253
  rubyforge_project:
240
- rubygems_version: 2.7.8
254
+ rubygems_version: 2.7.9
241
255
  signing_key:
242
256
  specification_version: 4
243
257
  summary: Polarity tagger for various languages.