opener-polarity-tagger 2.4.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,35 @@
1
+ module Opener
2
+ module KAF
3
+ class Term
4
+
5
+ attr_reader :document
6
+ attr_reader :node
7
+
8
+ def initialize document, node
9
+ @document = document
10
+ @node = node
11
+ end
12
+
13
+ def id
14
+ @id ||= @node.attr :tid
15
+ end
16
+
17
+ def lemma
18
+ @node.attr :lemma
19
+ end
20
+
21
+ def pos
22
+ @node.attr :pos
23
+ end
24
+
25
+ def setPolarity attrs, polarity_pos
26
+ #In case there is no pos info, we use the polarityPos
27
+ @node[:pos] = polarity_pos if !pos and polarity_pos
28
+
29
+ sentiment = @node.add_child('<sentiment/>')
30
+ sentiment.attr attrs
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,82 @@
1
+ module Opener
2
+ class PolarityTagger
3
+ class LexiconMap
4
+
5
+ attr_reader :resource
6
+ attr_reader :negators
7
+ attr_reader :intensifiers
8
+ attr_reader :with_polarity
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'
24
+
25
+ POS_SHORT_MAP = {
26
+ adj: 'G',
27
+ adv: 'A',
28
+ noun: 'N',
29
+ propernoun: 'N',
30
+ other: 'O',
31
+ prep: 'P',
32
+ verb: 'V',
33
+ nil => DEFAULT_POS,
34
+ multi_word_expression: 'O',
35
+ }
36
+
37
+ def by_negator lemma
38
+ @negators[lemma]
39
+ end
40
+
41
+ def by_intensifier lemma
42
+ @intensifiers[lemma]
43
+ end
44
+
45
+ def by_polarity lemma, short_pos
46
+ return [@with_polarity[lemma+short_pos] || UNKNOWN, short_pos] if short_pos
47
+
48
+ POS_ORDER.chars.each do |short_pos|
49
+ if l = @with_polarity[lemma+short_pos]
50
+ puts "Found polarify #{l.polarity} for #{lemma} with PoS #{short_pos}"
51
+ return [l, short_pos]
52
+ end
53
+ end
54
+
55
+ [UNKNOWN, 'unknown']
56
+ end
57
+
58
+ protected
59
+
60
+ def map lexicons
61
+ lexicons.each do |l|
62
+ next if l.lemma.nil?
63
+
64
+ case l.type
65
+ when 'polarityShifter' then @negators[l.lemma] = l
66
+ when 'intensifier' then @intensifiers[l.lemma] = l
67
+ else
68
+ if l.polarity
69
+ short_pos = POS_SHORT_MAP[l.pos&.to_sym] || DEFAULT_POS
70
+ @with_polarity[l.lemma+short_pos] = l
71
+ end
72
+ end
73
+ end
74
+
75
+ puts "#{@lang}: loaded #{@negators.size} negators"
76
+ puts "#{@lang}: loaded #{@intensifiers.size} intensifiers"
77
+ puts "#{@lang}: loaded #{@with_polarity.size} elements with polarity"
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,67 @@
1
+ module Opener
2
+ class PolarityTagger
3
+ class LexiconsCache
4
+
5
+ def initialize
6
+ extend MonitorMixin
7
+
8
+ @url = ENV['POLARITY_LEXICON_URL']
9
+ @path = ENV['POLARITY_LEXICON_PATH']
10
+ @cache = {}
11
+ end
12
+
13
+ def [] lang
14
+ synchronize do
15
+ @cache[lang] ||= load_lexicons lang
16
+ end
17
+ end
18
+ alias_method :get, :[]
19
+
20
+ def load_lexicons lang
21
+ lexicons = if @url then load_from_url lang else load_from_path lang end
22
+
23
+ LexiconMap.new lang: lang, lexicons: lexicons
24
+ end
25
+
26
+ def load_from_url lang
27
+ url = "#{@url}&language_code=#{lang}"
28
+ puts "#{lang}: loading lexicons from url #{url}"
29
+ lexicons = JSON.parse HTTPClient.new.get(url).body
30
+ lexicons = lexicons['data'].map{ |l| Hashie::Mash.new l }
31
+ lexicons
32
+ end
33
+
34
+ def load_from_path lang
35
+ @path ||= 'core/general-lexicons'
36
+ dir = "#{@path}/#{lang.upcase}-lexicon"
37
+ config = Nokogiri::XML File.read "#{dir}/config.xml"
38
+ lexicons = []
39
+
40
+ config.css(:lexicon).each do |cl|
41
+ filename = cl.at(:filename).text
42
+ resource = cl.at(:resource).text
43
+ xml = Nokogiri::XML File.read "#{dir}/#{filename}"
44
+ puts "#{lang}: loading lexicons from the file #{filename}"
45
+
46
+ lexicons.concat(xml.css(:LexicalEntry).map do |le|
47
+ Hashie::Mash.new(
48
+ resource: resource,
49
+ identifier: le.attr(:id),
50
+ type: le.attr(:type),
51
+ lemma: le.at(:Lemma).attr(:writtenForm).downcase,
52
+ pos: le.attr(:partOfSpeech)&.downcase,
53
+ aspect: le.at(:Domain)&.attr(:aspect)&.downcase,
54
+ polarity: le.at(:Sentiment).attr(:polarity),
55
+ strength: le.at(:Sentiment).attr(:strength),
56
+ confidence_level: le.at(:Confidence)&.attr(:level),
57
+ domain_conditional: le.at(:Domain)&.attr(:conditional) == 'yes',
58
+ )
59
+ end)
60
+ end
61
+
62
+ lexicons
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -1,5 +1,3 @@
1
- require 'sinatra/base'
2
- require 'httpclient'
3
1
  require 'opener/webservice'
