kotodama 1.0.2 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/kotodama.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'kaiseki'
2
2
 
3
3
  module Kotodama
4
- VERSION = '1.0.2'
4
+ VERSION = '1.1.1'
5
5
  file_path = File.dirname __FILE__
6
6
 
7
7
  #load base class mods
@@ -21,7 +21,7 @@ module Kotodama
21
21
  end
22
22
 
23
23
  rule :content_block do
24
- parses :type_block | :rule_block | :change_block | :spelling_rule
24
+ parses :type_block | :rule_block | :change_block | :spelling_rule | :zipf_block
25
25
  end
26
26
 
27
27
  rule :type_block do
@@ -45,7 +45,7 @@ module Kotodama
45
45
  end
46
46
 
47
47
  rule :rule_block do
48
- parses 'rule'.skip & :ATOM.set(:id) & :get_rule & '{'.skip & :rule_expression.zero_or_more & '}'.skip
48
+ parses 'rule'.skip & :ATOM.set(:id) & :get_rule & '{'.skip & (:exclude_expression | :rule_expression).zero_or_more & '}'.skip
49
49
  end
50
50
 
51
51
  action :get_rule do
@@ -56,6 +56,11 @@ module Kotodama
56
56
  end
57
57
  end
58
58
 
59
+ rule :exclude_expression do
60
+ parses 'exclude'.skip & :ID.one_or_more & ';'.skip
61
+ action { @rule.excludes << @result.join }
62
+ end
63
+
59
64
  rule :rule_expression do
60
65
  parses :ATOM.one_or_more & :WEIGHT.optional & ';'.skip
61
66
  node [:expression, :weight]
@@ -111,6 +116,19 @@ module Kotodama
111
116
  end
112
117
  end
113
118
 
119
+ rule :zipf_block do
120
+ parses 'zipf'.skip & :FLOAT.set(:float) & '{'.skip & (:LIST & ';'.skip).one_or_more.set(:lists) & '}'.skip
121
+ action do
122
+ zipf_list = []
123
+ @lists.each {|list1| list1.each {|n| zipf_list << n } }
124
+ zipf_list.length.times do |i|
125
+ value = 1.0 / (i + 1) ** @float
126
+ value = (value * 100).to_i
127
+ @language.zipf[zipf_list[i]] = value
128
+ end
129
+ end
130
+ end
131
+
114
132
  rule :ID do
115
133
  parses /[a-zA-Z][0-9]?/
116
134
  filter do
@@ -147,6 +165,11 @@ module Kotodama
147
165
  cast Integer
148
166
  end
149
167
 
168
+ rule :FLOAT do
169
+ parses /\d+\.\d+/
170
+ cast Float
171
+ end
172
+
150
173
  rule :WS do
151
174
  parses /\s+/
152
175
  end
data/lib/language.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Kotodama
2
2
  class Language
3
- attr_reader :types, :rules, :changes, :spellings, :options
3
+ attr_reader :types, :rules, :changes, :spellings, :options, :zipf
4
4
 
5
5
  def initialize
6
6
  @types = {}
@@ -8,6 +8,7 @@ module Kotodama
8
8
  @changes = {}
9
9
  @spellings = {}
10
10
  @options = {}
11
+ @zipf = {}
11
12
  end
12
13
 
13
14
  def generate options = {}
data/lib/rule.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  module Kotodama
2
2
  class Rule
3
- attr_reader :language, :expressions, :weights
3
+ attr_reader :language, :expressions, :weights, :excludes
4
4
 
5
5
  def initialize language
6
6
  @language = language
7
7
  @expressions = []
8
8
  @weights = []
9
+ @excludes = []
9
10
  end
10
11
 
11
12
  def add expression, weight
@@ -14,18 +15,25 @@ module Kotodama
14
15
  end
15
16
 
16
17
  def generate
17
- expression = @expressions.random @weights
18
- output = []
19
- expression.each do |atom|
20
- if @language.rules.key? atom
21
- output += @language.rules[atom].generate
22
- elsif @language.types.key? atom
23
- output << @language.types[atom].generate
24
- else
25
- raise "`#{atom}' is not associated with the given language"
18
+ loop do
19
+ expression = @expressions.random @weights
20
+ output = []
21
+ expression.each do |atom|
22
+ if @language.rules.key? atom
23
+ output += @language.rules[atom].generate
24
+ elsif @language.types.key? atom
25
+ output << @language.types[atom].generate
26
+ else
27
+ raise "`#{atom}' is not associated with the given language"
28
+ end
29
+ end
30
+ catch :fail do
31
+ @excludes.each do |n|
32
+ throw :fail if output.join.match /#{n}/
33
+ end
34
+ return output
26
35
  end
27
36
  end
28
- output
29
37
  end
30
38
  end
31
39
  end
data/lib/type.rb CHANGED
@@ -10,7 +10,7 @@ module Kotodama
10
10
 
11
11
  def add symbol, weight
12
12
  @symbols << symbol
13
- @weights << (weight || @language.options['$type_weight'] || 1)
13
+ @weights << weight
14
14
  end
15
15
 
16
16
  def member? symbol
@@ -18,7 +18,19 @@ module Kotodama
18
18
  end
19
19
 
20
20
  def generate
21
- @symbols.random @weights
21
+ temp_weights = []
22
+ @symbols.length.times do |i|
23
+ if @weights[i]
24
+ temp_weights << @weights[i]
25
+ elsif @language.zipf[@symbols[i]]
26
+ temp_weights << @language.zipf[@symbols[i]]
27
+ elsif @language.options['$symbol_weight']
28
+ temp_weights << @language.options['$symbol_weight']
29
+ else
30
+ temp_weights << 1
31
+ end
32
+ end
33
+ @symbols.random temp_weights
22
34
  end
23
35
  end
24
36
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 0
8
- - 2
9
- version: 1.0.2
7
+ - 1
8
+ - 1
9
+ version: 1.1.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - William Hamilton-Levi