zenlish 0.2.05 → 0.2.06

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +455 -0
  3. data/CHANGELOG.md +11 -0
  4. data/Gemfile +5 -3
  5. data/Rakefile +5 -3
  6. data/lib/zenlish/feature/boolean_domain.rb +6 -4
  7. data/lib/zenlish/feature/boolean_value.rb +3 -2
  8. data/lib/zenlish/feature/enumeration_domain.rb +5 -2
  9. data/lib/zenlish/feature/feature.rb +9 -7
  10. data/lib/zenlish/feature/feature_def.rb +9 -6
  11. data/lib/zenlish/feature/feature_domain.rb +4 -2
  12. data/lib/zenlish/feature/feature_struct.rb +3 -1
  13. data/lib/zenlish/feature/feature_struct_def.rb +5 -1
  14. data/lib/zenlish/feature/feature_struct_def_bearer.rb +6 -4
  15. data/lib/zenlish/feature/feature_value.rb +4 -2
  16. data/lib/zenlish/feature/identifier_domain.rb +5 -3
  17. data/lib/zenlish/feature/identifier_value.rb +3 -2
  18. data/lib/zenlish/feature/symbol_value.rb +3 -1
  19. data/lib/zenlish/inflect/atomic_o_expression.rb +2 -1
  20. data/lib/zenlish/inflect/composite_o_expression.rb +3 -1
  21. data/lib/zenlish/inflect/concatenation.rb +3 -2
  22. data/lib/zenlish/inflect/equals_literal.rb +3 -1
  23. data/lib/zenlish/inflect/feature_heading.rb +2 -5
  24. data/lib/zenlish/inflect/formal_argument.rb +3 -1
  25. data/lib/zenlish/inflect/function_call.rb +4 -1
  26. data/lib/zenlish/inflect/heading.rb +2 -0
  27. data/lib/zenlish/inflect/inflection_rule.rb +2 -0
  28. data/lib/zenlish/inflect/inflection_table.rb +6 -4
  29. data/lib/zenlish/inflect/inflection_table_builder.rb +21 -18
  30. data/lib/zenlish/inflect/input_asis.rb +3 -0
  31. data/lib/zenlish/inflect/input_expression.rb +4 -2
  32. data/lib/zenlish/inflect/literal_asis.rb +4 -1
  33. data/lib/zenlish/inflect/matches_pattern.rb +2 -0
  34. data/lib/zenlish/inflect/membership.rb +2 -0
  35. data/lib/zenlish/inflect/method_heading.rb +3 -6
  36. data/lib/zenlish/inflect/not_equals_literal.rb +2 -0
  37. data/lib/zenlish/inflect/nullary_input_expression.rb +3 -1
  38. data/lib/zenlish/inflect/output_expression.rb +2 -0
  39. data/lib/zenlish/inflect/substitution.rb +3 -1
  40. data/lib/zenlish/inflect/unary_input_expression.rb +4 -1
  41. data/lib/zenlish/inflect/unconditionally_true.rb +4 -2
  42. data/lib/zenlish/lang/dictionary.rb +19 -16
  43. data/lib/zenlish/lang/lemmatizer.rb +40 -0
  44. data/lib/zenlish/lang/zenlish_grammar.rb +6 -4
  45. data/lib/zenlish/lex/empty_lexicon_factory.rb +3 -2
  46. data/lib/zenlish/lex/lexeme.rb +6 -4
  47. data/lib/zenlish/lex/lexical_entry.rb +6 -4
  48. data/lib/zenlish/lex/lexicon.rb +4 -3
  49. data/lib/zenlish/lex/literal.rb +3 -1
  50. data/lib/zenlish/lexer/lexer.rb +144 -0
  51. data/lib/zenlish/trie/base_trie_node.rb +27 -0
  52. data/lib/zenlish/trie/trie.rb +132 -0
  53. data/lib/zenlish/trie/trie_node.rb +21 -0
  54. data/lib/zenlish/trie/trie_root.rb +10 -0
  55. data/lib/zenlish/version.rb +3 -1
  56. data/lib/zenlish/wclasses/adjective.rb +4 -2
  57. data/lib/zenlish/wclasses/adverb.rb +3 -1
  58. data/lib/zenlish/wclasses/adverb_maybe.rb +3 -1
  59. data/lib/zenlish/wclasses/adverb_not.rb +2 -0
  60. data/lib/zenlish/wclasses/all_word_classes.rb +3 -1
  61. data/lib/zenlish/wclasses/article.rb +2 -0
  62. data/lib/zenlish/wclasses/auxiliary.rb +2 -0
  63. data/lib/zenlish/wclasses/auxiliary_be.rb +7 -6
  64. data/lib/zenlish/wclasses/auxiliary_do.rb +6 -5
  65. data/lib/zenlish/wclasses/cardinal.rb +3 -1
  66. data/lib/zenlish/wclasses/common_noun.rb +2 -0
  67. data/lib/zenlish/wclasses/comparative_particle.rb +5 -3
  68. data/lib/zenlish/wclasses/conjunction.rb +2 -0
  69. data/lib/zenlish/wclasses/conjunctive_pronoun.rb +2 -0
  70. data/lib/zenlish/wclasses/coordinator.rb +4 -2
  71. data/lib/zenlish/wclasses/definite_article.rb +2 -0
  72. data/lib/zenlish/wclasses/degree_adverb.rb +2 -0
  73. data/lib/zenlish/wclasses/demonstrative_determiner.rb +6 -4
  74. data/lib/zenlish/wclasses/demonstrative_pronoun.rb +2 -0
  75. data/lib/zenlish/wclasses/determiner.rb +3 -1
  76. data/lib/zenlish/wclasses/distributive_determiner.rb +2 -0
  77. data/lib/zenlish/wclasses/existential_there.rb +2 -0
  78. data/lib/zenlish/wclasses/fronting_quantifier.rb +3 -1
  79. data/lib/zenlish/wclasses/indefinite_article.rb +2 -0
  80. data/lib/zenlish/wclasses/indefinite_pronoun.rb +3 -1
  81. data/lib/zenlish/wclasses/irregular_linking_verb.rb +3 -1
  82. data/lib/zenlish/wclasses/irregular_verb.rb +13 -15
  83. data/lib/zenlish/wclasses/irregular_verb_be.rb +8 -7
  84. data/lib/zenlish/wclasses/irregular_verb_can.rb +8 -7
  85. data/lib/zenlish/wclasses/irregular_verb_do.rb +7 -6
  86. data/lib/zenlish/wclasses/irregular_verb_extension.rb +8 -6
  87. data/lib/zenlish/wclasses/irregular_verb_have.rb +12 -11
  88. data/lib/zenlish/wclasses/irregular_verb_know.rb +3 -1
  89. data/lib/zenlish/wclasses/irregular_verb_say.rb +3 -1
  90. data/lib/zenlish/wclasses/irregular_verb_think.rb +3 -1
  91. data/lib/zenlish/wclasses/lexical_verb.rb +3 -4
  92. data/lib/zenlish/wclasses/linking_adverb.rb +2 -0
  93. data/lib/zenlish/wclasses/modal_verb_can.rb +7 -5
  94. data/lib/zenlish/wclasses/noun.rb +4 -2
  95. data/lib/zenlish/wclasses/numeral.rb +2 -0
  96. data/lib/zenlish/wclasses/personal_pronoun.rb +8 -6
  97. data/lib/zenlish/wclasses/possessive_determiner.rb +13 -12
  98. data/lib/zenlish/wclasses/preposition.rb +3 -1
  99. data/lib/zenlish/wclasses/preposition_of.rb +2 -0
  100. data/lib/zenlish/wclasses/preposition_than.rb +2 -0
  101. data/lib/zenlish/wclasses/pronoun.rb +3 -1
  102. data/lib/zenlish/wclasses/proper_noun.rb +10 -8
  103. data/lib/zenlish/wclasses/quantifier.rb +3 -1
  104. data/lib/zenlish/wclasses/regular_verb.rb +9 -9
  105. data/lib/zenlish/wclasses/regular_verb_want.rb +4 -2
  106. data/lib/zenlish/wclasses/relative_pronoun.rb +4 -2
  107. data/lib/zenlish/wclasses/subordinating_conjunction.rb +7 -5
  108. data/lib/zenlish/wclasses/verb.rb +5 -3
  109. data/lib/zenlish/wclasses/word_class.rb +7 -5
  110. data/spec/spec_helper.rb +3 -1
  111. data/spec/zenlish/feature/boolean_domain_spec.rb +2 -2
  112. data/spec/zenlish/feature/boolean_value_spec.rb +1 -1
  113. data/spec/zenlish/feature/enumeration_domain_spec.rb +7 -7
  114. data/spec/zenlish/feature/feature_spec.rb +3 -3
  115. data/spec/zenlish/feature/feature_struct_def_bearer_spec.rb +10 -8
  116. data/spec/zenlish/feature/feature_struct_def_spec.rb +3 -2
  117. data/spec/zenlish/feature/identifier_domain_spec.rb +3 -3
  118. data/spec/zenlish/feature/identifier_value_spec.rb +4 -4
  119. data/spec/zenlish/feature/symbol_value_spec.rb +3 -3
  120. data/spec/zenlish/inflect/concatenation_spec.rb +7 -7
  121. data/spec/zenlish/inflect/feature_heading_spec.rb +9 -9
  122. data/spec/zenlish/inflect/formal_argument_spec.rb +2 -2
  123. data/spec/zenlish/inflect/function_call_spec.rb +4 -4
  124. data/spec/zenlish/inflect/inflection_rule_spec.rb +9 -5
  125. data/spec/zenlish/inflect/inflection_table_builder_spec.rb +26 -21
  126. data/spec/zenlish/inflect/inflection_table_spec.rb +18 -16
  127. data/spec/zenlish/inflect/input_asis_spec.rb +2 -6
  128. data/spec/zenlish/inflect/literal_asis_spec.rb +3 -3
  129. data/spec/zenlish/inflect/matches_pattern_spec.rb +1 -1
  130. data/spec/zenlish/inflect/membership_spec.rb +2 -2
  131. data/spec/zenlish/inflect/method_heading_spec.rb +3 -3
  132. data/spec/zenlish/inflect/substitution_spec.rb +1 -1
  133. data/spec/zenlish/inflect/unconditionally_true_spec.rb +2 -2
  134. data/spec/zenlish/lang/dictionary_spec.rb +11 -12
  135. data/spec/zenlish/lang/lemmatizer_spec.rb +43 -0
  136. data/spec/zenlish/lang/zenlish_grammar_spec.rb +2 -2
  137. data/spec/zenlish/lex/lexeme_spec.rb +11 -12
  138. data/spec/zenlish/lex/lexical_entry_spec.rb +1 -2
  139. data/spec/zenlish/lex/lexicon_spec.rb +9 -8
  140. data/spec/zenlish/lex/literal_spec.rb +2 -2
  141. data/spec/zenlish/lexer/lexer_spec.rb +52 -0
  142. data/spec/zenlish/parser/lesson1_spec.rb +2 -2
  143. data/spec/zenlish/parser/lesson2_spec.rb +31 -36
  144. data/spec/zenlish/parser/lesson3_spec.rb +98 -138
  145. data/spec/zenlish/parser/zparser_spec.rb +2 -1
  146. data/spec/zenlish/support/minimal_lexicon.rb +2 -0
  147. data/spec/zenlish/support/var2word.rb +18 -9
  148. data/spec/zenlish/trie/base_trie_node_spec.rb +33 -0
  149. data/spec/zenlish/trie/trie_spec.rb +108 -0
  150. data/spec/zenlish/wclasses/common_noun_spec.rb +6 -10
  151. data/spec/zenlish/wclasses/demonstrative_determiner_spec.rb +2 -2
  152. data/spec/zenlish/wclasses/irregular_verb_can_spec.rb +9 -9
  153. data/spec/zenlish/wclasses/irregular_verb_spec.rb +9 -9
  154. data/spec/zenlish/wclasses/lexical_verb_spec.rb +3 -3
  155. data/spec/zenlish/wclasses/modal_verb_can_spec.rb +4 -4
  156. data/spec/zenlish/wclasses/personal_pronoun_spec.rb +6 -9
  157. data/spec/zenlish/wclasses/possessive_determiner_spec.rb +19 -22
  158. data/spec/zenlish/wclasses/regular_verb_spec.rb +20 -20
  159. data/spec/zenlish/wclasses/regular_verb_want_spec.rb +30 -0
  160. data/spec/zenlish_spec.rb +3 -1
  161. data/zenlish.gemspec +17 -14
  162. metadata +26 -9
