zenlish 0.2.05 → 0.2.07
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +228 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +5 -3
- data/LICENSE.txt +1 -1
- data/Rakefile +5 -3
- data/lib/zenlish/feature/boolean_domain.rb +6 -4
- data/lib/zenlish/feature/boolean_value.rb +3 -2
- data/lib/zenlish/feature/enumeration_domain.rb +5 -2
- data/lib/zenlish/feature/feature.rb +9 -7
- data/lib/zenlish/feature/feature_def.rb +9 -6
- data/lib/zenlish/feature/feature_domain.rb +4 -2
- data/lib/zenlish/feature/feature_struct.rb +3 -1
- data/lib/zenlish/feature/feature_struct_def.rb +5 -3
- data/lib/zenlish/feature/feature_struct_def_bearer.rb +6 -4
- data/lib/zenlish/feature/feature_value.rb +4 -2
- data/lib/zenlish/feature/identifier_domain.rb +5 -3
- data/lib/zenlish/feature/identifier_value.rb +3 -2
- data/lib/zenlish/feature/symbol_value.rb +3 -1
- data/lib/zenlish/inflect/atomic_o_expression.rb +2 -1
- data/lib/zenlish/inflect/composite_o_expression.rb +3 -1
- data/lib/zenlish/inflect/concatenation.rb +3 -2
- data/lib/zenlish/inflect/equals_literal.rb +3 -1
- data/lib/zenlish/inflect/feature_heading.rb +2 -5
- data/lib/zenlish/inflect/formal_argument.rb +3 -1
- data/lib/zenlish/inflect/function_call.rb +4 -1
- data/lib/zenlish/inflect/heading.rb +2 -0
- data/lib/zenlish/inflect/inflection_rule.rb +2 -0
- data/lib/zenlish/inflect/inflection_table.rb +6 -4
- data/lib/zenlish/inflect/inflection_table_builder.rb +21 -18
- data/lib/zenlish/inflect/input_asis.rb +3 -0
- data/lib/zenlish/inflect/input_expression.rb +4 -2
- data/lib/zenlish/inflect/literal_asis.rb +4 -1
- data/lib/zenlish/inflect/matches_pattern.rb +2 -0
- data/lib/zenlish/inflect/membership.rb +2 -0
- data/lib/zenlish/inflect/method_heading.rb +3 -6
- data/lib/zenlish/inflect/not_equals_literal.rb +2 -0
- data/lib/zenlish/inflect/nullary_input_expression.rb +3 -1
- data/lib/zenlish/inflect/output_expression.rb +6 -0
- data/lib/zenlish/inflect/substitution.rb +3 -1
- data/lib/zenlish/inflect/unary_input_expression.rb +4 -1
- data/lib/zenlish/inflect/unconditionally_true.rb +4 -2
- data/lib/zenlish/lang/dictionary.rb +19 -16
- data/lib/zenlish/lang/lemmatizer.rb +40 -0
- data/lib/zenlish/lang/zenlish_grammar.rb +6 -4
- data/lib/zenlish/lex/empty_lexicon_factory.rb +3 -2
- data/lib/zenlish/lex/lexeme.rb +6 -4
- data/lib/zenlish/lex/lexical_entry.rb +6 -4
- data/lib/zenlish/lex/lexicon.rb +4 -3
- data/lib/zenlish/lex/literal.rb +3 -1
- data/lib/zenlish/lexer/lexer.rb +144 -0
- data/lib/zenlish/trie/base_trie_node.rb +27 -0
- data/lib/zenlish/trie/trie.rb +132 -0
- data/lib/zenlish/trie/trie_node.rb +21 -0
- data/lib/zenlish/trie/trie_root.rb +10 -0
- data/lib/zenlish/version.rb +3 -1
- data/lib/zenlish/wclasses/adjective.rb +4 -2
- data/lib/zenlish/wclasses/adverb.rb +3 -1
- data/lib/zenlish/wclasses/adverb_maybe.rb +3 -1
- data/lib/zenlish/wclasses/adverb_not.rb +2 -0
- data/lib/zenlish/wclasses/all_word_classes.rb +3 -1
- data/lib/zenlish/wclasses/article.rb +2 -0
- data/lib/zenlish/wclasses/auxiliary.rb +2 -0
- data/lib/zenlish/wclasses/auxiliary_be.rb +7 -6
- data/lib/zenlish/wclasses/auxiliary_do.rb +6 -5
- data/lib/zenlish/wclasses/cardinal.rb +3 -1
- data/lib/zenlish/wclasses/common_noun.rb +2 -0
- data/lib/zenlish/wclasses/comparative_particle.rb +5 -3
- data/lib/zenlish/wclasses/conjunction.rb +2 -0
- data/lib/zenlish/wclasses/conjunctive_pronoun.rb +2 -0
- data/lib/zenlish/wclasses/coordinator.rb +4 -2
- data/lib/zenlish/wclasses/definite_article.rb +2 -0
- data/lib/zenlish/wclasses/degree_adverb.rb +2 -0
- data/lib/zenlish/wclasses/demonstrative_determiner.rb +6 -4
- data/lib/zenlish/wclasses/demonstrative_pronoun.rb +2 -0
- data/lib/zenlish/wclasses/determiner.rb +3 -1
- data/lib/zenlish/wclasses/distributive_determiner.rb +2 -0
- data/lib/zenlish/wclasses/existential_there.rb +2 -0
- data/lib/zenlish/wclasses/fronting_quantifier.rb +3 -1
- data/lib/zenlish/wclasses/indefinite_article.rb +2 -0
- data/lib/zenlish/wclasses/indefinite_pronoun.rb +3 -1
- data/lib/zenlish/wclasses/irregular_linking_verb.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb.rb +13 -15
- data/lib/zenlish/wclasses/irregular_verb_be.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_can.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_do.rb +7 -6
- data/lib/zenlish/wclasses/irregular_verb_extension.rb +8 -7
- data/lib/zenlish/wclasses/irregular_verb_have.rb +12 -11
- data/lib/zenlish/wclasses/irregular_verb_know.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb_say.rb +3 -1
- data/lib/zenlish/wclasses/irregular_verb_think.rb +3 -1
- data/lib/zenlish/wclasses/lexical_verb.rb +3 -4
- data/lib/zenlish/wclasses/linking_adverb.rb +2 -0
- data/lib/zenlish/wclasses/modal_verb_can.rb +7 -5
- data/lib/zenlish/wclasses/noun.rb +4 -2
- data/lib/zenlish/wclasses/numeral.rb +2 -0
- data/lib/zenlish/wclasses/personal_pronoun.rb +8 -6
- data/lib/zenlish/wclasses/possessive_determiner.rb +13 -12
- data/lib/zenlish/wclasses/preposition.rb +3 -1
- data/lib/zenlish/wclasses/preposition_of.rb +2 -0
- data/lib/zenlish/wclasses/preposition_than.rb +2 -0
- data/lib/zenlish/wclasses/pronoun.rb +3 -1
- data/lib/zenlish/wclasses/proper_noun.rb +10 -8
- data/lib/zenlish/wclasses/quantifier.rb +3 -1
- data/lib/zenlish/wclasses/regular_verb.rb +9 -9
- data/lib/zenlish/wclasses/regular_verb_want.rb +4 -2
- data/lib/zenlish/wclasses/relative_pronoun.rb +4 -2
- data/lib/zenlish/wclasses/subordinating_conjunction.rb +7 -5
- data/lib/zenlish/wclasses/verb.rb +5 -3
- data/lib/zenlish/wclasses/word_class.rb +7 -5
- data/lib/zenlish.rb +3 -3
- data/spec/spec_helper.rb +3 -1
- data/spec/zenlish/feature/boolean_domain_spec.rb +16 -16
- data/spec/zenlish/feature/boolean_value_spec.rb +7 -6
- data/spec/zenlish/feature/enumeration_domain_spec.rb +21 -21
- data/spec/zenlish/feature/feature_def_spec.rb +15 -14
- data/spec/zenlish/feature/feature_spec.rb +17 -17
- data/spec/zenlish/feature/feature_struct_def_bearer_spec.rb +23 -21
- data/spec/zenlish/feature/feature_struct_def_spec.rb +26 -25
- data/spec/zenlish/feature/identifier_domain_spec.rb +15 -15
- data/spec/zenlish/feature/identifier_value_spec.rb +10 -9
- data/spec/zenlish/feature/symbol_value_spec.rb +9 -8
- data/spec/zenlish/inflect/concatenation_spec.rb +14 -14
- data/spec/zenlish/inflect/equals_literal_spec.rb +17 -16
- data/spec/zenlish/inflect/feature_heading_spec.rb +22 -21
- data/spec/zenlish/inflect/formal_argument_spec.rb +7 -7
- data/spec/zenlish/inflect/function_call_spec.rb +11 -12
- data/spec/zenlish/inflect/inflection_rule_spec.rb +28 -24
- data/spec/zenlish/inflect/inflection_table_builder_spec.rb +62 -57
- data/spec/zenlish/inflect/inflection_table_spec.rb +49 -46
- data/spec/zenlish/inflect/input_asis_spec.rb +12 -15
- data/spec/zenlish/inflect/literal_asis_spec.rb +10 -10
- data/spec/zenlish/inflect/matches_pattern_spec.rb +16 -15
- data/spec/zenlish/inflect/membership_spec.rb +17 -16
- data/spec/zenlish/inflect/method_heading_spec.rb +15 -14
- data/spec/zenlish/inflect/not_equals_literal_spec.rb +17 -16
- data/spec/zenlish/inflect/substitution_spec.rb +10 -11
- data/spec/zenlish/inflect/unconditionally_true_spec.rb +8 -6
- data/spec/zenlish/lang/dictionary_spec.rb +28 -31
- data/spec/zenlish/lang/lemmatizer_spec.rb +43 -0
- data/spec/zenlish/lang/zenlish_grammar_spec.rb +5 -5
- data/spec/zenlish/lex/empty_lexicon_factory_spec.rb +8 -8
- data/spec/zenlish/lex/lexeme_spec.rb +27 -28
- data/spec/zenlish/lex/lexical_entry_spec.rb +15 -15
- data/spec/zenlish/lex/lexicon_spec.rb +52 -50
- data/spec/zenlish/lex/literal_spec.rb +8 -8
- data/spec/zenlish/lexer/lexer_spec.rb +52 -0
- data/spec/zenlish/parser/lesson1_spec.rb +81 -81
- data/spec/zenlish/parser/lesson2_spec.rb +133 -138
- data/spec/zenlish/parser/lesson3_spec.rb +186 -226
- data/spec/zenlish/parser/zparser_spec.rb +8 -7
- data/spec/zenlish/support/minimal_lexicon.rb +2 -0
- data/spec/zenlish/support/var2word.rb +16 -9
- data/spec/zenlish/trie/base_trie_node_spec.rb +33 -0
- data/spec/zenlish/trie/trie_spec.rb +108 -0
- data/spec/zenlish/wclasses/common_noun_spec.rb +15 -19
- data/spec/zenlish/wclasses/demonstrative_determiner_spec.rb +12 -12
- data/spec/zenlish/wclasses/irregular_verb_can_spec.rb +18 -18
- data/spec/zenlish/wclasses/irregular_verb_extension_spec.rb +10 -10
- data/spec/zenlish/wclasses/irregular_verb_spec.rb +28 -28
- data/spec/zenlish/wclasses/lexical_verb_spec.rb +9 -9
- data/spec/zenlish/wclasses/modal_verb_can_spec.rb +12 -12
- data/spec/zenlish/wclasses/noun_spec.rb +7 -7
- data/spec/zenlish/wclasses/personal_pronoun_spec.rb +20 -23
- data/spec/zenlish/wclasses/possessive_determiner_spec.rb +28 -31
- data/spec/zenlish/wclasses/preposition_spec.rb +5 -5
- data/spec/zenlish/wclasses/proper_noun_spec.rb +3 -3
- data/spec/zenlish/wclasses/regular_verb_spec.rb +30 -30
- data/spec/zenlish/wclasses/regular_verb_want_spec.rb +30 -0
- data/spec/zenlish/wclasses/verb_spec.rb +9 -9
- data/spec/zenlish_spec.rb +4 -2
- data/zenlish.gemspec +18 -14
- metadata +49 -16
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'atomic_o_expression'
|
2
4
|
|
3
5
|
module Zenlish
|
@@ -6,6 +8,7 @@ module Zenlish
|
|
6
8
|
attr_reader :mth_name
|
7
9
|
|
8
10
|
def initialize(aMethodName)
|
11
|
+
super()
|
9
12
|
@mth_name = aMethodName
|
10
13
|
end
|
11
14
|
|
@@ -14,4 +17,4 @@ module Zenlish
|
|
14
17
|
end
|
15
18
|
end # class
|
16
19
|
end # module
|
17
|
-
end # module
|
20
|
+
end # module
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
module Zenlish
|
3
4
|
module Inflect
|
@@ -28,6 +29,7 @@ module Zenlish
|
|
28
29
|
end
|
29
30
|
err_msg = "Table has #{headings.size} headings, instead of #{constraints.size}"
|
30
31
|
raise StandardError, err_msg if constraints.size != headings.size
|
32
|
+
|
31
33
|
actuals = []
|
32
34
|
headings.each_with_index do |hd, idx|
|
33
35
|
if constraints[idx]
|
@@ -50,7 +52,7 @@ module Zenlish
|
|
50
52
|
def all_inflections(aLexeme)
|
51
53
|
constraints = Array.new(headings.size) { |_i| nil }
|
52
54
|
heading_matches = []
|
53
|
-
headings.each_with_index do |hd,
|
55
|
+
headings.each_with_index do |hd, _idx|
|
54
56
|
heading_matches << hd.all_matches(aLexeme)
|
55
57
|
end
|
56
58
|
w_forms = nil
|
@@ -60,8 +62,8 @@ module Zenlish
|
|
60
62
|
inflect(aLexeme, [item])
|
61
63
|
end
|
62
64
|
else
|
63
|
-
|
64
|
-
all_combos =
|
65
|
+
vector1 = heading_matches.shift
|
66
|
+
all_combos = vector1.product(*heading_matches)
|
65
67
|
w_forms = all_combos.map do |combination|
|
66
68
|
inflect(aLexeme, combination)
|
67
69
|
end
|
@@ -71,4 +73,4 @@ module Zenlish
|
|
71
73
|
end
|
72
74
|
end # class
|
73
75
|
end # module
|
74
|
-
end # module
|
76
|
+
end # module
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'feature_heading'
|
2
4
|
require_relative 'method_heading'
|
3
5
|
require_relative 'formal_argument'
|
@@ -13,19 +15,19 @@ require_relative 'substitution'
|
|
13
15
|
require_relative 'inflection_rule'
|
14
16
|
require_relative 'inflection_table'
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
18
|
+
# DecisionTable: Common_form
|
19
|
+
# | NUMBER | .base_form | Common_form |
|
20
|
+
# | singular | X | base_form |
|
21
|
+
# | plural | ~ /[^aeiouy]y$/ | sub(base_form, /y$/, "ies")|
|
22
|
+
# | plural | X | base_form + "s" |
|
23
|
+
# build('Common_form') do
|
24
|
+
# feature_heading 'NUMBER'
|
25
|
+
# method_heading 'base_form'
|
26
|
+
# | NUMBER | base_form | Common_form |
|
27
|
+
# rule [equals(:singular), dont_care ], col('base_form')
|
28
|
+
# rule [equals(:plural) , matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies')
|
29
|
+
# rule [equals(:plural) , dont_care ], concat(col('base_form'), 's')
|
30
|
+
# end
|
29
31
|
|
30
32
|
module Zenlish
|
31
33
|
module Inflect
|
@@ -50,20 +52,20 @@ module Zenlish
|
|
50
52
|
def feature_heading(aFeatureName)
|
51
53
|
hd = FeatureHeading.new(aFeatureName)
|
52
54
|
headings << hd
|
53
|
-
table
|
55
|
+
table&.add_heading(hd)
|
54
56
|
end
|
55
57
|
|
56
58
|
def method_heading(aMethodName)
|
57
59
|
hd = MethodHeading.new(aMethodName)
|
58
60
|
headings << hd
|
59
|
-
table
|
61
|
+
table&.add_heading(hd)
|
60
62
|
end
|
61
63
|
|
62
64
|
def rule(conditions, consequent)
|
63
65
|
@conds = []
|
64
66
|
rl = InflectionRule.new(conditions.dup, consequent)
|
65
67
|
rules << rl
|
66
|
-
table
|
68
|
+
table&.add_rule(rl)
|
67
69
|
|
68
70
|
rl
|
69
71
|
end
|
@@ -107,6 +109,7 @@ module Zenlish
|
|
107
109
|
col_index = headings.find_index { |hd| hd.label == aColName }
|
108
110
|
err_msg = "Cannot find heading named '#{aColName}'."
|
109
111
|
raise StandardError, err_msg if col_index.nil?
|
112
|
+
|
110
113
|
formal = FormalArgument.new(col_index)
|
111
114
|
InputAsIs.new(formal)
|
112
115
|
end
|
@@ -132,7 +135,7 @@ module Zenlish
|
|
132
135
|
|
133
136
|
private
|
134
137
|
|
135
|
-
def reset
|
138
|
+
def reset
|
136
139
|
@table = nil
|
137
140
|
@headings = []
|
138
141
|
@conds = []
|
@@ -144,4 +147,4 @@ module Zenlish
|
|
144
147
|
# end
|
145
148
|
end # class
|
146
149
|
end # module
|
147
|
-
end # module
|
150
|
+
end # module
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Zenlish
|
2
4
|
module Inflect
|
3
5
|
class InputExpression
|
4
6
|
def success?(_lexeme, _heading_values)
|
5
7
|
raise NotImplementedError, 'Method must be implemented in subclass(es).'
|
6
|
-
end
|
8
|
+
end
|
7
9
|
end # class
|
8
10
|
end # module
|
9
|
-
end # module
|
11
|
+
end # module
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'atomic_o_expression'
|
2
4
|
|
3
5
|
module Zenlish
|
@@ -6,6 +8,7 @@ module Zenlish
|
|
6
8
|
attr_reader :text
|
7
9
|
|
8
10
|
def initialize(aLiteralValue)
|
11
|
+
super()
|
9
12
|
@text = aLiteralValue
|
10
13
|
end
|
11
14
|
|
@@ -14,4 +17,4 @@ module Zenlish
|
|
14
17
|
end
|
15
18
|
end # class
|
16
19
|
end # module
|
17
|
-
end # module
|
20
|
+
end # module
|
@@ -1,20 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'heading'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module Inflect
|
5
7
|
class MethodHeading < Heading
|
6
|
-
|
7
|
-
def initialize(aLabel)
|
8
|
-
super(aLabel)
|
9
|
-
end
|
10
|
-
|
11
8
|
def evaluate_for(aFeatureBearer)
|
12
9
|
aFeatureBearer.send(label)
|
13
10
|
end
|
14
11
|
|
15
12
|
def all_matches(aFeatureBearer)
|
16
13
|
[evaluate_for(aFeatureBearer)]
|
17
|
-
end
|
14
|
+
end
|
18
15
|
end # class
|
19
16
|
end # module
|
20
17
|
end # module
|
@@ -1,11 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'input_expression'
|
2
4
|
|
3
5
|
module Zenlish
|
4
6
|
module Inflect
|
5
7
|
class UnaryInputExpression < InputExpression
|
6
8
|
attr_reader :argument
|
7
|
-
|
9
|
+
|
8
10
|
def initialize(anArgument)
|
11
|
+
super()
|
9
12
|
@argument = anArgument
|
10
13
|
end
|
11
14
|
end # class
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'nullary_input_expression'
|
2
4
|
|
3
5
|
module Zenlish
|
@@ -5,7 +7,7 @@ module Zenlish
|
|
5
7
|
class UnconditionallyTrue < NullaryInputExpression
|
6
8
|
def success?(_headings, _lexeme, _heading_values)
|
7
9
|
true
|
8
|
-
end
|
10
|
+
end
|
9
11
|
end # class
|
10
12
|
end # module
|
11
|
-
end # module
|
13
|
+
end # module
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
unless defined?(Zenlish::Lang::Dictionary)
|
2
4
|
require_relative '../feature/feature_struct_def_bearer'
|
3
5
|
module Zenlish
|
@@ -9,7 +11,7 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
9
11
|
sandbox = Object.new
|
10
12
|
sandbox.extend(Zenlish::Lex::EmptyLexiconFactory)
|
11
13
|
Dictionary = sandbox.create_empty_lexicon
|
12
|
-
|
14
|
+
extend(Feature::FeatureStructDefBearer)
|
13
15
|
|
14
16
|
# @param aLemma [String] is the canonical form, dictionary form,
|
15
17
|
# or citation form of a headword.
|
@@ -18,6 +20,7 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
18
20
|
entry = Zenlish::Lex::LexicalEntry.new(aLemma)
|
19
21
|
wclass = Dictionary.name2terminal[aWClassName]
|
20
22
|
raise StandardError, "Undefined word class for '#{aLemma}'" unless wclass
|
23
|
+
|
21
24
|
lexeme = Zenlish::Lex::Lexeme.new(wclass, entry, aFeatureHash)
|
22
25
|
lexeme.instance_exec(&aBlock) if block_given?
|
23
26
|
lexeme.freeze
|
@@ -90,17 +93,17 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
90
93
|
end
|
91
94
|
add_entry('here', 'Adverb')
|
92
95
|
# example: ...from here (works as a pronoun of a place)
|
93
|
-
add_entry('here', 'CommonNoun', {'NUMBER' => enumeration(:singular),
|
94
|
-
'PARADIGM' => [identifier, 'Singular_only']})
|
96
|
+
add_entry('here', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
|
97
|
+
'PARADIGM' => [identifier, 'Singular_only'] })
|
95
98
|
add_entry('I', 'PersonalPronoun', { 'PERSON' => enumeration(:first),
|
96
99
|
'GENDER' => enumeration(:feminine, :masculine) })
|
97
100
|
add_entry('if', 'SubordinatingConjunction')
|
98
101
|
add_entry('in', 'Preposition')
|
99
102
|
add_entry('inside', 'Preposition')
|
100
103
|
add_entry('it', 'PersonalPronoun', { 'PERSON' => enumeration(:third),
|
101
|
-
'PARADIGM' => [identifier, 'ppn_3rd_paradigm']})
|
104
|
+
'PARADIGM' => [identifier, 'ppn_3rd_paradigm'] })
|
102
105
|
add_entry('its', 'PossessiveDeterminer', { 'PERSON' => enumeration(:third),
|
103
|
-
'PARADIGM' => [identifier, 'possdet_3rd_paradigm']})
|
106
|
+
'PARADIGM' => [identifier, 'possdet_3rd_paradigm'] })
|
104
107
|
add_entry('kind', 'CommonNoun')
|
105
108
|
add_entry('know', 'IrregularVerbKnow') do
|
106
109
|
forms past_simple: 'knew', past_participle: 'known'
|
@@ -120,13 +123,13 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
120
123
|
add_entry('more', 'Adverb')
|
121
124
|
add_entry('move', 'RegularVerb')
|
122
125
|
add_entry('much', 'Adverb')
|
123
|
-
add_entry('my', 'PossessiveDeterminer',{ 'PERSON' => enumeration(:first),
|
124
|
-
'GENDER' => enumeration(:feminine, :masculine)})
|
126
|
+
add_entry('my', 'PossessiveDeterminer', { 'PERSON' => enumeration(:first),
|
127
|
+
'GENDER' => enumeration(:feminine, :masculine) })
|
125
128
|
add_entry('near', 'Preposition')
|
126
129
|
add_entry('near to', 'Preposition')
|
127
130
|
add_entry('now', 'Adverb')
|
128
|
-
add_entry('now', 'CommonNoun', {'NUMBER' => enumeration(:singular),
|
129
|
-
'PARADIGM' => [identifier, 'Singular_only']})
|
131
|
+
add_entry('now', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
|
132
|
+
'PARADIGM' => [identifier, 'Singular_only'] })
|
130
133
|
add_entry('not', 'AdverbNot')
|
131
134
|
add_entry('of', 'PrepositionOf')
|
132
135
|
add_entry('on', 'Preposition')
|
@@ -136,10 +139,10 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
136
139
|
add_entry('or', 'Coordinator')
|
137
140
|
add_entry('other', 'Adjective')
|
138
141
|
add_entry('part', 'CommonNoun')
|
139
|
-
add_entry('people', 'CommonNoun', {'NUMBER' => enumeration(:plural),
|
140
|
-
'PARADIGM' => [identifier, 'Plural_only']})
|
141
|
-
add_entry('person', 'CommonNoun', {'NUMBER' => enumeration(:singular),
|
142
|
-
'PARADIGM' => [identifier, 'Singular_only']})
|
142
|
+
add_entry('people', 'CommonNoun', { 'NUMBER' => enumeration(:plural),
|
143
|
+
'PARADIGM' => [identifier, 'Plural_only'] })
|
144
|
+
add_entry('person', 'CommonNoun', { 'NUMBER' => enumeration(:singular),
|
145
|
+
'PARADIGM' => [identifier, 'Singular_only'] })
|
143
146
|
add_entry('place', 'CommonNoun')
|
144
147
|
add_entry('same', 'Adjective')
|
145
148
|
add_entry('same', 'Pronoun')
|
@@ -188,10 +191,10 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
188
191
|
add_entry('word', 'CommonNoun')
|
189
192
|
add_entry('you', 'PersonalPronoun', { 'PERSON' => enumeration(:second),
|
190
193
|
'GENDER' => enumeration(:feminine, :masculine),
|
191
|
-
'PARADIGM' => [identifier, 'ppn_2nd_paradigm']})
|
194
|
+
'PARADIGM' => [identifier, 'ppn_2nd_paradigm'] })
|
192
195
|
add_entry('your', 'PossessiveDeterminer', { 'PERSON' => enumeration(:second),
|
193
196
|
'GENDER' => enumeration(:feminine, :masculine),
|
194
|
-
'PARADIGM' => [identifier, 'possdet_2nd_paradigm']})
|
197
|
+
'PARADIGM' => [identifier, 'possdet_2nd_paradigm'] })
|
195
198
|
|
196
199
|
# Punctuation signs...
|
197
200
|
add_entry(':', 'Colon')
|
@@ -200,4 +203,4 @@ unless defined?(Zenlish::Lang::Dictionary)
|
|
200
203
|
add_entry('"', 'Quote')
|
201
204
|
end # module
|
202
205
|
end # module
|
203
|
-
end # defined?
|
206
|
+
end # defined?
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../trie/trie'
|
4
|
+
|
5
|
+
module Zenlish
|
6
|
+
module Lang
|
7
|
+
class Lemmatizer
|
8
|
+
# @return [Trie:Trie] Trie (aka prefix tree) with all word forms from dictionary.
|
9
|
+
attr_reader :trie
|
10
|
+
|
11
|
+
def initialize(aLexicon)
|
12
|
+
@trie = Trie::Trie.new
|
13
|
+
initialize_trie(aLexicon)
|
14
|
+
end
|
15
|
+
|
16
|
+
def lemmatize(aWordForm, _hints = nil)
|
17
|
+
node = trie.search(aWordForm)
|
18
|
+
node&.value
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def initialize_trie(aLexicon)
|
24
|
+
aLexicon.entries.each do |ent|
|
25
|
+
citation_form = ent.lemma
|
26
|
+
ent.lexemes.each do |lxm|
|
27
|
+
if lxm.wclass.kind_of?(Zenlish::WClasses::WordClass)
|
28
|
+
if lxm.wclass.invariable?
|
29
|
+
trie.add(citation_form, lxm)
|
30
|
+
else
|
31
|
+
w_forms = lxm.all_inflections
|
32
|
+
w_forms.each { |form| trie.add(form, lxm) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end # class
|
39
|
+
end # module
|
40
|
+
end # module
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Grammar for a simple subset of English language
|
2
4
|
# It is called Zenlish
|
3
5
|
|
@@ -6,7 +8,7 @@ require_relative 'dictionary'
|
|
6
8
|
|
7
9
|
########################################
|
8
10
|
# Define a grammar for a highly English-like language
|
9
|
-
builder = Rley::
|
11
|
+
builder = Rley::grammar_builder do
|
10
12
|
add_terminals(*Zenlish::Lang::Dictionary.terminals)
|
11
13
|
|
12
14
|
rule 'zenlish' => 'prose'
|
@@ -19,7 +21,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
|
|
19
21
|
#################
|
20
22
|
# Simple sentence
|
21
23
|
#################
|
22
|
-
rule 'simple_sentence' =>
|
24
|
+
rule 'simple_sentence' => 'front_adverb simple_sentence'
|
23
25
|
rule 'front_adverb' => 'AdverbMaybe'
|
24
26
|
rule 'front_adverb' => 'Adverb'
|
25
27
|
rule 'simple_sentence' => 'declarative_simple_sentence'
|
@@ -107,7 +109,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
|
|
107
109
|
rule 'comparative_start' => 'ComparativeParticle'
|
108
110
|
rule 'conjunctive_prefix' => 'ConjunctivePronoun noun_phrase verb_phrase'
|
109
111
|
rule 'identifying_clause' => 'RelativePronoun tense_verb_phrase'
|
110
|
-
rule 'relative_clause_opt' =>
|
112
|
+
rule 'relative_clause_opt' => 'relative_clause'
|
111
113
|
rule 'relative_clause_opt' => []
|
112
114
|
rule 'relative_clause' => 'RelativePronoun tense_phrase'
|
113
115
|
# Sentence 3-Bxa 'Lisa sees a living thing that is very big.
|
@@ -294,7 +296,7 @@ builder = Rley::Syntax::GrammarBuilder.new do
|
|
294
296
|
# complementation by a verb: gerund -ing form...
|
295
297
|
rule 'preposition_object' => 'noun_phrase_opt lexical_verb post_head_vp'
|
296
298
|
# preposition_object => "a gerund (a verb form ending in "-ing") that acts as a noun # Example: He beat Lee without overly trying.
|
297
|
-
rule 'preposition_object' => 'conjunctive_prefix'
|
299
|
+
rule 'preposition_object' => 'conjunctive_prefix' # It's obvious from _what he said_.
|
298
300
|
rule 'preposition_object' => []
|
299
301
|
|
300
302
|
######################
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../wclasses/all_word_classes'
|
2
4
|
require_relative 'lexicon'
|
3
5
|
|
@@ -7,7 +9,7 @@ module Zenlish
|
|
7
9
|
# Factory method. Helps in creating an "empty" lexicon.
|
8
10
|
# It just contains the word classes of Zenlish but no headwords.
|
9
11
|
# @return [Lexicon] the created lexicon object
|
10
|
-
def create_empty_lexicon
|
12
|
+
def create_empty_lexicon
|
11
13
|
lexicon = Lexicon.new
|
12
14
|
|
13
15
|
add_word_classes(lexicon)
|
@@ -73,7 +75,6 @@ module Zenlish
|
|
73
75
|
def add_wclass(aLexicon, aClass)
|
74
76
|
aLexicon.add_terminal(aClass.new.freeze)
|
75
77
|
end
|
76
|
-
|
77
78
|
end # module
|
78
79
|
end # module
|
79
80
|
end # module
|
data/lib/zenlish/lex/lexeme.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../feature/feature_struct_def_bearer'
|
2
4
|
module Zenlish
|
3
5
|
module Lex
|
@@ -20,7 +22,7 @@ module Zenlish
|
|
20
22
|
anEntry.add_lexeme(self)
|
21
23
|
if aWClass.kind_of?(WClasses::WordClass)
|
22
24
|
unless wclass.extension.nil?
|
23
|
-
|
25
|
+
extend(wclass.extension)
|
24
26
|
init_extension(self)
|
25
27
|
end
|
26
28
|
p_struct = aWClass.kind_of?(WClasses::WordClass) ? aWClass.struct : nil
|
@@ -41,11 +43,11 @@ module Zenlish
|
|
41
43
|
table = paradigm
|
42
44
|
table.inflect(self, constraints)
|
43
45
|
end
|
44
|
-
|
46
|
+
|
45
47
|
def all_inflections
|
46
48
|
table = paradigm
|
47
49
|
table.all_inflections(self)
|
48
|
-
end
|
50
|
+
end
|
49
51
|
|
50
52
|
# @return [String] the base (dictionary) form.
|
51
53
|
def lemma
|
@@ -62,4 +64,4 @@ module Zenlish
|
|
62
64
|
alias base_form lemma
|
63
65
|
end # class
|
64
66
|
end # module
|
65
|
-
end # module
|
67
|
+
end # module
|
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Zenlish
|
2
4
|
module Lex
|
3
5
|
# TODO: document
|
4
6
|
class LexicalEntry
|
5
|
-
|
7
|
+
# @return [String] the lemma (dictionary) form of a word.
|
6
8
|
attr_reader :lemma
|
7
9
|
|
8
10
|
# @return [Array<Lexeme, Rley::Syntax::Terminal>]
|
9
11
|
attr_reader :lexemes
|
10
12
|
|
11
|
-
# @param theLemma [String] lemma (= citation form), a word form used
|
13
|
+
# @param theLemma [String] lemma (= citation form), a word form used
|
12
14
|
# conventionnaly to represent a lexeme.
|
13
15
|
# @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
|
14
16
|
def initialize(theLemma, aLexeme = nil)
|
@@ -17,10 +19,10 @@ module Zenlish
|
|
17
19
|
add_lexeme(aLexeme)
|
18
20
|
end
|
19
21
|
|
20
|
-
# @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
|
22
|
+
# @param aLexeme [Lexeme, NilClass] the lexeme to link with lexical entry.
|
21
23
|
def add_lexeme(aLexeme)
|
22
24
|
lexemes << aLexeme if aLexeme
|
23
25
|
end
|
24
26
|
end # class
|
25
27
|
end # module
|
26
|
-
end # module
|
28
|
+
end # module
|
data/lib/zenlish/lex/lexicon.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Zenlish
|
2
4
|
module Lex
|
3
5
|
# A lexicon is a collection of lexical entries.
|
@@ -5,7 +7,7 @@ module Zenlish
|
|
5
7
|
class Lexicon
|
6
8
|
# @return [Array<Lex::LexicalEntry>] entries in the lexicon
|
7
9
|
attr_reader :entries
|
8
|
-
|
10
|
+
|
9
11
|
# @return [Hash{String => Lex::LexicalEntry}] the lexical entry for the given lemma.
|
10
12
|
attr_reader :lemma2entry
|
11
13
|
|
@@ -23,7 +25,7 @@ module Zenlish
|
|
23
25
|
end
|
24
26
|
|
25
27
|
# @param aLemma[String] retrieve the lexeme form the given "head word".
|
26
|
-
# @param aWordClass [WordClasses::WordClass, NilClass] the word class of
|
28
|
+
# @param aWordClass [WordClasses::WordClass, NilClass] the word class of
|
27
29
|
# the lexeme.
|
28
30
|
# @return [Lex::Lexeme]
|
29
31
|
def get_lexeme(aLemma, aWordClass = nil)
|
@@ -83,7 +85,6 @@ module Zenlish
|
|
83
85
|
aHash[aKey] = aValue
|
84
86
|
end
|
85
87
|
end
|
86
|
-
|
87
88
|
end # class
|
88
89
|
end # module
|
89
90
|
end # module
|
data/lib/zenlish/lex/literal.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rley'
|
2
4
|
|
3
5
|
module Zenlish
|
@@ -7,7 +9,7 @@ module Zenlish
|
|
7
9
|
attr_reader :zlexeme
|
8
10
|
|
9
11
|
# initialize(theLexeme, aTerminal, aPosition) ⇒ Token
|
10
|
-
# @param literalText [String] the portion of input text that represents
|
12
|
+
# @param literalText [String] the portion of input text that represents
|
11
13
|
# an occurence of the lexeme.
|
12
14
|
# @param aLexeme [Lex::Lexeme] the lexeme matched by the literal text.
|
13
15
|
# @param aPosition [Integer] the position of the literal in the input.
|