4
2
 
5
3
  module Opener
@@ -7,10 +5,11 @@ module Opener
7
5
  ##
8
6
  # Polarity tagger server powered by Sinatra.
9
7
  #
10
- class Server < Webservice
8
+ class Server < Webservice::Server
11
9
  set :views, File.expand_path('../views', __FILE__)
12
- text_processor PolarityTagger
13
- accepted_params :input
10
+
11
+ self.text_processor = PolarityTagger
12
+ self.accepted_params = [:input]
14
13
  end # Server
15
14
  end # PolarityTagger
16
15
  end # Opener
@@ -1,5 +1,7 @@
1
1
  module Opener
2
2
  class PolarityTagger
3
- VERSION = '2.4.1'
4
- end # PolarityTagger
5
- end # Opener
3
+
4
+ VERSION = '3.1.0'
5
+
6
+ end
7
+ end
@@ -9,6 +9,8 @@ Gem::Specification.new do |gem|
9
9
  gem.homepage = 'http://opener-project.github.com/'
10
10
  gem.extensions = ['ext/hack/Rakefile']
11
11
 
12
+ gem.license = 'Apache 2.0'
13
+
12
14
  gem.required_ruby_version = '>= 1.9.2'
13
15
 
14
16
  gem.files = Dir.glob([
@@ -20,22 +22,24 @@ Gem::Specification.new do |gem|
20
22
  '*.gemspec',
21
23
  '*_requirements.txt',
22
24
  'README.md',
25
+ 'LICENSE.txt',
23
26
  'exec/**/*',
24
27
  'task/*'
25
28
  ]).select { |file| File.file?(file) }
26
29
 
27
30
  gem.executables = Dir.glob('bin/*').map { |file| File.basename(file) }
28
31
 
32
+ gem.add_dependency 'opener-daemons', '~> 2.2'
33
+ gem.add_dependency 'opener-webservice', '~> 2.1'
34
+ gem.add_dependency 'opener-core', '~> 2.2'
35
+
36
+ gem.add_dependency 'hashie'
29
37
  gem.add_dependency 'rake'
30
- gem.add_dependency 'sinatra'
31
- gem.add_dependency 'httpclient'
32
- gem.add_dependency 'puma'
33
- gem.add_dependency 'opener-daemons'
34
- gem.add_dependency 'opener-webservice'
35
- gem.add_dependency 'opener-core', '~> 1.0.2'
36
38
  gem.add_dependency 'nokogiri'
37
39
  gem.add_dependency 'cliver'
40
+ gem.add_dependency 'slop', '~> 3.5'
38
41
 
42
+ gem.add_development_dependency 'pry'
39
43
  gem.add_development_dependency 'rspec', '~> 3.0'
40
44
  gem.add_development_dependency 'cucumber'
41
45
  end
@@ -3,5 +3,5 @@ task :requirements do
3
3
  require 'cliver'
4
4
 
5
5
  Cliver.detect!('python', '~> 2.6')
6
- Cliver.detect!('pip', '~> 1.3')
6
+ Cliver.detect!('pip', '>= 1.3')
7
7
  end
