megahal 1.0.3 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +14 -6
- data/Gemfile +11 -11
- data/Gemfile.lock +119 -76
- data/README.md +3 -2
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/lib/megahal/megahal.rb +49 -28
- data/megahal.gemspec +56 -56
- data/spec/megahal_spec.rb +13 -11
- metadata +30 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 58f2fe588db7aefcccca3c46e04c5e9e4c3951e780ba8b32e0ea586b666bea54
|
4
|
+
data.tar.gz: 96b46712bbaabe8ac310d59a199a995b73f2f1913aa07ab553c619b4cde753e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fdbc98aa8e3155af74dc3063c1445a04041682efc5544febbf978dfb046a161fe7b6ddb675a4438d739b5ff4a5f7640f5a6587981d809d53cebd245e99c0620
|
7
|
+
data.tar.gz: 1e3ef6b5dd6879bbfcdad235f4b471ff5d3b1169b2aa7dbd5c5550dfd3de4f7b3ad94142ae0f835a094213acea4fce6b453148a61c4fac0f29c1a2a766892c56
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,23 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [v2.0.0](https://github.com/jasonhutchens/megahal/tree/v2.0.0) (2016-04-06)
|
4
|
+
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v1.0.4...v2.0.0)
|
5
|
+
|
6
|
+
**Closed issues:**
|
7
|
+
|
8
|
+
- passing command-line arguments without interactive console [\#2](https://github.com/jasonhutchens/megahal/issues/2)
|
9
|
+
|
10
|
+
**Merged pull requests:**
|
11
|
+
|
12
|
+
- Update dependencies [\#3](https://github.com/jasonhutchens/megahal/pull/3) ([robbyoconnor](https://github.com/robbyoconnor))
|
13
|
+
|
14
|
+
## [v1.0.4](https://github.com/jasonhutchens/megahal/tree/v1.0.4) (2015-10-03)
|
15
|
+
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v1.0.3...v1.0.4)
|
4
16
|
|
17
|
+
## [v1.0.3](https://github.com/jasonhutchens/megahal/tree/v1.0.3) (2015-05-26)
|
5
18
|
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v1.0.2...v1.0.3)
|
6
19
|
|
7
20
|
## [v1.0.2](https://github.com/jasonhutchens/megahal/tree/v1.0.2) (2015-05-26)
|
8
|
-
|
9
21
|
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v1.0.1...v1.0.2)
|
10
22
|
|
11
23
|
**Closed issues:**
|
@@ -13,19 +25,15 @@
|
|
13
25
|
- Test Issue [\#1](https://github.com/jasonhutchens/megahal/issues/1)
|
14
26
|
|
15
27
|
## [v1.0.1](https://github.com/jasonhutchens/megahal/tree/v1.0.1) (2014-12-22)
|
16
|
-
|
17
28
|
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v1.0.0...v1.0.1)
|
18
29
|
|
19
30
|
## [v1.0.0](https://github.com/jasonhutchens/megahal/tree/v1.0.0) (2014-12-17)
|
20
|
-
|
21
31
|
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v0.5.0...v1.0.0)
|
22
32
|
|
23
33
|
## [v0.5.0](https://github.com/jasonhutchens/megahal/tree/v0.5.0) (2014-12-17)
|
24
|
-
|
25
34
|
[Full Changelog](https://github.com/jasonhutchens/megahal/compare/v0.4.0...v0.5.0)
|
26
35
|
|
27
36
|
## [v0.4.0](https://github.com/jasonhutchens/megahal/tree/v0.4.0) (2014-12-17)
|
28
37
|
|
29
38
|
|
30
|
-
|
31
39
|
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
data/Gemfile
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'sooth', '~>
|
4
|
-
gem 'highline', '~>
|
5
|
-
gem 'ruby-progressbar', '~> 1.
|
6
|
-
gem 'rubyzip', '~>
|
3
|
+
gem 'sooth', '~> 2.3'
|
4
|
+
gem 'highline', '~> 2.0'
|
5
|
+
gem 'ruby-progressbar', '~> 1.9'
|
6
|
+
gem 'rubyzip', '~> 2.0'
|
7
7
|
gem 'cld', '~> 0.7'
|
8
8
|
|
9
9
|
group :development do
|
10
|
-
gem 'rspec', '~> 3.
|
11
|
-
gem 'yard', '~> 0.
|
12
|
-
gem 'rdoc', '~>
|
10
|
+
gem 'rspec', '~> 3.10'
|
11
|
+
gem 'yard', '~> 0.9'
|
12
|
+
gem 'rdoc', '~> 6.3'
|
13
13
|
gem 'bundler', '~> 1.7'
|
14
|
-
gem '
|
15
|
-
gem 'simplecov', '~> 0.
|
16
|
-
gem 'byebug', '~>
|
17
|
-
gem 'github_changelog_generator', '~> 1.
|
14
|
+
gem 'juwelier', '~> 2.4'
|
15
|
+
gem 'simplecov', '~> 0.21'
|
16
|
+
gem 'byebug', '~> 11.1'
|
17
|
+
gem 'github_changelog_generator', '~> 1.15'
|
18
18
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,99 +1,142 @@
|
|
1
1
|
GEM
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
activesupport (6.1.0)
|
5
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
6
|
+
i18n (>= 1.6, < 2)
|
7
|
+
minitest (>= 5.1)
|
8
|
+
tzinfo (~> 2.0)
|
9
|
+
zeitwerk (~> 2.3)
|
10
|
+
addressable (2.7.0)
|
11
|
+
public_suffix (>= 2.0.2, < 5.0)
|
12
|
+
builder (3.2.4)
|
13
|
+
byebug (11.1.3)
|
14
|
+
cld (0.8.0)
|
9
15
|
ffi
|
10
|
-
|
11
|
-
columnize (0.9.0)
|
16
|
+
concurrent-ruby (1.1.7)
|
12
17
|
descendants_tracker (0.0.4)
|
13
18
|
thread_safe (~> 0.3, >= 0.3.1)
|
14
|
-
diff-lcs (1.
|
15
|
-
docile (1.
|
16
|
-
faraday (
|
19
|
+
diff-lcs (1.4.4)
|
20
|
+
docile (1.3.4)
|
21
|
+
faraday (1.3.0)
|
22
|
+
faraday-net_http (~> 1.0)
|
17
23
|
multipart-post (>= 1.2, < 3)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
24
|
+
ruby2_keywords
|
25
|
+
faraday-http-cache (2.2.0)
|
26
|
+
faraday (>= 0.8)
|
27
|
+
faraday-net_http (1.0.0)
|
28
|
+
ffi (1.14.2)
|
29
|
+
git (1.8.1)
|
30
|
+
rchardet (~> 1.8)
|
31
|
+
github_api (0.19.0)
|
32
|
+
addressable (~> 2.4)
|
22
33
|
descendants_tracker (~> 0.0.4)
|
23
|
-
faraday (
|
24
|
-
hashie (>= 3.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
faraday (>= 0.8, < 2)
|
35
|
+
hashie (~> 3.5, >= 3.5.2)
|
36
|
+
oauth2 (~> 1.0)
|
37
|
+
github_changelog_generator (1.15.2)
|
38
|
+
activesupport
|
39
|
+
faraday-http-cache
|
40
|
+
multi_json
|
41
|
+
octokit (~> 4.6)
|
42
|
+
rainbow (>= 2.2.1)
|
43
|
+
rake (>= 10.0)
|
44
|
+
retriable (~> 3.0)
|
45
|
+
hashie (3.6.0)
|
46
|
+
highline (2.0.3)
|
47
|
+
i18n (1.8.7)
|
48
|
+
concurrent-ruby (~> 1.0)
|
49
|
+
juwelier (2.4.9)
|
34
50
|
builder
|
35
|
-
bundler
|
36
|
-
git
|
51
|
+
bundler
|
52
|
+
git
|
37
53
|
github_api
|
38
|
-
highline
|
39
|
-
|
54
|
+
highline
|
55
|
+
kamelcase (~> 0)
|
56
|
+
nokogiri
|
57
|
+
psych
|
40
58
|
rake
|
41
59
|
rdoc
|
42
|
-
|
43
|
-
jwt (
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
60
|
+
semver2
|
61
|
+
jwt (2.2.2)
|
62
|
+
kamelcase (0.0.2)
|
63
|
+
semver2 (~> 3)
|
64
|
+
mini_portile2 (2.5.0)
|
65
|
+
minitest (5.14.2)
|
66
|
+
multi_json (1.15.0)
|
67
|
+
multi_xml (0.6.0)
|
68
|
+
multipart-post (2.1.1)
|
69
|
+
nokogiri (1.11.0)
|
70
|
+
mini_portile2 (~> 2.5.0)
|
71
|
+
racc (~> 1.4)
|
72
|
+
oauth2 (1.4.4)
|
73
|
+
faraday (>= 0.8, < 2.0)
|
74
|
+
jwt (>= 1.0, < 3.0)
|
53
75
|
multi_json (~> 1.3)
|
54
76
|
multi_xml (~> 0.5)
|
55
|
-
rack (
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
77
|
+
rack (>= 1.2, < 3)
|
78
|
+
octokit (4.20.0)
|
79
|
+
faraday (>= 0.9)
|
80
|
+
sawyer (~> 0.8.0, >= 0.5.3)
|
81
|
+
psych (3.3.0)
|
82
|
+
public_suffix (4.0.6)
|
83
|
+
racc (1.5.2)
|
84
|
+
rack (2.2.3)
|
85
|
+
rainbow (3.0.0)
|
86
|
+
rake (13.0.3)
|
87
|
+
rchardet (1.8.0)
|
88
|
+
rdoc (6.3.0)
|
89
|
+
retriable (3.1.2)
|
90
|
+
rspec (3.10.0)
|
91
|
+
rspec-core (~> 3.10.0)
|
92
|
+
rspec-expectations (~> 3.10.0)
|
93
|
+
rspec-mocks (~> 3.10.0)
|
94
|
+
rspec-core (3.10.1)
|
95
|
+
rspec-support (~> 3.10.0)
|
96
|
+
rspec-expectations (3.10.1)
|
66
97
|
diff-lcs (>= 1.2.0, < 2.0)
|
67
|
-
rspec-support (~> 3.
|
68
|
-
rspec-mocks (3.
|
98
|
+
rspec-support (~> 3.10.0)
|
99
|
+
rspec-mocks (3.10.1)
|
69
100
|
diff-lcs (>= 1.2.0, < 2.0)
|
70
|
-
rspec-support (~> 3.
|
71
|
-
rspec-support (3.
|
72
|
-
ruby-progressbar (1.
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
101
|
+
rspec-support (~> 3.10.0)
|
102
|
+
rspec-support (3.10.1)
|
103
|
+
ruby-progressbar (1.11.0)
|
104
|
+
ruby2_keywords (0.0.2)
|
105
|
+
rubyzip (2.3.0)
|
106
|
+
sawyer (0.8.2)
|
107
|
+
addressable (>= 2.3.5)
|
108
|
+
faraday (> 0.8, < 2.0)
|
109
|
+
semver2 (3.4.2)
|
110
|
+
simplecov (0.21.0)
|
111
|
+
docile (~> 1.1)
|
112
|
+
simplecov-html (~> 0.11)
|
113
|
+
simplecov_json_formatter (~> 0.1)
|
114
|
+
simplecov-html (0.12.3)
|
115
|
+
simplecov_json_formatter (0.1.2)
|
116
|
+
sooth (2.3.0)
|
117
|
+
thread_safe (0.3.6)
|
118
|
+
tzinfo (2.0.4)
|
119
|
+
concurrent-ruby (~> 1.0)
|
120
|
+
yard (0.9.26)
|
121
|
+
zeitwerk (2.4.2)
|
82
122
|
|
83
123
|
PLATFORMS
|
84
124
|
ruby
|
85
125
|
|
86
126
|
DEPENDENCIES
|
87
127
|
bundler (~> 1.7)
|
88
|
-
byebug (~>
|
128
|
+
byebug (~> 11.1)
|
89
129
|
cld (~> 0.7)
|
90
|
-
github_changelog_generator (~> 1.
|
91
|
-
highline (~>
|
92
|
-
|
93
|
-
rdoc (~>
|
94
|
-
rspec (~> 3.
|
95
|
-
ruby-progressbar (~> 1.
|
96
|
-
rubyzip (~>
|
97
|
-
simplecov (~> 0.
|
98
|
-
sooth (~>
|
99
|
-
yard (~> 0.
|
130
|
+
github_changelog_generator (~> 1.15)
|
131
|
+
highline (~> 2.0)
|
132
|
+
juwelier (~> 2.4)
|
133
|
+
rdoc (~> 6.3)
|
134
|
+
rspec (~> 3.10)
|
135
|
+
ruby-progressbar (~> 1.9)
|
136
|
+
rubyzip (~> 2.0)
|
137
|
+
simplecov (~> 0.21)
|
138
|
+
sooth (~> 2.3)
|
139
|
+
yard (~> 0.9)
|
140
|
+
|
141
|
+
BUNDLED WITH
|
142
|
+
1.17.3
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/megahal.svg)](http://badge.fury.io/rb/megahal)
|
2
|
-
[![Dependency Status](https://gemnasium.com/jasonhutchens/megahal.png)](https://gemnasium.com/jasonhutchens/megahal)
|
3
2
|
[![Codeship Status for jasonhutchens/megahal](https://codeship.com/projects/8f43e890-e5b4-0132-1716-266c7b4e6c8b/status?branch=master)](https://codeship.com/projects/82076)
|
4
3
|
|
5
4
|
MegaHAL
|
@@ -7,6 +6,8 @@ MegaHAL
|
|
7
6
|
|
8
7
|
MegaHAL is a learning chatterbot.
|
9
8
|
|
9
|
+
![Sherlock Holmes](https://www.kranzky.com/img/portfolio/megahal.png)
|
10
|
+
|
10
11
|
You can run it as a command-line application, or embed it in your own
|
11
12
|
application and make calls to it via a simple
|
12
13
|
[API](http://www.rubydoc.info/gems/megahal/). For example, see
|
@@ -184,4 +185,4 @@ Have fun!
|
|
184
185
|
Copyright
|
185
186
|
---------
|
186
187
|
|
187
|
-
Copyright (c)
|
188
|
+
Copyright (c) 2018 Jason Hutchens. See UNLICENSE for further details.
|
data/Rakefile
CHANGED
@@ -11,8 +11,8 @@ rescue Bundler::BundlerError => e
|
|
11
11
|
end
|
12
12
|
require 'rake'
|
13
13
|
|
14
|
-
require '
|
15
|
-
|
14
|
+
require 'juwelier'
|
15
|
+
Juwelier::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
17
|
gem.name = "megahal"
|
18
18
|
gem.homepage = "http://github.com/jasonhutchens/megahal"
|
@@ -21,10 +21,10 @@ Jeweler::Tasks.new do |gem|
|
|
21
21
|
gem.description = %Q{Have a weird conversation with a computer.}
|
22
22
|
gem.email = "jasonhutchens@gmail.com"
|
23
23
|
gem.authors = ["Jason Hutchens"]
|
24
|
-
gem.required_ruby_version = "
|
24
|
+
gem.required_ruby_version = ">= 2.1"
|
25
25
|
# dependencies defined in Gemfile
|
26
26
|
end
|
27
|
-
|
27
|
+
Juwelier::RubygemsDotOrgTasks.new
|
28
28
|
|
29
29
|
require 'rspec/core'
|
30
30
|
require 'rspec/core/rake_task'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.3.0
|
data/lib/megahal/megahal.rb
CHANGED
@@ -31,6 +31,7 @@ class MegaHAL
|
|
31
31
|
@case.clear
|
32
32
|
@punc.clear
|
33
33
|
@dictionary = { "<error>" => 0, "<fence>" => 1, "<blank>" => 2 }
|
34
|
+
@brain = {}
|
34
35
|
nil
|
35
36
|
end
|
36
37
|
|
@@ -112,11 +113,13 @@ class MegaHAL
|
|
112
113
|
bar.total = 6 unless bar.nil?
|
113
114
|
Zip::File.open(filename, Zip::File::CREATE) do |zipfile|
|
114
115
|
zipfile.get_output_stream("dictionary") do |file|
|
115
|
-
|
116
|
-
version: '
|
116
|
+
data = {
|
117
|
+
version: 'MH11',
|
117
118
|
learning: @learning,
|
119
|
+
brain: @brain,
|
118
120
|
dictionary: @dictionary
|
119
|
-
}
|
121
|
+
}
|
122
|
+
file.write(Marshal::dump(data))
|
120
123
|
end
|
121
124
|
bar.increment unless bar.nil?
|
122
125
|
[:seed, :fore, :back, :case, :punc].each do |name|
|
@@ -135,10 +138,11 @@ class MegaHAL
|
|
135
138
|
def load(filename, bar = nil)
|
136
139
|
bar.total = 6 unless bar.nil?
|
137
140
|
Zip::File.open(filename) do |zipfile|
|
138
|
-
data =
|
139
|
-
raise "bad version" unless data[
|
140
|
-
@learning = data[
|
141
|
-
@
|
141
|
+
data = Marshal::load(zipfile.find_entry("dictionary").get_input_stream.read)
|
142
|
+
raise "bad version" unless data[:version] == "MH11"
|
143
|
+
@learning = data[:learning]
|
144
|
+
@brain = data[:brain]
|
145
|
+
@dictionary = data[:dictionary]
|
142
146
|
bar.increment unless bar.nil?
|
143
147
|
[:seed, :fore, :back, :case, :punc].each do |name|
|
144
148
|
tmp = _get_tmp_filename(name)
|
@@ -195,9 +199,11 @@ class MegaHAL
|
|
195
199
|
prev = 1
|
196
200
|
(norm_symbols + [1]).each do |norm|
|
197
201
|
context = [prev, 2]
|
198
|
-
@
|
202
|
+
id = @brain[context.dup] ||= @brain.length
|
203
|
+
@seed.observe(id, norm)
|
199
204
|
context = [2, norm]
|
200
|
-
@
|
205
|
+
id = @brain[context.dup] ||= @brain.length
|
206
|
+
@seed.observe(id, prev)
|
201
207
|
prev = norm
|
202
208
|
end
|
203
209
|
|
@@ -207,11 +213,13 @@ class MegaHAL
|
|
207
213
|
# special <fence> symbol (which has ID 1) is used to delimit the utterance.
|
208
214
|
context = [1, 1]
|
209
215
|
norm_symbols.each do |norm|
|
210
|
-
@
|
216
|
+
id = @brain[context.dup] ||= @brain.length
|
217
|
+
@fore.observe(id, norm)
|
211
218
|
context << norm
|
212
219
|
context.shift
|
213
220
|
end
|
214
|
-
@
|
221
|
+
id = @brain[context.dup] ||= @brain.length
|
222
|
+
@fore.observe(id, 1)
|
215
223
|
|
216
224
|
# The @back model is similar to the @fore model; it simply operates in the
|
217
225
|
# opposite direction. This is how the original MegaHAL was able to generate
|
@@ -220,11 +228,13 @@ class MegaHAL
|
|
220
228
|
# the gaps towards the beginning of the sentence.
|
221
229
|
context = [1, 1]
|
222
230
|
norm_symbols.reverse.each do |norm|
|
223
|
-
@
|
231
|
+
id = @brain[context.dup] ||= @brain.length
|
232
|
+
@back.observe(id, norm)
|
224
233
|
context << norm
|
225
234
|
context.shift
|
226
235
|
end
|
227
|
-
@
|
236
|
+
id = @brain[context.dup] ||= @brain.length
|
237
|
+
@back.observe(id, 1)
|
228
238
|
|
229
239
|
# The previous three models were all learning the sequence of norms, which
|
230
240
|
# are capitalised words. When we generate a reply, we want to rewrite it so
|
@@ -233,7 +243,8 @@ class MegaHAL
|
|
233
243
|
context = [1, 1]
|
234
244
|
word_symbols.zip(norm_symbols).each do |word, norm|
|
235
245
|
context[1] = norm
|
236
|
-
@
|
246
|
+
id = @brain[context.dup] ||= @brain.length
|
247
|
+
@case.observe(id, word)
|
237
248
|
context[0] = word
|
238
249
|
end
|
239
250
|
|
@@ -245,7 +256,8 @@ class MegaHAL
|
|
245
256
|
punc_symbols.zip(word_symbols + [1]).each do |punc, word|
|
246
257
|
context << word
|
247
258
|
context.shift
|
248
|
-
@
|
259
|
+
id = @brain[context.dup] ||= @brain.length
|
260
|
+
@punc.observe(id, punc)
|
249
261
|
end
|
250
262
|
end
|
251
263
|
|
@@ -294,10 +306,12 @@ class MegaHAL
|
|
294
306
|
# Use the @seed model to find two contexts that contain the keyword.
|
295
307
|
contexts = [[2, keyword], [keyword, 2]]
|
296
308
|
contexts.map! do |context|
|
297
|
-
|
309
|
+
id = @brain[context.dup] ||= @brain.length
|
310
|
+
count = @seed.count(id)
|
298
311
|
if count > 0
|
299
|
-
|
300
|
-
|
312
|
+
id = @brain[context.dup] ||= @brain.length
|
313
|
+
limit = @seed.count(id)
|
314
|
+
context[context.index(2)] = @seed.select(id, limit)
|
301
315
|
context
|
302
316
|
else
|
303
317
|
nil
|
@@ -329,13 +343,15 @@ class MegaHAL
|
|
329
343
|
def _random_walk(model, static_context, keyword_symbols)
|
330
344
|
context = static_context.dup
|
331
345
|
results = []
|
332
|
-
|
346
|
+
id = @brain[context.dup] ||= @brain.length
|
347
|
+
return [] if model.count(id) == 0
|
333
348
|
local_keywords = keyword_symbols.dup
|
334
349
|
loop do
|
335
350
|
symbol = 0
|
336
351
|
10.times do
|
337
|
-
|
338
|
-
|
352
|
+
id = @brain[context.dup] ||= @brain.length
|
353
|
+
limit = rand(model.count(id)) + 1
|
354
|
+
symbol = model.select(id, limit)
|
339
355
|
if local_keywords.include?(symbol)
|
340
356
|
local_keywords.delete(symbol)
|
341
357
|
break
|
@@ -373,7 +389,8 @@ class MegaHAL
|
|
373
389
|
context = [1, 1]
|
374
390
|
utterance.each do |norm|
|
375
391
|
if keyword_symbols.include?(norm)
|
376
|
-
|
392
|
+
id = @brain[context.dup] ||= @brain.length
|
393
|
+
surprise = @fore.surprise(id, norm)
|
377
394
|
score += surprise unless surprise.nil?
|
378
395
|
end
|
379
396
|
context << norm
|
@@ -383,7 +400,8 @@ class MegaHAL
|
|
383
400
|
context = [1, 1]
|
384
401
|
utterance.reverse.each do |norm|
|
385
402
|
if keyword_symbols.include?(norm)
|
386
|
-
|
403
|
+
id = @brain[context.dup] ||= @brain.length
|
404
|
+
surprise = @back.surprise(id, norm)
|
387
405
|
score += surprise unless surprise.nil?
|
388
406
|
end
|
389
407
|
context << norm
|
@@ -429,16 +447,18 @@ class MegaHAL
|
|
429
447
|
# what was observed previously.
|
430
448
|
context[0] = (i == 0) ? 1 : word_symbols[i-1]
|
431
449
|
context[1] = norm_symbols[i]
|
432
|
-
|
450
|
+
id = @brain[context.dup] ||= @brain.length
|
451
|
+
count = @case.count(id)
|
433
452
|
unless failed = (count == 0)
|
434
453
|
limit = rand(count) + 1
|
435
|
-
word_symbols << @case.select(
|
454
|
+
word_symbols << @case.select(id, limit)
|
436
455
|
end
|
437
456
|
if (word_symbols.length == norm_symbols.length)
|
438
457
|
# We need to check that the final word has been previously observed.
|
439
458
|
context[0] = word_symbols.last
|
440
459
|
context[1] = 1
|
441
|
-
|
460
|
+
id = @brain[context.dup] ||= @brain.length
|
461
|
+
failed = (@punc.count(id) == 0)
|
442
462
|
end
|
443
463
|
if failed
|
444
464
|
retries += 1
|
@@ -458,8 +478,9 @@ class MegaHAL
|
|
458
478
|
(word_symbols + [1]).each do |word|
|
459
479
|
context << word
|
460
480
|
context.shift
|
461
|
-
|
462
|
-
|
481
|
+
id = @brain[context.dup] ||= @brain.length
|
482
|
+
limit = rand(@punc.count(id)) + 1
|
483
|
+
punc_symbols << @punc.select(id, limit)
|
463
484
|
end
|
464
485
|
|
465
486
|
# Finally we zip the word-separators and the words together, decode the
|
data/megahal.gemspec
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
# Generated by
|
1
|
+
# Generated by juwelier
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit
|
3
|
+
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: megahal
|
5
|
+
# stub: megahal 2.3.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name = "megahal"
|
9
|
-
s.version = "
|
8
|
+
s.name = "megahal".freeze
|
9
|
+
s.version = "2.3.0"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["Jason Hutchens"]
|
14
|
-
s.date = "
|
15
|
-
s.description = "Have a weird conversation with a computer."
|
16
|
-
s.email = "jasonhutchens@gmail.com"
|
17
|
-
s.executables = ["megahal"]
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Jason Hutchens".freeze]
|
14
|
+
s.date = "2021-01-04"
|
15
|
+
s.description = "Have a weird conversation with a computer.".freeze
|
16
|
+
s.email = "jasonhutchens@gmail.com".freeze
|
17
|
+
s.executables = ["megahal".freeze]
|
18
18
|
s.extra_rdoc_files = [
|
19
19
|
"CHANGELOG.md",
|
20
20
|
"README.md"
|
@@ -48,58 +48,58 @@ Gem::Specification.new do |s|
|
|
48
48
|
"spec/megahal_spec.rb",
|
49
49
|
"spec/spec_helper.rb"
|
50
50
|
]
|
51
|
-
s.homepage = "http://github.com/jasonhutchens/megahal"
|
52
|
-
s.licenses = ["UNLICENSE"]
|
53
|
-
s.required_ruby_version = Gem::Requirement.new("
|
54
|
-
s.rubygems_version = "
|
55
|
-
s.summary = "MegaHAL is a learning chatterbot."
|
51
|
+
s.homepage = "http://github.com/jasonhutchens/megahal".freeze
|
52
|
+
s.licenses = ["UNLICENSE".freeze]
|
53
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.1".freeze)
|
54
|
+
s.rubygems_version = "3.0.9".freeze
|
55
|
+
s.summary = "MegaHAL is a learning chatterbot.".freeze
|
56
56
|
|
57
57
|
if s.respond_to? :specification_version then
|
58
58
|
s.specification_version = 4
|
59
59
|
|
60
60
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
61
|
-
s.add_runtime_dependency(%q<sooth
|
62
|
-
s.add_runtime_dependency(%q<highline
|
63
|
-
s.add_runtime_dependency(%q<ruby-progressbar
|
64
|
-
s.add_runtime_dependency(%q<rubyzip
|
65
|
-
s.add_runtime_dependency(%q<cld
|
66
|
-
s.add_development_dependency(%q<rspec
|
67
|
-
s.add_development_dependency(%q<yard
|
68
|
-
s.add_development_dependency(%q<rdoc
|
69
|
-
s.add_development_dependency(%q<bundler
|
70
|
-
s.add_development_dependency(%q<
|
71
|
-
s.add_development_dependency(%q<simplecov
|
72
|
-
s.add_development_dependency(%q<byebug
|
73
|
-
s.add_development_dependency(%q<github_changelog_generator
|
61
|
+
s.add_runtime_dependency(%q<sooth>.freeze, ["~> 2.3"])
|
62
|
+
s.add_runtime_dependency(%q<highline>.freeze, ["~> 2.0"])
|
63
|
+
s.add_runtime_dependency(%q<ruby-progressbar>.freeze, ["~> 1.9"])
|
64
|
+
s.add_runtime_dependency(%q<rubyzip>.freeze, ["~> 2.0"])
|
65
|
+
s.add_runtime_dependency(%q<cld>.freeze, ["~> 0.7"])
|
66
|
+
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.10"])
|
67
|
+
s.add_development_dependency(%q<yard>.freeze, ["~> 0.9"])
|
68
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.3"])
|
69
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 1.7"])
|
70
|
+
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4"])
|
71
|
+
s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.21"])
|
72
|
+
s.add_development_dependency(%q<byebug>.freeze, ["~> 11.1"])
|
73
|
+
s.add_development_dependency(%q<github_changelog_generator>.freeze, ["~> 1.15"])
|
74
74
|
else
|
75
|
-
s.add_dependency(%q<sooth
|
76
|
-
s.add_dependency(%q<highline
|
77
|
-
s.add_dependency(%q<ruby-progressbar
|
78
|
-
s.add_dependency(%q<rubyzip
|
79
|
-
s.add_dependency(%q<cld
|
80
|
-
s.add_dependency(%q<rspec
|
81
|
-
s.add_dependency(%q<yard
|
82
|
-
s.add_dependency(%q<rdoc
|
83
|
-
s.add_dependency(%q<bundler
|
84
|
-
s.add_dependency(%q<
|
85
|
-
s.add_dependency(%q<simplecov
|
86
|
-
s.add_dependency(%q<byebug
|
87
|
-
s.add_dependency(%q<github_changelog_generator
|
75
|
+
s.add_dependency(%q<sooth>.freeze, ["~> 2.3"])
|
76
|
+
s.add_dependency(%q<highline>.freeze, ["~> 2.0"])
|
77
|
+
s.add_dependency(%q<ruby-progressbar>.freeze, ["~> 1.9"])
|
78
|
+
s.add_dependency(%q<rubyzip>.freeze, ["~> 2.0"])
|
79
|
+
s.add_dependency(%q<cld>.freeze, ["~> 0.7"])
|
80
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3.10"])
|
81
|
+
s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
|
82
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 6.3"])
|
83
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1.7"])
|
84
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4"])
|
85
|
+
s.add_dependency(%q<simplecov>.freeze, ["~> 0.21"])
|
86
|
+
s.add_dependency(%q<byebug>.freeze, ["~> 11.1"])
|
87
|
+
s.add_dependency(%q<github_changelog_generator>.freeze, ["~> 1.15"])
|
88
88
|
end
|
89
89
|
else
|
90
|
-
s.add_dependency(%q<sooth
|
91
|
-
s.add_dependency(%q<highline
|
92
|
-
s.add_dependency(%q<ruby-progressbar
|
93
|
-
s.add_dependency(%q<rubyzip
|
94
|
-
s.add_dependency(%q<cld
|
95
|
-
s.add_dependency(%q<rspec
|
96
|
-
s.add_dependency(%q<yard
|
97
|
-
s.add_dependency(%q<rdoc
|
98
|
-
s.add_dependency(%q<bundler
|
99
|
-
s.add_dependency(%q<
|
100
|
-
s.add_dependency(%q<simplecov
|
101
|
-
s.add_dependency(%q<byebug
|
102
|
-
s.add_dependency(%q<github_changelog_generator
|
90
|
+
s.add_dependency(%q<sooth>.freeze, ["~> 2.3"])
|
91
|
+
s.add_dependency(%q<highline>.freeze, ["~> 2.0"])
|
92
|
+
s.add_dependency(%q<ruby-progressbar>.freeze, ["~> 1.9"])
|
93
|
+
s.add_dependency(%q<rubyzip>.freeze, ["~> 2.0"])
|
94
|
+
s.add_dependency(%q<cld>.freeze, ["~> 0.7"])
|
95
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3.10"])
|
96
|
+
s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
|
97
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 6.3"])
|
98
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 1.7"])
|
99
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2.4"])
|
100
|
+
s.add_dependency(%q<simplecov>.freeze, ["~> 0.21"])
|
101
|
+
s.add_dependency(%q<byebug>.freeze, ["~> 11.1"])
|
102
|
+
s.add_dependency(%q<github_changelog_generator>.freeze, ["~> 1.15"])
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
data/spec/megahal_spec.rb
CHANGED
@@ -20,22 +20,24 @@ describe MegaHAL do
|
|
20
20
|
|
21
21
|
describe "#clear" do
|
22
22
|
it "clears all internal state" do
|
23
|
-
expect(megahal.instance_variables.length).to eq(
|
23
|
+
expect(megahal.instance_variables.length).to eq(8)
|
24
24
|
megahal.clear
|
25
25
|
megahal.reply("one two three four five")
|
26
26
|
expect(megahal.instance_variable_get(:@dictionary).length).to eq(15)
|
27
|
-
expect(megahal.instance_variable_get(:@
|
28
|
-
expect(megahal.instance_variable_get(:@
|
29
|
-
expect(megahal.instance_variable_get(:@
|
30
|
-
expect(megahal.instance_variable_get(:@
|
31
|
-
expect(megahal.instance_variable_get(:@
|
27
|
+
expect(megahal.instance_variable_get(:@brain).length).to eq(33)
|
28
|
+
expect(megahal.instance_variable_get(:@seed).count(1)).to be > 0
|
29
|
+
expect(megahal.instance_variable_get(:@fore).count(0)).to be > 0
|
30
|
+
expect(megahal.instance_variable_get(:@back).count(0)).to be > 0
|
31
|
+
expect(megahal.instance_variable_get(:@case).count(13)).to be > 0
|
32
|
+
expect(megahal.instance_variable_get(:@punc).count(27)).to be > 0
|
32
33
|
megahal.clear
|
33
34
|
expect(megahal.instance_variable_get(:@dictionary).length).to eq(3)
|
34
|
-
expect(megahal.instance_variable_get(:@
|
35
|
-
expect(megahal.instance_variable_get(:@
|
36
|
-
expect(megahal.instance_variable_get(:@
|
37
|
-
expect(megahal.instance_variable_get(:@
|
38
|
-
expect(megahal.instance_variable_get(:@
|
35
|
+
expect(megahal.instance_variable_get(:@brain).length).to eq(0)
|
36
|
+
expect(megahal.instance_variable_get(:@seed).count(1)).to eq(0)
|
37
|
+
expect(megahal.instance_variable_get(:@fore).count(0)).to eq(0)
|
38
|
+
expect(megahal.instance_variable_get(:@back).count(0)).to eq(0)
|
39
|
+
expect(megahal.instance_variable_get(:@case).count(13)).to eq(0)
|
40
|
+
expect(megahal.instance_variable_get(:@punc).count(27)).to eq(0)
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: megahal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Hutchens
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sooth
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.3'
|
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.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: highline
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.0'
|
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.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: ruby-progressbar
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.9'
|
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: '1.
|
54
|
+
version: '1.9'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubyzip
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '2.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '2.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: cld
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,42 +86,42 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.10'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
96
|
+
version: '3.10'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: yard
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
103
|
+
version: '0.9'
|
104
104
|
type: :development
|
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: '0.
|
110
|
+
version: '0.9'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rdoc
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '6.3'
|
118
118
|
type: :development
|
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: '6.3'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: bundler
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,61 +137,61 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '1.7'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
140
|
+
name: juwelier
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: '2.
|
145
|
+
version: '2.4'
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: '2.
|
152
|
+
version: '2.4'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: simplecov
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: '0.
|
159
|
+
version: '0.21'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: '0.
|
166
|
+
version: '0.21'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: byebug
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
173
|
+
version: '11.1'
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
180
|
+
version: '11.1'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: github_changelog_generator
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - "~>"
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: '1.
|
187
|
+
version: '1.15'
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: '1.
|
194
|
+
version: '1.15'
|
195
195
|
description: Have a weird conversation with a computer.
|
196
196
|
email: jasonhutchens@gmail.com
|
197
197
|
executables:
|
@@ -232,13 +232,13 @@ homepage: http://github.com/jasonhutchens/megahal
|
|
232
232
|
licenses:
|
233
233
|
- UNLICENSE
|
234
234
|
metadata: {}
|
235
|
-
post_install_message:
|
235
|
+
post_install_message:
|
236
236
|
rdoc_options: []
|
237
237
|
require_paths:
|
238
238
|
- lib
|
239
239
|
required_ruby_version: !ruby/object:Gem::Requirement
|
240
240
|
requirements:
|
241
|
-
- - "
|
241
|
+
- - ">="
|
242
242
|
- !ruby/object:Gem::Version
|
243
243
|
version: '2.1'
|
244
244
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -247,9 +247,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
247
|
- !ruby/object:Gem::Version
|
248
248
|
version: '0'
|
249
249
|
requirements: []
|
250
|
-
|
251
|
-
|
252
|
-
signing_key:
|
250
|
+
rubygems_version: 3.0.9
|
251
|
+
signing_key:
|
253
252
|
specification_version: 4
|
254
253
|
summary: MegaHAL is a learning chatterbot.
|
255
254
|
test_files: []
|