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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 460df0ded882d166f22522562d7d4302e8b03867
4
- data.tar.gz: 86fcfe6ed57a32f5a5b540a9ec55746b7e304d02
2
+ SHA256:
3
+ metadata.gz: 58f2fe588db7aefcccca3c46e04c5e9e4c3951e780ba8b32e0ea586b666bea54
4
+ data.tar.gz: 96b46712bbaabe8ac310d59a199a995b73f2f1913aa07ab553c619b4cde753e2
5
5
  SHA512:
6
- metadata.gz: c5e397fe6941529a424dc2c87464e8f387beadebbce0f2e4b7c479981d5d348fe00840c6bca05fbb1d808a034d2bf8b45804e9b6b01b1044ae0448340cb6b55f
7
- data.tar.gz: 67c8f1272b4a88338b6530146aeac03e580d27013f924eea98b870313810c6bb35d09950f673ce57dc7e75a411145a525a47999ab9e4f8b6d9f9b1e9ca773efb
6
+ metadata.gz: 3fdbc98aa8e3155af74dc3063c1445a04041682efc5544febbf978dfb046a161fe7b6ddb675a4438d739b5ff4a5f7640f5a6587981d809d53cebd245e99c0620
7
+ data.tar.gz: 1e3ef6b5dd6879bbfcdad235f4b471ff5d3b1169b2aa7dbd5c5550dfd3de4f7b3ad94142ae0f835a094213acea4fce6b453148a61c4fac0f29c1a2a766892c56
@@ -1,11 +1,23 @@
1
1
  # Change Log
2
2
 
3
- ## [v1.0.3](https://github.com/jasonhutchens/megahal/tree/v1.0.3) (2015-05-26)
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', '~> 1.0'
4
- gem 'highline', '~> 1.7'
5
- gem 'ruby-progressbar', '~> 1.7'
6
- gem 'rubyzip', '~> 1.1'
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.2'
11
- gem 'yard', '~> 0.8'
12
- gem 'rdoc', '~> 4.1'
10
+ gem 'rspec', '~> 3.10'
11
+ gem 'yard', '~> 0.9'
12
+ gem 'rdoc', '~> 6.3'
13
13
  gem 'bundler', '~> 1.7'
14
- gem 'jeweler', '~> 2.0'
15
- gem 'simplecov', '~> 0.10'
16
- gem 'byebug', '~> 5.0'
17
- gem 'github_changelog_generator', '~> 1.4'
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
@@ -1,99 +1,142 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- addressable (2.3.8)
5
- builder (3.2.2)
6
- byebug (5.0.0)
7
- columnize (= 0.9.0)
8
- cld (0.7.0)
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
- colorize (0.7.7)
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.2.5)
15
- docile (1.1.5)
16
- faraday (0.9.1)
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
- ffi (1.9.8)
19
- git (1.2.9.1)
20
- github_api (0.12.3)
21
- addressable (~> 2.3)
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 (~> 0.8, < 0.10)
24
- hashie (>= 3.3)
25
- multi_json (>= 1.7.5, < 2.0)
26
- nokogiri (~> 1.6.3)
27
- oauth2
28
- github_changelog_generator (1.4.1)
29
- colorize (~> 0.7)
30
- github_api (~> 0.12)
31
- hashie (3.4.1)
32
- highline (1.7.2)
33
- jeweler (2.0.1)
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 (>= 1.0)
36
- git (>= 1.2.5)
51
+ bundler
52
+ git
37
53
  github_api
38
- highline (>= 1.6.15)
39
- nokogiri (>= 1.5.10)
54
+ highline
55
+ kamelcase (~> 0)
56
+ nokogiri
57
+ psych
40
58
  rake
41
59
  rdoc