@@ -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,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../feature/feature'
2
4
  require_relative '../feature/feature_def'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
3
5
  # An inflection rule has two-parts:
@@ -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, idx|
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
- vector_1 = heading_matches.shift
64
- all_combos = vector_1.product(*heading_matches)
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
- # DecisionTable: Common_form
17
- # | NUMBER | .base_form | Common_form |
18
- # | singular | X | base_form |
19
- # | plural | ~ /[^aeiouy]y$/ | sub(base_form, /y$/, "ies")|
20
- # | plural | X | base_form + "s" |
21
- # build('Common_form') do
22
- # feature_heading 'NUMBER'
23
- # method_heading 'base_form'
24
- # | NUMBER | base_form | Common_form |
25
- # rule [equals(:singular), dont_care ], col('base_form')
26
- # rule [equals(:plural) , matches(/[^aeiouy]y$/)], sub(col('base_form'), /y$/, 'ies')
27
- # rule [equals(:plural) , dont_care ], concat(col('base_form'), 's')
28
- # end
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.add_heading(hd) if 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.add_heading(hd) if 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.add_rule(rl) if 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,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 :formal
7
9
 
8
10
  def initialize(anArgument)
11
+ super()
9
12
  @formal = anArgument
10
13
  end
11
14
 
@@ -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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'unary_input_expression'
2
4
 
3
5
  module Zenlish
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'input_expression'
2
4
 
3
5
  module Zenlish
@@ -5,4 +7,4 @@ module Zenlish
5
7
  class NullaryInputExpression < InputExpression
6
8
  end # class
7
9
  end # module
8
- end # module
10
+ end # module
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Zenlish
2
4
  module Inflect
3
5
  class OutputExpression
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'literal_asis'
2
4
  require_relative 'composite_o_expression'
3
5
 
@@ -62,4 +64,4 @@ module Zenlish
62
64
  end
63
65
  end # class
64
66
  end # module
65
- end # module
67
+ 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
- self.extend(Feature::FeatureStructDefBearer)
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