rley 0.5.06 → 0.5.07
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -3
- data/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/examples/NLP/benchmark_mini_en.rb +92 -0
- data/examples/general/calc_iter2/calc_ast_nodes.rb +8 -1
- data/examples/general/calc_iter2/calc_lexer.rb +2 -1
- data/examples/general/calc_iter2/spec/calculator_spec.rb +19 -2
- data/lib/rley/constants.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ce368c99ffa556898d9a89788786e47b5e8b115
|
4
|
+
data.tar.gz: 97a691b869089989f601556ed13dd24d729b7ad0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b50595273bf5f75e25b6e609de197be31a4f8583f1c1f93ef8494a8e5367facdbafd13326bd2097c9da657096c2f15e9dc8d439d16212f4e578134ce538984b2
|
7
|
+
data.tar.gz: 8be6b6bdef48de1cbd19b2785530a5bc17e43804a43ff01f287a89a129a83897f8ea05ecb951018c99f888bbfefbbc33e89ee9cfb0adb2e86eba2e3971703c1d
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
### 0.5.07 / 2017-11-11
|
2
|
+
* [NEW] File `benchmark_mini_en.rb` added in `examples/NLP` folder for parsing performance measurements.
|
3
|
+
* [CHANGE] Demo calculator in `examples/general/calc_iter2`: added support for log10 and cbrt functions. README.md slightly reworked.
|
4
|
+
* [FIX] File `README.md` sample code was broken by changes in 0.5.06 (thanks to arjunmenon for pointing this).
|
5
|
+
|
1
6
|
### 0.5.06 / 2017-11-08
|
2
7
|
* [CHANGE] Demo calculator in `examples/general/calc_iter2` does much than the basic arithmetic operators, it now
|
3
8
|
support trigonometric functions and their inverse, square root, exponential and natural logarithm functions!.
|
data/README.md
CHANGED
@@ -148,7 +148,7 @@ The subset of English grammar is based on an example from the NLTK book.
|
|
148
148
|
term_name = Lexicon[word]
|
149
149
|
raise StandardError, "Word '#{word}' not found in lexicon" if term_name.nil?
|
150
150
|
terminal = aGrammar.name2symbol[term_name]
|
151
|
-
Rley::
|
151
|
+
Rley::Lexical::Token.new(word, terminal)
|
152
152
|
end
|
153
153
|
|
154
154
|
return tokens
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# File: benchmark_mini_en.rb
|
2
|
+
# Purpose: benchmark the parse speed
|
3
|
+
require 'benchmark'
|
4
|
+
require 'rley' # Load Rley library
|
5
|
+
|
6
|
+
# Instantiate a builder object that will build the grammar for us
|
7
|
+
builder = Rley::Syntax::GrammarBuilder.new do
|
8
|
+
|
9
|
+
add_terminals('Noun', 'Proper-Noun', 'Verb')
|
10
|
+
add_terminals('Determiner', 'Preposition')
|
11
|
+
|
12
|
+
# Here we define the productions (= grammar rules)
|
13
|
+
rule 'S' => %w[NP VP]
|
14
|
+
rule 'NP' => 'Proper-Noun'
|
15
|
+
rule 'NP' => %w[Determiner Noun]
|
16
|
+
rule 'NP' => %w[Determiner Noun PP]
|
17
|
+
rule 'VP' => %w[Verb NP]
|
18
|
+
rule 'VP' => %w[Verb NP PP]
|
19
|
+
rule 'PP' => %w[Preposition NP]
|
20
|
+
end
|
21
|
+
|
22
|
+
# And now, let's build the grammar...
|
23
|
+
grammar = builder.grammar
|
24
|
+
|
25
|
+
########################################
|
26
|
+
# Step 2. Creating a lexicon
|
27
|
+
# To simplify things, lexicon is implemented as a Hash with pairs of the form:
|
28
|
+
# word => terminal symbol name
|
29
|
+
Lexicon = {
|
30
|
+
'man' => 'Noun',
|
31
|
+
'dog' => 'Noun',
|
32
|
+
'cat' => 'Noun',
|
33
|
+
'telescope' => 'Noun',
|
34
|
+
'park' => 'Noun',
|
35
|
+
'saw' => 'Verb',
|
36
|
+
'ate' => 'Verb',
|
37
|
+
'walked' => 'Verb',
|
38
|
+
'John' => 'Proper-Noun',
|
39
|
+
'Mary' => 'Proper-Noun',
|
40
|
+
'Bob' => 'Proper-Noun',
|
41
|
+
'a' => 'Determiner',
|
42
|
+
'an' => 'Determiner',
|
43
|
+
'the' => 'Determiner',
|
44
|
+
'my' => 'Determiner',
|
45
|
+
'in' => 'Preposition',
|
46
|
+
'on' => 'Preposition',
|
47
|
+
'by' => 'Preposition',
|
48
|
+
'with' => 'Preposition'
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
########################################
|
52
|
+
# Step 3. Creating a tokenizer
|
53
|
+
# A tokenizer reads the input string and converts it into a sequence of tokens
|
54
|
+
# Highly simplified tokenizer implementation.
|
55
|
+
def tokenizer(aTextToParse, aGrammar)
|
56
|
+
tokens = aTextToParse.scan(/\S+/).map do |word|
|
57
|
+
term_name = Lexicon[word]
|
58
|
+
raise StandardError, "Word '#{word}' not found in lexicon" if term_name.nil?
|
59
|
+
terminal = aGrammar.name2symbol[term_name]
|
60
|
+
Rley::Lexical::Token.new(word, terminal)
|
61
|
+
end
|
62
|
+
|
63
|
+
return tokens
|
64
|
+
end
|
65
|
+
|
66
|
+
########################################
|
67
|
+
# Step 4. Create a parser for that grammar
|
68
|
+
# Easy with Rley...
|
69
|
+
parser = Rley::Parser::GFGEarleyParser.new(grammar)
|
70
|
+
|
71
|
+
########################################
|
72
|
+
# Step 5. Parsing the input
|
73
|
+
input_to_parse = 'John saw Mary with a telescope'
|
74
|
+
|
75
|
+
# Convert input text into a sequence of token objects...
|
76
|
+
tokens = tokenizer(input_to_parse, grammar)
|
77
|
+
|
78
|
+
# Use Benchmark mix-in
|
79
|
+
include Benchmark
|
80
|
+
|
81
|
+
bm(6) do |meter|
|
82
|
+
meter.report("Parse 100 times") { 100.times { parser.parse(tokens) } }
|
83
|
+
meter.report("Parse 1000 times") { 1000.times { parser.parse(tokens) } }
|
84
|
+
meter.report("Parse 10000 times") { 10000.times { parser.parse(tokens) } }
|
85
|
+
meter.report("Parse 1000000 times") { 100000.times { parser.parse(tokens) } }
|
86
|
+
end
|
87
|
+
|
88
|
+
# puts "Parsing successful? #{result.success?}"
|
89
|
+
# unless result.success?
|
90
|
+
# puts result.failure_reason.message
|
91
|
+
# exit(1)
|
92
|
+
# end
|
@@ -97,11 +97,18 @@ class CalcNegateNode < CalcUnaryOpNode
|
|
97
97
|
end # class
|
98
98
|
|
99
99
|
class CalcUnaryFunction < CalcCompositeNode
|
100
|
+
@@name_mapping = begin
|
101
|
+
map = Hash.new { |me, key| me[key] = key }
|
102
|
+
map['ln'] = 'log'
|
103
|
+
map['log'] = 'log10'
|
104
|
+
map
|
105
|
+
end
|
100
106
|
attr_accessor(:func_name)
|
101
107
|
|
108
|
+
|
102
109
|
def interpret()
|
103
110
|
argument = children[0].interpret
|
104
|
-
internal_name = @func_name == 'ln' ? 'log' : @func_name
|
111
|
+
internal_name = @@name_mapping[@func_name] # @func_name == 'ln' ? 'log' : @func_name
|
105
112
|
return Math.send(internal_name.to_sym, argument)
|
106
113
|
end
|
107
114
|
end
|
@@ -168,8 +168,18 @@ describe 'Calculator' do
|
|
168
168
|
|
169
169
|
# Some special functions
|
170
170
|
it 'should evaluate square root of expressions' do
|
171
|
+
expect_expr('sqrt(0)').to eq(0)
|
172
|
+
expect_expr('sqrt(1)').to eq(1)
|
171
173
|
expect_expr('sqrt(1 + 1)').to eq(Math.sqrt(2))
|
172
|
-
|
174
|
+
expect_expr('sqrt(5 * 5)').to eq(5)
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should evaluate cubic root of expressions' do
|
178
|
+
expect_expr('cbrt(0)').to eq(0)
|
179
|
+
expect_expr('cbrt(1)').to eq(1)
|
180
|
+
expect_expr('cbrt(1 + 1)').to eq(Math.cbrt(2))
|
181
|
+
expect_expr('cbrt(5 * 5 * 5)').to eq(5)
|
182
|
+
end
|
173
183
|
|
174
184
|
it 'should evaluate exponential of expressions' do
|
175
185
|
expect_expr('exp(-1)').to eq(1/Math::E)
|
@@ -183,7 +193,14 @@ describe 'Calculator' do
|
|
183
193
|
expect_expr('ln(1)').to eq(0)
|
184
194
|
expect_expr('ln(E)').to eq(1)
|
185
195
|
expect_expr('ln(E * E)').to eq(2)
|
186
|
-
end
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'should evaluate the logarithm base 10 of expressions' do
|
199
|
+
expect_expr('log(1/10)').to eq(-1)
|
200
|
+
expect_expr('log(1)').to eq(0)
|
201
|
+
expect_expr('log(10)').to eq(1)
|
202
|
+
expect_expr('log(10 * 10 * 10)').to eq(3)
|
203
|
+
end
|
187
204
|
|
188
205
|
# Trigonometric functions
|
189
206
|
|
data/lib/rley/constants.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.07
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- README.md
|
131
131
|
- Rakefile
|
132
132
|
- appveyor.yml
|
133
|
+
- examples/NLP/benchmark_mini_en.rb
|
133
134
|
- examples/NLP/mini_en_demo.rb
|
134
135
|
- examples/data_formats/JSON/cli_options.rb
|
135
136
|
- examples/data_formats/JSON/json_ast_builder.rb
|