42
- json (1.8.2)
43
- jwt (1.5.0)
44
- mini_portile (0.6.2)
45
- multi_json (1.11.0)
46
- multi_xml (0.5.5)
47
- multipart-post (2.0.0)
48
- nokogiri (1.6.6.2)
49
- mini_portile (~> 0.6.0)
50
- oauth2 (1.0.0)
51
- faraday (>= 0.8, < 0.10)
52
- jwt (~> 1.0)
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 (~> 1.2)
56
- rack (1.6.1)
57
- rake (10.4.2)
58
- rdoc (4.2.0)
59
- rspec (3.2.0)
60
- rspec-core (~> 3.2.0)
61
- rspec-expectations (~> 3.2.0)
62
- rspec-mocks (~> 3.2.0)
63
- rspec-core (3.2.3)
64
- rspec-support (~> 3.2.0)
65
- rspec-expectations (3.2.1)
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.2.0)
68
- rspec-mocks (3.2.1)
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.2.0)
71
- rspec-support (3.2.2)
72
- ruby-progressbar (1.7.5)
73
- rubyzip (1.1.7)
74
- simplecov (0.10.0)
75
- docile (~> 1.1.0)
76
- json (~> 1.8)
77
- simplecov-html (~> 0.10.0)
78
- simplecov-html (0.10.0)
79
- sooth (1.0.2)
80
- thread_safe (0.3.5)
81
- yard (0.8.7.6)
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 (~> 5.0)
128
+ byebug (~> 11.1)
89
129
  cld (~> 0.7)
90
- github_changelog_generator (~> 1.4)
91
- highline (~> 1.7)
92
- jeweler (~> 2.0)
93
- rdoc (~> 4.1)
94
- rspec (~> 3.2)
95
- ruby-progressbar (~> 1.7)
96
- rubyzip (~> 1.1)
97
- simplecov (~> 0.10)
98
- sooth (~> 1.0)
99
- yard (~> 0.8)
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) 2014 Jason Hutchens. See UNLICENSE for further details.
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 'jeweler'
15
- Jeweler::Tasks.new do |gem|
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 = "~> 2.1"
24
+ gem.required_ruby_version = ">= 2.1"
25
25
  # dependencies defined in Gemfile
26
26
  end