metadata CHANGED
@@ -1,180 +1,183 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opener-polarity-tagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 3.1.0
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: 2014-06-19 00:00:00.000000000 Z
11
+ date: 2020-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: opener-daemons
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ type: :runtime
21
+ prerelease: false
15
22
  version_requirements: !ruby/object:Gem::Requirement
16
23
  requirements:
17
- - - '>='
24
+ - - "~>"
18
25
  - !ruby/object:Gem::Version
19
- version: '0'
26
+ version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: opener-webservice
20
29
  requirement: !ruby/object:Gem::Requirement
21
30
  requirements:
22
- - - '>='
31
+ - - "~>"
23
32
  - !ruby/object:Gem::Version
24
- version: '0'
25
- prerelease: false
33
+ version: '2.1'
26
34
  type: :runtime
27
- - !ruby/object:Gem::Dependency
28
- name: sinatra
35
+ prerelease: false
29
36
  version_requirements: !ruby/object:Gem::Requirement
30
37
  requirements:
31
- - - '>='
38
+ - - "~>"
32
39
  - !ruby/object:Gem::Version
33
- version: '0'
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: opener-core
34
43
  requirement: !ruby/object:Gem::Requirement
35
44
  requirements:
36
- - - '>='
45
+ - - "~>"
37
46
  - !ruby/object:Gem::Version
38
- version: '0'
39
- prerelease: false
47
+ version: '2.2'
40
48
  type: :runtime
41
- - !ruby/object:Gem::Dependency
42
- name: httpclient
49
+ prerelease: false
43
50
  version_requirements: !ruby/object:Gem::Requirement
44
51
  requirements:
45
- - - '>='
52
+ - - "~>"
46
53
  - !ruby/object:Gem::Version
47
- version: '0'
54
+ version: '2.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hashie
48
57
  requirement: !ruby/object:Gem::Requirement
49
58
  requirements:
50
- - - '>='
59
+ - - ">="
51
60
  - !ruby/object:Gem::Version
52
61
  version: '0'
53
- prerelease: false
54
62
  type: :runtime
55
- - !ruby/object:Gem::Dependency
56
- name: puma
63
+ prerelease: false
57
64
  version_requirements: !ruby/object:Gem::Requirement
58
65
  requirements:
59
- - - '>='
66
+ - - ">="
60
67
  - !ruby/object:Gem::Version
61
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
62
71
  requirement: !ruby/object:Gem::Requirement
63
72
  requirements:
64
- - - '>='
73
+ - - ">="
65
74
  - !ruby/object:Gem::Version
66
75
  version: '0'
67
- prerelease: false
68
76
  type: :runtime
69
- - !ruby/object:Gem::Dependency
70
- name: opener-daemons
77
+ prerelease: false
71
78
  version_requirements: !ruby/object:Gem::Requirement
72
79
  requirements:
73
- - - '>='
80
+ - - ">="
74
81
  - !ruby/object:Gem::Version
75
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
76
85
  requirement: !ruby/object:Gem::Requirement
77
86
  requirements:
78
- - - '>='
87
+ - - ">="
79
88
  - !ruby/object:Gem::Version
80
89
  version: '0'
81
- prerelease: false
82
90
  type: :runtime
83
- - !ruby/object:Gem::Dependency
84
- name: opener-webservice
91
+ prerelease: false
85
92
  version_requirements: !ruby/object:Gem::Requirement
86
93
  requirements:
87
- - - '>='
94
+ - - ">="
88
95
  - !ruby/object:Gem::Version
89
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: cliver
90
99
  requirement: !ruby/object:Gem::Requirement
91
100
  requirements:
92
- - - '>='
101
+ - - ">="
93
102
  - !ruby/object:Gem::Version
94
103
  version: '0'
95
- prerelease: false
96
104
  type: :runtime
97
- - !ruby/object:Gem::Dependency
98
- name: opener-core
105
+ prerelease: false
99
106
  version_requirements: !ruby/object:Gem::Requirement
100
107
  requirements:
101
- - - ~>
108
+ - - ">="
102
109
  - !ruby/object:Gem::Version
103
- version: 1.0.2
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: slop
104
113
  requirement: !ruby/object:Gem::Requirement
105
114
  requirements:
106
- - - ~>
115
+ - - "~>"
107
116
  - !ruby/object:Gem::Version
108
- version: 1.0.2
109
- prerelease: false
117
+ version: '3.5'
110
118
  type: :runtime
