kotodama 1.0.2 → 1.1.1
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.
- data/lib/kotodama.rb +1 -1
- data/lib/kotodama_grammar.rb +25 -2
- data/lib/language.rb +2 -1
- data/lib/rule.rb +19 -11
- data/lib/type.rb +14 -2
- metadata +3 -3
data/lib/kotodama.rb
CHANGED
data/lib/kotodama_grammar.rb
CHANGED
@@ -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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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 <<
|
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
|
-
|
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
|