27
- Jeweler::RubygemsDotOrgTasks.new
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.0.3
1
+ 2.3.0
@@ -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
- file.write({
116
- version: 'MH10',
116
+ data = {
117
+ version: 'MH11',
117
118
  learning: @learning,
119
+ brain: @brain,
118
120
  dictionary: @dictionary
119
- }.to_json)
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 = JSON.parse(zipfile.find_entry("dictionary").get_input_stream.read)
139
- raise "bad version" unless data['version'] == "MH10"
140
- @learning = data['learning']
141
- @dictionary = data['dictionary']
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
- @seed.observe(context, norm)
202
+ id = @brain[context.dup] ||= @brain.length
203
+ @seed.observe(id, norm)
199
204
  context = [2, norm]
200
- @seed.observe(context, prev)
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
- @fore.observe(context, norm)
216
+ id = @brain[context.dup] ||= @brain.length
217
+ @fore.observe(id, norm)
211
218
  context << norm
212
219
  context.shift
213
220
  end
214
- @fore.observe(context, 1)
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
- @back.observe(context, norm)
231
+ id = @brain[context.dup] ||= @brain.length
232
+ @back.observe(id, norm)
224
233
  context << norm
225
234
  context.shift
226
235
  end
227
- @back.observe(context, 1)
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
- @case.observe(context, word)
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
- @punc.observe(context, punc)
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
- count = @seed.count(context)
309
+ id = @brain[context.dup] ||= @brain.length
310
+ count = @seed.count(id)
298
311
  if count > 0
299
- limit = @seed.count(context)
300
- context[context.index(2)] = @seed.select(context, limit)
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
- return [] if model.count(context) == 0
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
- limit = rand(model.count(context)) + 1
338
- symbol = model.select(context, limit)
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
- surprise = @fore.surprise(context, norm)
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
- surprise = @back.surprise(context, norm)
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
- count = @case.count(context)
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(context, limit)
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
- failed = (@punc.count(context) == 0)
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
- limit = rand(@punc.count(context)) + 1
462
- punc_symbols << @punc.select(context, limit)
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
@@ -1,20 +1,20 @@
1
- # Generated by jeweler
1
+ # Generated by juwelier
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: megahal 1.0.3 ruby lib
5
+ # stub: megahal 2.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
- s.name = "megahal"
9
- s.version = "1.0.3"
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 = "2015-05-26"
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("~> 2.1")
54
- s.rubygems_version = "2.4.6"
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>, ["~> 1.0"])
62
- s.add_runtime_dependency(%q<highline>, ["~> 1.7"])
63
- s.add_runtime_dependency(%q<ruby-progressbar>, ["~> 1.7"])
64
- s.add_runtime_dependency(%q<rubyzip>, ["~> 1.1"])
65
- s.add_runtime_dependency(%q<cld>, ["~> 0.7"])
66
- s.add_development_dependency(%q<rspec>, ["~> 3.2"])
67
- s.add_development_dependency(%q<yard>, ["~> 0.8"])
68
- s.add_development_dependency(%q<rdoc>, ["~> 4.1"])
69
- s.add_development_dependency(%q<bundler>, ["~> 1.7"])
70
- s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
71
- s.add_development_dependency(%q<simplecov>, ["~> 0.10"])
72
- s.add_development_dependency(%q<byebug>, ["~> 5.0"])
73
- s.add_development_dependency(%q<github_changelog_generator>, ["~> 1.4"])
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>, ["~> 1.0"])
76
- s.add_dependency(%q<highline>, ["~> 1.7"])
77
- s.add_dependency(%q<ruby-progressbar>, ["~> 1.7"])
78
- s.add_dependency(%q<rubyzip>, ["~> 1.1"])
79
- s.add_dependency(%q<cld>, ["~> 0.7"])
80
- s.add_dependency(%q<rspec>, ["~> 3.2"])
81
- s.add_dependency(%q<yard>, ["~> 0.8"])
82
- s.add_dependency(%q<rdoc>, ["~> 4.1"])
83
- s.add_dependency(%q<bundler>, ["~> 1.7"])
84
- s.add_dependency(%q<jeweler>, ["~> 2.0"])
85
- s.add_dependency(%q<simplecov>, ["~> 0.10"])
86
- s.add_dependency(%q<byebug>, ["~> 5.0"])
87
- s.add_dependency(%q<github_changelog_generator>, ["~> 1.4"])
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>, ["~> 1.0"])
91
- s.add_dependency(%q<highline>, ["~> 1.7"])
92
- s.add_dependency(%q<ruby-progressbar>, ["~> 1.7"])
93
- s.add_dependency(%q<rubyzip>, ["~> 1.1"])
94
- s.add_dependency(%q<cld>, ["~> 0.7"])
95
- s.add_dependency(%q<rspec>, ["~> 3.2"])
96
- s.add_dependency(%q<yard>, ["~> 0.8"])
97
- s.add_dependency(%q<rdoc>, ["~> 4.1"])
98
- s.add_dependency(%q<bundler>, ["~> 1.7"])
99
- s.add_dependency(%q<jeweler>, ["~> 2.0"])
100
- s.add_dependency(%q<simplecov>, ["~> 0.10"])
101
- s.add_dependency(%q<byebug>, ["~> 5.0"])
102
- s.add_dependency(%q<github_changelog_generator>, ["~> 1.4"])
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
 
@@ -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(7)
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(:@seed).count([1, 2])).to be > 0
28
- expect(megahal.instance_variable_get(:@fore).count([1, 1])).to be > 0
29
- expect(megahal.instance_variable_get(:@back).count([1, 1])).to be > 0
30
- expect(megahal.instance_variable_get(:@case).count([1, 5])).to be > 0
31
- expect(megahal.instance_variable_get(:@punc).count([1, 10])).to be > 0
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(:@seed).count([0, 0])).to eq(0)
35
- expect(megahal.instance_variable_get(:@fore).count([1, 1])).to eq(0)
36
- expect(megahal.instance_variable_get(:@back).count([1, 1])).to eq(0)
37
- expect(megahal.instance_variable_get(:@case).count([1, 5])).to eq(0)
38
- expect(megahal.instance_variable_get(:@punc).count([1, 10])).to eq(0)
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: 1.0.3
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: 2015-05-26 00:00:00.000000000 Z
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: '1.0'
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: '1.0'
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: '1.7'
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: '1.7'
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.7'
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.7'
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: '1.1'
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: '1.1'
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.2'
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.2'
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.8'
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.8'
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: '4.1'
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: '4.1'
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: jeweler
140
+ name: juwelier
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '2.0'
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.0'
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.10'
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.10'
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: '5.0'
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: '5.0'
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.4'
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.4'
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
- rubyforge_project:
251
- rubygems_version: 2.4.6
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: []