adapt-charyf 0.2.6 → 0.3.0
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 +4 -4
- data/adapt-charyf.gemspec +1 -0
- data/lib/adapt/generators/install/install_generator.rb +22 -0
- data/lib/adapt/generators/install/templates/config/initializers/adapt.rb.tt +2 -0
- data/lib/adapt/helpers/en_parser.rb +97 -0
- data/lib/adapt/helpers/parser.rb +28 -0
- data/lib/adapt/processor.rb +24 -7
- data/lib/adapt/version.rb +1 -1
- data/lib/adapt-charyf.rb +9 -2
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ae0b4187634b74e19145a589d728f4dfbcff32e
|
4
|
+
data.tar.gz: 5aade8cc3b617e4e6943e4d718f7265b7b527d03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a91885e56eb0ffb1f51331c9ab66135ddba69683127d8bf55d839be9c6f3594622d2b435a1f6711048cc20a756a28477db7341db296edc278caa96e290c2a72
|
7
|
+
data.tar.gz: e29fab6d2614932133f5fb2d3a54ddb06e2e83c57775f7f2244c880ba5f83b555e77ae41305fbdbdf8f3c4ddec9153ae2f3a32f1c0f43957bddb7825c7958693
|
data/adapt-charyf.gemspec
CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
|
35
35
|
spec.add_runtime_dependency "charyf", "~> 0.2"
|
36
36
|
spec.add_runtime_dependency "pycall", "~> 1.0.3"
|
37
|
+
spec.add_runtime_dependency "i18n", "~> 0.9"
|
37
38
|
|
38
39
|
spec.add_development_dependency "bundler", "~> 1.15"
|
39
40
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'charyf/utils/generator/base'
|
2
|
+
|
3
|
+
module Adapt
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Charyf::Generators::Base
|
6
|
+
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
|
9
|
+
def initializer
|
10
|
+
template 'config/initializers/adapt.rb.tt'
|
11
|
+
end
|
12
|
+
|
13
|
+
def finalize
|
14
|
+
return unless behavior == :invoke
|
15
|
+
|
16
|
+
say_status 'notice', "Adapt installed" +
|
17
|
+
"\n\t\tDo not forget to set adapt intent processor in application configuration", :green
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative 'parser'
|
2
|
+
|
3
|
+
module Adapt
|
4
|
+
module Helpers
|
5
|
+
module Parser
|
6
|
+
# noinspection RubyLiteralArrayInspection,RubyQuotedStringsInspection
|
7
|
+
# English string normalization
|
8
|
+
class English < Base
|
9
|
+
|
10
|
+
strategy_name :en
|
11
|
+
|
12
|
+
CONTRACTION = ["ain't", "aren't", "can't", "could've", "couldn't",
|
13
|
+
"didn't", "doesn't", "don't", "gonna", "gotta",
|
14
|
+
"hadn't", "hasn't", "haven't", "he'd", "he'll", "he's",
|
15
|
+
"how'd", "how'll", "how's", "I'd", "I'll", "I'm",
|
16
|
+
"I've", "isn't", "it'd", "it'll", "it's", "mightn't",
|
17
|
+
"might've", "mustn't", "must've", "needn't", "oughtn't",
|
18
|
+
"shan't", "she'd", "she'll", "she's", "shouldn't",
|
19
|
+
"should've", "somebody's", "someone'd", "someone'll",
|
20
|
+
"someone's", "that'll", "that's", "that'd", "there'd",
|
21
|
+
"there're", "there's", "they'd", "they'll", "they're",
|
22
|
+
"they've", "wasn't", "we'd", "we'll", "we're", "we've",
|
23
|
+
"weren't", "what'd", "what'll", "what're", "what's",
|
24
|
+
"whats",
|
25
|
+
"what've", "when's", "when'd", "where'd", "where's",
|
26
|
+
"where've", "who'd", "who'd've", "who'll", "who're",
|
27
|
+
"who's", "who've", "why'd", "why're", "why's", "won't",
|
28
|
+
"won't've", "would've", "wouldn't", "wouldn't've",
|
29
|
+
"y'all", "ya'll", "you'd", "you'd've", "you'll",
|
30
|
+
"y'aint", "y'ain't", "you're", "you've"].map(&:downcase).freeze
|
31
|
+
|
32
|
+
EXPANSION = ["is not", "are not", "can not", "could have",
|
33
|
+
"could not", "did not", "does not", "do not",
|
34
|
+
"going to", "got to", "had not", "has not",
|
35
|
+
"have not", "he would", "he will", "he is", "how did",
|
36
|
+
"how will", "how is", "I would", "I will", "I am",
|
37
|
+
"I have", "is not", "it would", "it will", "it is",
|
38
|
+
"might not", "might have", "must not", "must have",
|
39
|
+
"need not", "ought not", "shall not", "she would",
|
40
|
+
"she will", "she is", "should not", "should have",
|
41
|
+
"somebody is", "someone would", "someone will",
|
42
|
+
"someone is", "that will", "that is", "that would",
|
43
|
+
"there would", "there are", "there is", "they would",
|
44
|
+
"they will", "they are", "they have", "was not",
|
45
|
+
"we would", "we will", "we are", "we have",
|
46
|
+
"were not", "what did", "what will", "what are",
|
47
|
+
"what is",
|
48
|
+
"what is", "what have", "when is", "when did",
|
49
|
+
"where did", "where is", "where have", "who would",
|
50
|
+
"who would have", "who will", "who are", "who is",
|
51
|
+
"who have", "why did", "why are", "why is",
|
52
|
+
"will not", "will not have", "would have",
|
53
|
+
"would not", "would not have", "you all", "you all",
|
54
|
+
"you would", "you would have", "you will",
|
55
|
+
"you are not", "you are not", "you are", "you have"].map(&:downcase).freeze
|
56
|
+
|
57
|
+
TEXT_NUMBERS = ["zero", "one", "two", "three", "four", "five", "six",
|
58
|
+
"seven", "eight", "nine", "ten", "eleven", "twelve",
|
59
|
+
"thirteen", "fourteen", "fifteen", "sixteen",
|
60
|
+
"seventeen", "eighteen", "nineteen", "twenty"].map(&:downcase).freeze
|
61
|
+
|
62
|
+
ARTICLES = ["the", "a", "an"].map(&:downcase).freeze
|
63
|
+
|
64
|
+
def self.normalize(text, remove_articles: true)
|
65
|
+
words = text.split
|
66
|
+
|
67
|
+
normalized = ''
|
68
|
+
|
69
|
+
words.each do |word|
|
70
|
+
next if word.empty?
|
71
|
+
next if remove_articles && ARTICLES.include?(word.downcase)
|
72
|
+
|
73
|
+
# Expand common contractions, e.g. "isn't" -> "is not"
|
74
|
+
if CONTRACTION.include?(word.downcase)
|
75
|
+
capitalize = false
|
76
|
+
if word[0] == word[0].upcase
|
77
|
+
capitalize = true
|
78
|
+
end
|
79
|
+
word = EXPANSION[CONTRACTION.index(word.downcase)]
|
80
|
+
|
81
|
+
word.capitalize! if capitalize
|
82
|
+
end
|
83
|
+
|
84
|
+
if TEXT_NUMBERS.include?(word.downcase)
|
85
|
+
word = TEXT_NUMBERS.index(word.downcase)
|
86
|
+
end
|
87
|
+
|
88
|
+
normalized += " " + word
|
89
|
+
end
|
90
|
+
|
91
|
+
normalized.strip
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'charyf/utils/strategy/base_class'
|
2
|
+
require 'charyf/utils/strategy/owner_class'
|
3
|
+
|
4
|
+
module Adapt
|
5
|
+
module Helpers
|
6
|
+
module Parser
|
7
|
+
|
8
|
+
extend Charyf::Strategy::OwnerClass
|
9
|
+
|
10
|
+
class Base
|
11
|
+
|
12
|
+
include Charyf::Strategy::BaseClass
|
13
|
+
|
14
|
+
def self.normalize(text, remove_articles: true)
|
15
|
+
raise Charyf::Utils::NotImplemented.new
|
16
|
+
end
|
17
|
+
|
18
|
+
end # End of base
|
19
|
+
|
20
|
+
def self.get(language)
|
21
|
+
list[language]
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require_relative 'en_parser'
|
data/lib/adapt/processor.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pycall/import'
|
2
2
|
|
3
3
|
require_relative 'routing_builder'
|
4
|
+
require_relative 'helpers/parser'
|
4
5
|
|
5
6
|
module Adapt
|
6
7
|
module Intent
|
@@ -20,20 +21,28 @@ module Adapt
|
|
20
21
|
@_python_loaded = true
|
21
22
|
end
|
22
23
|
|
23
|
-
@
|
24
|
+
@_engine ||= IntentDeterminationEngine.new
|
24
25
|
end
|
25
26
|
|
26
27
|
def _intents
|
27
|
-
@
|
28
|
+
@_intents ||= {}
|
28
29
|
end
|
29
30
|
|
30
31
|
def setup
|
31
|
-
return if @
|
32
|
-
@
|
32
|
+
return if @_initialized
|
33
|
+
@_initialized = true
|
33
34
|
|
34
35
|
load_files
|
35
36
|
end
|
36
37
|
|
38
|
+
def parser
|
39
|
+
return @_parser if @_parser_initialized
|
40
|
+
|
41
|
+
@_parser = Adapt::Helpers::Parser.get(Adapt.config.locale)
|
42
|
+
@_parser_initialized = true
|
43
|
+
puts "No language helper for locale '#{Adapt.config.locale}' available" if @_parser.nil?
|
44
|
+
end
|
45
|
+
|
37
46
|
private
|
38
47
|
|
39
48
|
def load_files
|
@@ -47,7 +56,7 @@ module Adapt
|
|
47
56
|
end
|
48
57
|
|
49
58
|
# Load additional paths
|
50
|
-
Adapt.lookup_paths.each do |path|
|
59
|
+
Adapt.config.lookup_paths.each do |path|
|
51
60
|
Dir[Pathname.new(path.to_s).join('**', '*.adapt.rb')].each do |intent_definition_file|
|
52
61
|
require intent_definition_file
|
53
62
|
end
|
@@ -59,6 +68,8 @@ module Adapt
|
|
59
68
|
def initialize
|
60
69
|
self.class.setup
|
61
70
|
@engine = self.class.engine
|
71
|
+
|
72
|
+
@parser = self.class.parser
|
62
73
|
end
|
63
74
|
|
64
75
|
def define(&block)
|
@@ -78,7 +89,10 @@ module Adapt
|
|
78
89
|
|
79
90
|
def determine(request)
|
80
91
|
adapt_intent = nil
|
81
|
-
|
92
|
+
|
93
|
+
# Normalize text
|
94
|
+
text = @parser ? @parser.normalize(request.text) : request.text
|
95
|
+
|
82
96
|
generator = @engine.determine_intent(text)
|
83
97
|
begin
|
84
98
|
adapt_intent = PyCall.builtins.next(generator)
|
@@ -93,7 +107,10 @@ module Adapt
|
|
93
107
|
|
94
108
|
|
95
109
|
entities = app_intent.entities.map { |e| e.keys.first }.inject({}) do |h, entity|
|
96
|
-
h[entity] =
|
110
|
+
h[entity] = {
|
111
|
+
value: adapt_intent[entity]
|
112
|
+
}
|
113
|
+
|
97
114
|
h
|
98
115
|
end
|
99
116
|
|
data/lib/adapt/version.rb
CHANGED
data/lib/adapt-charyf.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'charyf'
|
2
|
+
require 'i18n'
|
3
|
+
|
2
4
|
require_relative 'adapt/processor'
|
3
5
|
|
4
6
|
module Adapt
|
@@ -6,16 +8,21 @@ module Adapt
|
|
6
8
|
|
7
9
|
generators do
|
8
10
|
require_relative 'adapt/generators/intent/intent_generator'
|
11
|
+
require_relative 'adapt/generators/install/install_generator'
|
9
12
|
end
|
10
13
|
|
11
14
|
config.generators.skill_hooks :intents, :adapt => true
|
12
15
|
|
16
|
+
# If unset, I18n locale will be used
|
17
|
+
config.locale = nil
|
18
|
+
config.lookup_paths = []
|
19
|
+
|
13
20
|
end
|
14
21
|
|
15
22
|
extend self
|
16
23
|
|
17
|
-
def
|
18
|
-
|
24
|
+
def config
|
25
|
+
Extension.config
|
19
26
|
end
|
20
27
|
|
21
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adapt-charyf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Ludvigh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: charyf
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.0.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: i18n
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.9'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.9'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,8 +127,12 @@ files:
|
|
113
127
|
- bin/console
|
114
128
|
- bin/setup
|
115
129
|
- lib/adapt-charyf.rb
|
130
|
+
- lib/adapt/generators/install/install_generator.rb
|
131
|
+
- lib/adapt/generators/install/templates/config/initializers/adapt.rb.tt
|
116
132
|
- lib/adapt/generators/intent/intent_generator.rb
|
117
133
|
- lib/adapt/generators/intent/templates/intents/adapt/routing.adapt.rb.tt
|
134
|
+
- lib/adapt/helpers/en_parser.rb
|
135
|
+
- lib/adapt/helpers/parser.rb
|
118
136
|
- lib/adapt/processor.rb
|
119
137
|
- lib/adapt/routing_builder.rb
|
120
138
|
- lib/adapt/version.rb
|