111
- - !ruby/object:Gem::Dependency
112
- name: nokogiri
119
+ prerelease: false
113
120
  version_requirements: !ruby/object:Gem::Requirement
114
121
  requirements:
115
- - - '>='
122
+ - - "~>"
116
123
  - !ruby/object:Gem::Version
117
- version: '0'
124
+ version: '3.5'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
118
127
  requirement: !ruby/object:Gem::Requirement
119
128
  requirements:
120
- - - '>='
129
+ - - ">="
121
130
  - !ruby/object:Gem::Version
122
131
  version: '0'
132
+ type: :development
123
133
  prerelease: false
124
- type: :runtime
125
- - !ruby/object:Gem::Dependency
126
- name: cliver
127
134
  version_requirements: !ruby/object:Gem::Requirement
128
135
  requirements:
129
- - - '>='
136
+ - - ">="
130
137
  - !ruby/object:Gem::Version
131
138
  version: '0'
132
- requirement: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - '>='
135
- - !ruby/object:Gem::Version
136
- version: '0'
137
- prerelease: false
138
- type: :runtime
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
- version_requirements: !ruby/object:Gem::Requirement
141
+ requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '3.0'
146
- requirement: !ruby/object:Gem::Requirement
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
147
149
  requirements:
148
- - - ~>
150
+ - - "~>"
149
151
  - !ruby/object:Gem::Version
150
152
  version: '3.0'
151
- prerelease: false
152
- type: :development
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: cucumber
155
- version_requirements: !ruby/object:Gem::Requirement
155
+ requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
- requirement: !ruby/object:Gem::Requirement
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
161
163
  requirements:
162
- - - '>='
164
+ - - ">="
163
165
  - !ruby/object:Gem::Version
164
166
  version: '0'
165
- prerelease: false
166
- type: :development
167
167
  description: Polarity tagger for various languages.
168
168
  email:
169
169
  executables:
170
170
  - polarity-tagger
171
171
  - polarity-tagger-daemon
172
172
  - polarity-tagger-server
173
+ - console
173
174
  extensions:
174
175
  - ext/hack/Rakefile
175
176
  extra_rdoc_files: []
176
177
  files:
178
+ - LICENSE.txt
177
179
  - README.md
180
+ - bin/console
178
181
  - bin/polarity-tagger
179
182
  - bin/polarity-tagger-daemon
180
183
  - bin/polarity-tagger-server
@@ -197,6 +200,12 @@ files:
197
200
  - ext/hack/Rakefile
198
201
  - lib/opener/polarity_tagger.rb
199
202
  - lib/opener/polarity_tagger/cli.rb
203
+ - lib/opener/polarity_tagger/external.rb
204
+ - lib/opener/polarity_tagger/internal.rb
205
+ - lib/opener/polarity_tagger/kaf/document.rb
206
+ - lib/opener/polarity_tagger/kaf/term.rb
207
+ - lib/opener/polarity_tagger/lexicon_map.rb
208
+ - lib/opener/polarity_tagger/lexicons_cache.rb
200
209
  - lib/opener/polarity_tagger/public/markdown.css
201
210
  - lib/opener/polarity_tagger/server.rb
202
211
  - lib/opener/polarity_tagger/version.rb
@@ -209,7 +218,8 @@ files:
209
218
  - task/requirements.rake
210
219
  - task/test.rake
211
220
  homepage: http://opener-project.github.com/
212
- licenses: []
221
+ licenses:
222
+ - Apache 2.0
213
223
  metadata: {}
214
224
  post_install_message:
215
225
  rdoc_options: []
@@ -217,17 +227,17 @@ require_paths:
217
227
  - lib
218
228
  required_ruby_version: !ruby/object:Gem::Requirement
219
229
  requirements:
220
- - - '>='
230
+ - - ">="
221
231
  - !ruby/object:Gem::Version
222
232
  version: 1.9.2
223
233
  required_rubygems_version: !ruby/object:Gem::Requirement
224
234
  requirements:
225
- - - '>='
235
+ - - ">="
226
236
  - !ruby/object:Gem::Version
227
237
  version: '0'
228
238
  requirements: []
229
239
  rubyforge_project:
230
- rubygems_version: 2.2.2
240
+ rubygems_version: 2.7.8
231
241
  signing_key:
232
242
  specification_version: 4
233
243
  summary: Polarity tagger for various languages.