opener-polarity-tagger 2.5.0 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +115 -93
- data/bin/console +13 -0
- data/bin/polarity-tagger +8 -2
- data/bin/polarity-tagger-daemon +9 -5
- data/bin/polarity-tagger-server +8 -48
- data/core/LexiconMod.py +0 -13
- data/exec/polarity-tagger.rb +1 -11
- data/lib/opener/polarity_tagger.rb +12 -86
- data/lib/opener/polarity_tagger/cli.rb +43 -52
- data/lib/opener/polarity_tagger/external.rb +105 -0
- data/lib/opener/polarity_tagger/internal.rb +57 -0
- data/lib/opener/polarity_tagger/kaf/document.rb +53 -0
- data/lib/opener/polarity_tagger/kaf/term.rb +35 -0
- data/lib/opener/polarity_tagger/lexicon_map.rb +82 -0
- data/lib/opener/polarity_tagger/lexicons_cache.rb +69 -0
- data/lib/opener/polarity_tagger/server.rb +4 -5
- data/lib/opener/polarity_tagger/version.rb +5 -3
- data/opener-polarity-tagger.gemspec +7 -6
- data/task/requirements.rake +1 -1
- metadata +48 -41
@@ -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,69 @@
|
|
1
|
+
module Opener
|
2
|
+
class PolarityTagger
|
3
|
+
class LexiconsCache
|
4
|
+
|
5
|
+
include MonitorMixin
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
super #MonitorMixin
|
9
|
+
|
10
|
+
@url = ENV['POLARITY_LEXICON_URL']
|
11
|
+
@path = ENV['POLARITY_LEXICON_PATH']
|
12
|
+
@cache = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def [] lang
|
16
|
+
synchronize do
|
17
|
+
@cache[lang] ||= load_lexicons lang
|
18
|
+
end
|
19
|
+
end
|
20
|
+
alias_method :get, :[]
|
21
|
+
|
22
|
+
def load_lexicons lang
|
23
|
+
lexicons = if @url then load_from_url lang else load_from_path lang end
|
24
|
+
|
25
|
+
LexiconMap.new lang: lang, lexicons: lexicons
|
26
|
+
end
|
27
|
+
|
28
|
+
def load_from_url lang
|
29
|
+
url = "#{@url}&language_code=#{lang}"
|
30
|
+
puts "#{lang}: loading lexicons from url #{url}"
|
31
|
+
lexicons = JSON.parse HTTPClient.new.get(url).body
|
32
|
+
lexicons = lexicons['data'].map{ |l| Hashie::Mash.new l }
|
33
|
+
lexicons
|
34
|
+
end
|
35
|
+
|
36
|
+
def load_from_path lang
|
37
|
+
@path ||= 'core/general-lexicons'
|
38
|
+
dir = "#{@path}/#{lang.upcase}-lexicon"
|
39
|
+
config = Nokogiri::XML File.read "#{dir}/config.xml"
|
40
|
+
lexicons = []
|
41
|
+
|
42
|
+
config.css(:lexicon).each do |cl|
|
43
|
+
filename = cl.at(:filename).text
|
44
|
+
resource = cl.at(:resource).text
|
45
|
+
xml = Nokogiri::XML File.read "#{dir}/#{filename}"
|
46
|
+
puts "#{lang}: loading lexicons from the file #{filename}"
|
47
|
+
|
48
|
+
lexicons.concat(xml.css(:LexicalEntry).map do |le|
|
49
|
+
Hashie::Mash.new(
|
50
|
+
resource: resource,
|
51
|
+
identifier: le.attr(:id),
|
52
|
+
type: le.attr(:type),
|
53
|
+
lemma: le.at(:Lemma).attr(:writtenForm).downcase,
|
54
|
+
pos: le.attr(:partOfSpeech)&.downcase,
|
55
|
+
aspect: le.at(:Domain)&.attr(:aspect)&.downcase,
|
56
|
+
polarity: le.at(:Sentiment).attr(:polarity),
|
57
|
+
strength: le.at(:Sentiment).attr(:strength),
|
58
|
+
confidence_level: le.at(:Confidence)&.attr(:level),
|
59
|
+
domain_conditional: le.at(:Domain)&.attr(:conditional) == 'yes',
|
60
|
+
)
|
61
|
+
end)
|
62
|
+
end
|
63
|
+
|
64
|
+
lexicons
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
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
|
-
|
13
|
-
|
10
|
+
|
11
|
+
self.text_processor = PolarityTagger
|
12
|
+
self.accepted_params = [:input]
|
14
13
|
end # Server
|
15
14
|
end # PolarityTagger
|
16
15
|
end # Opener
|
@@ -29,16 +29,17 @@ Gem::Specification.new do |gem|
|
|
29
29
|
|
30
30
|
gem.executables = Dir.glob('bin/*').map { |file| File.basename(file) }
|
31
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'
|
32
37
|
gem.add_dependency 'rake'
|
33
|
-
gem.add_dependency 'sinatra'
|
34
|
-
gem.add_dependency 'httpclient'
|
35
|
-
gem.add_dependency 'puma'
|
36
|
-
gem.add_dependency 'opener-daemons'
|
37
|
-
gem.add_dependency 'opener-webservice'
|
38
|
-
gem.add_dependency 'opener-core', '~> 1.0'
|
39
38
|
gem.add_dependency 'nokogiri'
|
40
39
|
gem.add_dependency 'cliver'
|
40
|
+
gem.add_dependency 'slop', '~> 3.5'
|
41
41
|
|
42
|
+
gem.add_development_dependency 'pry'
|
42
43
|
gem.add_development_dependency 'rspec', '~> 3.0'
|
43
44
|
gem.add_development_dependency 'cucumber'
|
44
45
|
end
|
data/task/requirements.rake
CHANGED
metadata
CHANGED
@@ -1,59 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opener-polarity-tagger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- development@olery.com
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: opener-daemons
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: opener-webservice
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: opener-core
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: hashie
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: nokogiri
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -95,41 +95,41 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: cliver
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: slop
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '3.5'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
124
|
+
version: '3.5'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: pry
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
|
-
type: :
|
132
|
+
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
@@ -165,17 +165,19 @@ dependencies:
|
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
description: Polarity tagger for various languages.
|
168
|
-
email:
|
168
|
+
email:
|
169
169
|
executables:
|
170
|
-
- polarity-tagger-server
|
171
|
-
- polarity-tagger-daemon
|
172
170
|
- polarity-tagger
|
171
|
+
- polarity-tagger-daemon
|
172
|
+
- polarity-tagger-server
|
173
|
+
- console
|
173
174
|
extensions:
|
174
175
|
- ext/hack/Rakefile
|
175
176
|
extra_rdoc_files: []
|
176
177
|
files:
|
177
178
|
- LICENSE.txt
|
178
179
|
- README.md
|
180
|
+
- bin/console
|
179
181
|
- bin/polarity-tagger
|
180
182
|
- bin/polarity-tagger-daemon
|
181
183
|
- bin/polarity-tagger-server
|
@@ -198,6 +200,12 @@ files:
|
|
198
200
|
- ext/hack/Rakefile
|
199
201
|
- lib/opener/polarity_tagger.rb
|
200
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
|
201
209
|
- lib/opener/polarity_tagger/public/markdown.css
|
202
210
|
- lib/opener/polarity_tagger/server.rb
|
203
211
|
- lib/opener/polarity_tagger/version.rb
|
@@ -213,7 +221,7 @@ homepage: http://opener-project.github.com/
|
|
213
221
|
licenses:
|
214
222
|
- Apache 2.0
|
215
223
|
metadata: {}
|
216
|
-
post_install_message:
|
224
|
+
post_install_message:
|
217
225
|
rdoc_options: []
|
218
226
|
require_paths:
|
219
227
|
- lib
|
@@ -228,10 +236,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
236
|
- !ruby/object:Gem::Version
|
229
237
|
version: '0'
|
230
238
|
requirements: []
|
231
|
-
rubyforge_project:
|
232
|
-
rubygems_version: 2.
|
233
|
-
signing_key:
|
239
|
+
rubyforge_project:
|
240
|
+
rubygems_version: 2.7.8
|
241
|
+
signing_key:
|
234
242
|
specification_version: 4
|
235
243
|
summary: Polarity tagger for various languages.
|
236
244
|
test_files: []
|
237
|
-
has_rdoc:
|