Skip to content

Commit 8ffe9a0

Browse files
committed
Add Ukrainian stemmer
1 parent feaf125 commit 8ffe9a0

File tree

6 files changed

+588
-268
lines changed

6 files changed

+588
-268
lines changed

algorithms/ukrainian.sbl

Lines changed: 212 additions & 91 deletions
Large diffs are not rendered by default.

explanations/russian.sbl.explanation

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ backwardmode (
119119
// but not 'им' 'уем' // present passive participle
120120
// or 'енн' // adjective from past passive participle
121121

122-
'ивш' 'ывш' // past active participle // брод|ивших несб|ывшееся
122+
'ивш' 'ывш' // past active participle // брод|ивших несб|ывш(ее(ся))
123123
'ующ' // present active participle // несуществ|ующий
124124
(delete)
125125
)
@@ -129,7 +129,7 @@ backwardmode (
129129

130130
define reflexive as (
131131
[substring] among (
132-
'ся' // осек|ся
132+
'ся' // осек|ся несбывшее|ся
133133
'сь' // ввы|сь
134134
(delete)
135135
)

explanations/ukrainian.sbl.utf

Lines changed: 212 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ stringdef ia '{U+044F}'
3838
stringdef apostrophe '{U+0027}'
3939

4040
routines ( mark_regions R2
41-
// perfective_gerund
41+
perfective_gerund
4242
adjective
4343
adjectival
44-
// reflexive
45-
// verb
46-
// noun
44+
reflexive
45+
verb
46+
noun
4747
// derivational
4848
// tidy_up
4949
)
@@ -70,35 +70,62 @@ backwardmode (
7070

7171
define R2 as $p2 <= cursor
7272

73-
// define perfective_gerund as (
74-
// [substring] among (
75-
// // 'в'
76-
// // 'вші'
77-
// // 'вшіс{'}'
78-
// // ('а' or 'я' delete)
79-
// // 'ів'
80-
// // 'івші'
81-
// // 'івшіс{'}'
82-
// // 'ив'
83-
// // 'ивші'
84-
// // 'ившіс{'}'
85-
// // (delete)
86-
// )
87-
// )
73+
define perfective_gerund as (
74+
[substring] among (
75+
// 'в'
76+
// 'вші'
77+
// 'вшіс{'}'
78+
// ('а' or 'я' delete)
79+
// 'ів'
80+
// 'івші'
81+
// 'івшіс{'}'
82+
// 'ив'
83+
// 'ивші'
84+
// 'ившіс{'}'
85+
// (delete)
86+
87+
'в' // донаписа|в дороби|в дороби|в
88+
'вши' // написа|вши зроби|вши
89+
'вшись' // оберіга|вшись спакува|вшись
90+
'вшися' // оберіга|вшися сподіва|вшися
91+
// ('а' or 'я' delete) ???
92+
'учи' // пиш|учи рев|учи
93+
'ючи' // ся|ючи підпису|ючи
94+
'ючись' // змага|ючись
95+
'ючися' // навча|ючися
96+
'ачи' // бач|ачи
97+
'ачись' // бач|ачись
98+
'ачися' // бач|ачися
99+
'лячи' // роб|лячи люб|лячи
100+
'лячись' // бав|лячись
101+
'лячися' // бав|лячися
102+
'ячи' // сид|ячи вовтуз|ячи
103+
'ячись' // ???
104+
'ячися' // ???
105+
(delete)
106+
)
107+
)
88108

89109
define adjective as (
90110
[substring] among (
91-
'ього'
92-
(delete)
93111
// 'ее' 'іе' 'ие' 'ое' 'імі' 'имі'
94-
// 'ей' 'ій' 'ий' 'ой' 'ем' 'ім'
95-
// 'им' 'ом' 'еґо' 'оґо' 'ему'
96-
// 'ому' 'іх' 'их' 'ую' 'юю' 'ая'
97-
// 'яя'
98-
// // and -
99-
// 'ою' // - which is somewhat archaic
112+
// 'ей' 'ой' 'ем'
113+
// 'ом' 'еґо' 'оґо' 'ему'
114+
// 'ую' 'юю' 'ая'
100115
// 'ею' // - soft form of ою
101116
// (delete)
117+
118+
'ий' 'ого' 'ому' 'им' 'ім' // зелен|ий зелен|ого зелен|ому зелен|им зелен|ім
119+
'іший' 'ішого' 'ішому' 'ішим' 'ішім' // зелен|іший зелен|ішого зелен|ішому зелен|ішим зелен|ішім
120+
'е' 'іше' // зелен|е зелен|іше
121+
'а' 'ої' 'ій' 'у' 'ою' // зелен|а зелен|ої зелен|ій зелен|у зелен|ою
122+
'іша' 'ішої' 'ішій' 'ішу' 'ішою' // зелен|іша зелен|ішої зелен|ішій зелен|ішу зелен|ішою
123+
'і' 'их' 'ими' // зелен|і зелен|их зелен|ими
124+
'іші' 'іших' 'ішими' // зелен|іші зелен|іших зелен|ішими
125+
'ього' 'ьому' // верхн|ього верхн|ьому
126+
'я' 'ьої' 'ю' 'ьою' // верхн|я верхн|ьої верхн|ю верхн|ьою
127+
'іх' 'іми' // верхн|іх верхн|іми
128+
(delete)
102129
)
103130
)
104131

@@ -110,71 +137,134 @@ backwardmode (
110137
errors. Removing im, uem, enn creates too many errors.
111138
*/
112139

113-
// try (
114-
// [substring] among (
115-
// // 'ем' // present passive participle
116-
// // 'нн' // adjective from past passive participle
117-
// // 'вш' // past active participle
118-
// // 'ющ' 'щ' // present active participle
119-
// // ('а' or 'я' delete)
140+
try (
141+
[substring] among (
142+
// 'ем' // present passive participle
143+
// 'нн' // adjective from past passive participle
144+
// 'вш' // past active participle
145+
// 'ющ' 'щ' // present active participle
146+
// ('а' or 'я' delete)
120147

121-
// // //but not 'ім' 'уем' // present passive participle
122-
// // //or 'енн' // adjective from past passive participle
148+
// //but not 'ім' 'уем' // present passive participle
149+
// //or 'енн' // adjective from past passive participle
123150

124-
// // 'івш' 'ивш'// past active participle
125-
// // 'ующ' // present active participle
126-
// // (delete)
127-
// )
128-
// )
151+
// 'івш' 'ивш'// past active participle
152+
// 'ующ' // present active participle
153+
// (delete)
154+
155+
'ячий' 'ячого' 'ячому' 'ячим' 'ячім' // сид|ячий сид|ячого сид|ячому сид|ячим сид|ячім
156+
'яча' 'яче' 'ячої' 'ячій' 'ячу' 'ячою' // сид|яча сид|яче сид|ячої сид|ячій сид|ячу сид|ячою
157+
'ячі' 'ячих' 'ячими' // сид|ячі сид|ячих сид|ячими
158+
'ачий' 'ачого' 'ачому' 'ачим' 'ачім' // дриж|ачий дриж|ачого дриж|ачому дриж|ачим дриж|ачім
159+
'ача' 'аче' 'ачої' 'ачій' 'ачу' 'ачою' // дриж|ача дриж|аче дриж|ачої дриж|ачій дриж|ачу дриж|ачою
160+
'ачі' 'ачих' 'ачими' // дриж|ачі дриж|ачих дриж |ачими
161+
'ючий' 'ючого' 'ючому' 'ючим' 'ючім' // далені|ючий далені|ючого даленію|ючому далені|ючим далені|ючім
162+
'юча' 'юче' 'ючої' 'ючій' 'ючу' 'ючою' // далені|юча далені|юче далені|ючої даленію|ючій далені|ючу далені|ючою
163+
'ючі' 'ючих' 'ючими' // далені|ючі далені|ючих далені|ючими
164+
'учий' 'учого' 'учому' 'учим' 'учім' // пиш|учий далені|учого пиш|учому пиш|учим пиш|учім
165+
'уча' 'уче' 'учої' 'учій' 'учу' 'учою' // пиш|уча пиш|уче пиш|учої пиш|учій пиш|учу пиш|учою
166+
'учі' 'учих' 'учими' // пиш|учі пиш|учих пиш|учими
167+
'ений' 'еного' 'еному' 'еним' 'енім' // втрач|ений втрач|еного втрач|еному втрач|еним втрач|енім
168+
'ена' 'ене' 'еної' 'еній' 'ену' 'еною' // втрач|ена втрач|ене втрач|еної втрач|еній втрач|ену втрач|еною
169+
'ені' 'ених' 'еними' // втрач|ені втрач|ених втрач|еними
170+
(delete)
171+
)
172+
)
129173

130174
)
131175

132-
// define reflexive as (
133-
// [substring] among (
134-
// // 'ся'
135-
// // 'с{'}'
136-
// // (delete)
137-
// )
138-
// )
176+
define reflexive as (
177+
[substring] among (
178+
// 'ся'
179+
// 'с{'}'
180+
// (delete)
139181

140-
// define verb as (
141-
// [substring] among (
142-
// // 'ла' 'на' 'ете' 'йте' 'лі' 'й'
143-
// // 'л' 'ем' 'н' 'ло' 'но' 'ет' 'ют'
144-
// // 'ни' 'т{'}' 'еш{'}'
145-
146-
// // 'нно'
147-
// // ('а' or 'я' delete)
148-
149-
// // 'іла' 'ила' 'ена' 'ейте'
150-
// // 'уйте' 'іте' 'ілі' 'илі' 'ей'
151-
// // 'уй' 'іл' 'ил' 'ім' 'им' 'ен'
152-
// // 'іло' 'ило' 'ено' 'ят' 'ует'
153-
// // 'уют' 'іт' 'ит' 'ени' 'іт{'}'
154-
// // 'ит{'}' 'іш{'}' 'ую' 'ю'
155-
// // (delete)
156-
// /* note the short passive participle tests:
157-
// 'на' 'н' 'но' 'ни'
158-
// 'ена' 'ен' 'ено' 'ени'
159-
// */
160-
// )
161-
// )
182+
'ся' // осік|ся
183+
'сь' // недонавчи|сь
184+
'тися' // би|тися
185+
'тись' // боро|тись
186+
// 'ться' // роби|ться ???
187+
'іться' // подруж|іться
188+
'теся' // бав|теся
189+
'йся' // вдума|йся
190+
'йтеся' // вдума|йтеся
191+
'вся' 'лася' 'лося' 'лися' // вчи|вся вчи|лася вчи|лося вчи|лися
192+
'всь' 'лась' 'лось' 'лись' // вчи|всь вчи|лась вчи|лось вчи|лись
193+
'юся' 'єшся' 'ється' 'ємося' 'єтеся' 'ються' // смі|юся смі|єшся смі|ється смі|ємося смі|єтеся смі|ються
194+
'уся' 'ешся' 'еться' 'емося' 'етеся' 'уться' // спиш|уся спиш|ешся спиш|еться спиш|емося спиш|етеся спиш|уться
195+
'люся' 'ишся' 'иться' 'имося' 'итеся' 'ляться'// див|люся див|ишся див|иться див|имося див|итеся див|ляться
196+
'їшся' 'їться' 'їмося' 'їтеся' 'яться' // бо|їшся бо|їться бо|їмося бо|їтеся бо|яться
197+
'аться' // бач|аться
198+
(delete)
199+
)
200+
)
162201

163-
// define noun as (
164-
// [substring] among (
165-
// // 'а' 'ев' 'ов' 'іе' '{'}е' 'е'
166-
// // 'іямі' 'ямі' 'амі' 'еі' 'іі'
167-
// // 'і' 'іей' 'ей' 'ой' 'ій' 'й'
168-
// // 'іям' 'ям' 'іем' 'ем' 'ам' 'ом'
169-
// // 'о' 'у' 'ах' 'іях' 'ях' 'и' '{'}'
170-
// // 'ію' '{'}ю' 'ю' 'ія' '{'}я' 'я'
171-
// // (delete)
172-
// /* the small class of neuter forms 'ені' 'енем'
173-
// 'ена' 'ен' 'енам' 'енамі' 'ена{x}'
174-
// omitted - they only occur on 12 words.
175-
// */
176-
// )
177-
// )
202+
define verb as (
203+
[substring] among (
204+
// 'на' 'лі'
205+
// 'л' 'ем' 'н' 'но' 'ет' 'ют'
206+
// 'ни' 'т{'}' 'еш{'}'
207+
208+
// 'нно'
209+
// ('а' or 'я' delete)
210+
211+
// 'іла' 'ила' 'ена' 'ейте'
212+
// 'уйте' 'іте' 'ілі' 'илі' 'ей'
213+
// 'уй' 'іл' 'ил' 'ім' 'им' 'ен'
214+
// 'іло' 'ило' 'ено' 'ят' 'ует'
215+
// 'уют' 'іт' 'ит' 'ени' 'іт{'}'
216+
// 'ит{'}' 'іш{'}' 'ую'
217+
// (delete)
218+
/* note the short passive participle tests:
219+
'на' 'н' 'но' 'ни'
220+
'ена' 'ен' 'ено' 'ени'
221+
*/
222+
223+
'ти' // працюва|ти
224+
// 'ть' // роби|ть ???
225+
'іть' // роб|іть
226+
'те' // відправ|те
227+
'й' // чита|й
228+
'йте' // дума|йте
229+
'в' 'ла' 'ло' 'ли' // чита|в чита|ла чита|ло чита|ли
230+
'ю' 'єш' 'є' 'ємо' 'єте' 'ють' // чита|ю чита|єш чита|є чита|ємо чита|єте чита|ють
231+
'у' 'еш' 'е' 'емо' 'ете' 'уть' // пиш|у пиш|еш пиш|е пиш|емо пиш|ете пиш|уть
232+
'лю' 'иш' 'ить' 'имо' 'ите' 'лять' // роб|лю роб|иш роб|ить роб|имо роб|ите роб|лять
233+
'їш' 'їть' 'їмо' 'їте' 'ять' // сто|їш сто|їть сто|їмо сто|їте сто|ять
234+
'ать' // бач|ать
235+
(delete)
236+
)
237+
)
238+
239+
define noun as (
240+
[substring] among (
241+
// 'а' 'ев' 'ов' 'іе' '{'}е' 'е'
242+
// 'іямі' 'ямі' 'амі' 'еі' 'іі'
243+
// 'і' 'іей' 'ей' 'ой' 'ій' 'й'
244+
// 'іям' 'ям' 'іем' 'ем' 'ам' 'ом'
245+
// 'о' 'у' 'ах' 'іях' 'ях' 'и' '{'}'
246+
// 'ію' '{'}ю' 'ю' 'ія' '{'}я' 'я'
247+
// (delete)
248+
/* the small class of neuter forms 'ені' 'енем'
249+
'ена' 'ен' 'енам' 'енамі' 'ена{x}'
250+
omitted - they only occur on 12 words.
251+
*/
252+
253+
'а' 'и' 'і' 'у' 'ою' 'о' // вод|а вод|и вод|і вод|у вод|ою вод|о
254+
'ам' 'ами' 'ах' // вод|ам вод|ами вод|ах
255+
'я' 'ю' 'ею' 'е' // пісн|я пісн|ю пісн|ею пісн|е
256+
'ям' 'ями' 'ях' // пісн|ям пісн|ями пісн|ях
257+
'ові' 'ом' // батьк|ові батьк|ом
258+
'ець' 'ем' // олів|ець олівц|ем
259+
'ень' // зел|ень
260+
'ій' // ген|ій
261+
'й' // сара|й
262+
'ой' // гер|ой
263+
'ь' // совіст|ь
264+
'ію' 'ії' // комед|ію комед|ії
265+
(delete)
266+
)
267+
)
178268

179269
// define derivational as (
180270
// [substring] R2 among (
@@ -208,16 +298,47 @@ define stem as (
208298
do mark_regions
209299
backwards setlimit tomark pV for (
210300
do (
211-
adjectival
212-
// perfective_gerund or
213-
// ( try reflexive
214-
// adjectival or verb or noun
215-
// )
301+
// TEST:
302+
// reflexive
303+
// verb
304+
// noun
305+
306+
perfective_gerund or
307+
( try reflexive
308+
adjectival or verb or noun
309+
)
216310
)
217-
// try([ 'і' ] delete)
311+
try([ 'і' ] delete)
218312
// because noun ending -iю is being treated as verb ending -ю
219313

220314
// do derivational
221315
// do tidy_up
222316
)
223317
)
318+
319+
320+
// ToDo:
321+
// 1. Ґ => Г
322+
// do repeat ( goto (['ґ]) <- 'г' ) // угнетённый => угнетен
323+
// 2. Видалити всі типи Апострофів 'ʼ`
324+
325+
// 3. Додатково перевірити слова:
326+
// брати
327+
// беруть
328+
329+
// дописати
330+
// допишуть
331+
332+
// посиденьки
333+
334+
// лікар
335+
// лікарів
336+
337+
// ----- прислівники? - куди попаде?
338+
// добре - добро
339+
// часто - частіший
340+
// довго - довгий
341+
// чисто - чистіший
342+
343+
// робитимуть - ?
344+
// робитим

runtime/utilities.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ static int slice_check(struct SN_env * z) {
415415
z->p == NULL ||
416416
z->l > SIZE(z->p)) /* this line could be removed */
417417
{
418-
#if 0
418+
#if 1
419419
fprintf(stderr, "faulty slice operation:\n");
420420
debug(z, -1, 0);
421421
#endif
@@ -490,7 +490,7 @@ extern int len_utf8(const symbol * p) {
490490
return len;
491491
}
492492

493-
#if 0
493+
#if 1
494494
extern void debug(struct SN_env * z, int number, int line_count) {
495495
int i;
496496
int limit = SIZE(z->p);

tests/algorithms/russian_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
'ющ щ' => %w[сталкива|ющихся спеша|щих
3232
умоля|ющими блестя|щему],
3333

34-
'ивш ывш' => %w[брод|ивших несб|ывшееся],
34+
'ивш ывш' => %w[брод|ивших несб|ывшееся], # несб|ывш(ее(ся))
3535
'ующ' => %w[несуществ|ующий]
3636
}
3737

0 commit comments

Comments
 (0)