Yurii Paniv commited on
Commit
ed1082e
1 Parent(s): 57f344b

Proper translit PoC

Browse files
README.md CHANGED
@@ -1,2 +1,7 @@
1
  # qirimli-tts
2
  Text-to-Speech for Crimean Tatar language
 
 
 
 
 
 
1
  # qirimli-tts
2
  Text-to-Speech for Crimean Tatar language
3
+
4
+
5
+ # Attibution
6
+
7
+ Transliteration: [prosvita/crh.transliteration](https://github.com/prosvita/crh.transliteration)
crh_transliterator/__init__.py ADDED
File without changes
crh_transliterator/cyr_to_lat.py ADDED
@@ -0,0 +1,597 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ mappings = [
2
+ ["«", '"'],
3
+ ["»", '"'],
4
+ # 0. словарик
5
+ # алейкум
6
+ ["алейкум", "aleyküm"],
7
+ # бейуде
8
+ ["бейуде", "beyüde"],
9
+ # большевик
10
+ ["большевик", "bolşevik"],
11
+ # борнен
12
+ ["борнен", "bornen"],
13
+ # бугунь
14
+ ["([\s\"'\(\)\-.,:;!?>\]])бугун", "\1bugün"],
15
+ # бузкесен
16
+ ["бузкесен", "buzkesen"],
17
+ # буксир
18
+ ["буксир", "buksir"],
19
+ # бульбуль
20
+ ["бульбуль", "bülbül"],
21
+ # бульвар
22
+ ["бульвар", "bulvar"],
23
+ # бульдозер
24
+ ["бульдозер", "buldozer"],
25
+ # бульон
26
+ ["бульон", "bulyon"],
27
+ # бунен
28
+ ["бунен", "bunen"],
29
+ ["буннен", "bunnen"],
30
+ # бус-бутюн
31
+ ["бус-бутюн", "büs-bütün"],
32
+ # бутерброд
33
+ ["бутерброд", "buterbrod"],
34
+ # буфер и буфет
35
+ ["буфе([рт])", "bufe\1"],
36
+ # буюк
37
+ ["буюк([^ъ])", "büyük\1"],
38
+ # формы глагола буюмек
39
+ ["бую([гдйлмнпрстчшc])(и)", "büyü\1\2"],
40
+ # буюп
41
+ ["([\s\"'\(\)\-.,:;!?>\]])буюп([\s\"'.,:;!?\)\-\[<])", "\1büyüp\2"],
42
+ # буют
43
+ ["буют([^ыа])", "büyüt\1"],
44
+ # гонъюль
45
+ ["гонъюл", "göñül"],
46
+ # горизонт
47
+ ["горизонт", "gorizont"],
48
+ # госпиталь
49
+ ["госпиталь", "gospital"],
50
+ # гунях
51
+ ["гунях", "günâh"],
52
+ # гуна
53
+ ["гуна", "güna"],
54
+ # гургуль
55
+ ["гургуль", "gürgül"],
56
+ # гуя
57
+ ["гуя", "güya"],
58
+ # ёлнен
59
+ ["ёлнен", "yolnen"],
60
+ # зумбуль
61
+ ["зумбуль", "zümbül"],
62
+ # кодекс
63
+ ["кодекс", "kodeks"],
64
+ # кодификация и однокоренные
65
+ ["кодифик", "kodifik"],
66
+ # козь
67
+ ["козь([^я])", "köz\1"],
68
+ # кой
69
+ ["кой([\s\"'.,:;!?\)\-\[<])", "köy\1"],
70
+ ["койнинъ([\s\"'.,:;!?\)\-\[<])", "köyniñ\1"],
71
+ ["койни([\s\"'.,:;!?\)\-\[<])", "köyni\1"],
72
+ ["койге([\s\"'.,:;!?\)\-\[<])", "köyge\1"],
73
+ ["койде([\s\"'.,:;!?\)\-\[<])", "köyde\1"],
74
+ ["койдеки([\s\"'.,:;!?\)\-\[<])", "köydeki\1"],
75
+ ["койден([\s\"'.,:;!?\)\-\[<])", "köyden\1"],
76
+ ["койлю", "köylü"],
77
+ ["([\s\"'\(\)\-.,:;!?>\]])кою", "\1köyü"],
78
+ # ком-кок
79
+ ["([\s\"'\(\)\-.,:;!?>\]])ком-кок", "\1köm-kök"],
80
+ # кок
81
+ ["([\s\"'\(\)\-.,:;!?>\]])кок([^еёюяЕЁЮЯ])", "\1kök\2"],
82
+ # кокос
83
+ ["кокос", "kokos"],
84
+ # коллега и однокоренные
85
+ ["коллег", "kolleg"],
86
+ ["коллега", "kollega"],
87
+ # коллекция, коллектив и однокоренные
88
+ ["коллек([цт])", "kollek\1"],
89
+ # комбинат и однокоренные
90
+ ["комбин", "kombin"],
91
+ # комедия
92
+ ["комедия", "komediya"],
93
+ # комендант и однокоренные
94
+ ["коменда", "komenda"],
95
+ # комета
96
+ ["комета", "kometa"],
97
+ # комиссия, комитет
98
+ ["коми([ст])", "komi\1"],
99
+ # комментарий и однокоренные
100
+ ["коммент", "komment"],
101
+ # коммерция и коммерсант
102
+ ["коммер([сц])", "kommer\1"],
103
+ # компенсация и однокоренные
104
+ ["компенс", "kompens"],
105
+ # компиляция и однокоренные
106
+ ["компил", "kompil"],
107
+ # компьютер
108
+ ["компьютер", "kompyuter"],
109
+ # конвейер
110
+ ["конвейер", "konveyer"],
111
+ # конвенция и однокоренные
112
+ ["конвен", "konven"],
113
+ # конверт
114
+ ["конверт", "konvert"],
115
+ # конденсатор и однокоренные
116
+ ["конденс", "kondens"],
117
+ # кондитер
118
+ ["кондитер", "konditer"],
119
+ # коник (конический)
120
+ ["коник", "konik"],
121
+ # консер
122
+ ["консерв", "konserv"],
123
+ # контейнер
124
+ ["контейнер", "konteyner"],
125
+ # континент
126
+ ["континент", "kontinent"],
127
+ # конференция, конфет
128
+ ["конфе", "konfe"],
129
+ # конфискация и однокоренные
130
+ ["конфискац", "konfiskats"],
131
+ # концентрация и однокоренные
132
+ ["концен", "kontsen"],
133
+ # концерт
134
+ ["концерт", "kontsert"],
135
+ # коньки
136
+ ["коньки", "konki"],
137
+ # коньки
138
+ ["коньяк", "konyak"],
139
+ # конъюктура
140
+ ["конъюктур", "konyuktur"],
141
+ # копирлемек и однокоренные
142
+ ["копирле", "kopirle"],
143
+ # копия
144
+ ["копия", "kopiya"],
145
+ # коп
146
+ ["([\s\"'\(\)\-.,:;!?>\]])коп([^еёюяЕЁЮЯ])", "\1köp\2"],
147
+ # корея
148
+ ["корея", "koreya"],
149
+ # корректор, корреспондент
150
+ ["корре", "korre"],
151
+ # коридор
152
+ ["коридор", "koridor"],
153
+ # косметика
154
+ ["косме", "kosme"],
155
+ # костюм
156
+ ["костюм", "kostüm"],
157
+ # космик (космический)
158
+ ["космик", "kosmik"],
159
+ # котировка
160
+ ["котировка", "kotirovka"],
161
+ # котлет
162
+ ["котлет", "kotlet"],
163
+ # коше
164
+ ["коше", "köşe"],
165
+ # куе
166
+ ["([\s\"'\(\)\-.,:;!?>\]])куе", "\1küye"],
167
+ # кулинар
168
+ ["кулинар", "kulinar"],
169
+ # кульминация
170
+ ["кульминац", "kulminats"],
171
+ # культивация
172
+ ["культив", "kultiv"],
173
+ # культура
174
+ ["культура", "kultura"],
175
+ # курьк
176
+ ["([\s\"'\(\)\-.,:;!?>\]])курк([\s\"'.,:;!?\)\-\[<])", "\1kürk\2"],
177
+ ["([\s\"'\(\)\-.,:;!?>\]])куркке", "\1kürkke"],
178
+ ["([\s\"'\(\)\-.,:;!?>\]])куркни", "\1kürkni"],
179
+ ["([\s\"'\(\)\-.,:;!?>\]])куркте", "\1kürkte"],
180
+ ["([\s\"'\(\)\-.,:;!?>\]])куркчи", "\1kürkçi"],
181
+ ["([\s\"'\(\)\-.,:;!?>\]])куркчю", "\1kürkçü"],
182
+ # курсив
183
+ ["курсив", "kursiv"],
184
+ # кушкулемек и однокоренные
185
+ ["кушку", "küşkü"],
186
+ # куюк
187
+ ["куюк", "küyük"],
188
+ # медьюн
189
+ ["медьюн", "medyun"],
190
+ # месуль
191
+ ["месуль", "mesül"],
192
+ ["месули", "mesüli"],
193
+ # мефкуре
194
+ ["мефкуре", "mefküre"],
195
+ # могедек
196
+ ["могедек", "mögedek"],
197
+ # муурь
198
+ ["муур", "müür"],
199
+ # муче
200
+ ["муче", "müçe"],
201
+ # муюз
202
+ ["муюз", "müyüz"],
203
+ # нумюне
204
+ ["нумюне", "nümüne"],
205
+ # ог
206
+ ['(["\s(-])ог([^ъ])', "\1öг\2"],
207
+ # одеколон
208
+ ["одеколон", "odekolon"],
209
+ # океан
210
+ ["океан", "okean"],
211
+ # …ольчер
212
+ ["ольчер", "ölçer"],
213
+ # олимп
214
+ ["олимп", "olimp"],
215
+ # онен
216
+ ["онен", "onen"],
217
+ ["оннен", "onnen"],
218
+ # операция и однокоренные
219
+ ["опера", "opera"],
220
+ # опция и однокоренные
221
+ ["опция", "optsiya"],
222
+ ["опци", "optsi"],
223
+ # орден и ордер
224
+ ["([\s\"'\(\)\-.,:;!?>\]])орде([нр])", "\1orde\2"],
225
+ # оригинал
226
+ ["оригинал", "original"],
227
+ # ориентир
228
+ ["ориент", "oriyent"],
229
+ # оркестр
230
+ ["оркестр", "orkestr"],
231
+ # офис
232
+ ["офис", "ofis"],
233
+ # офицер
234
+ ["офицер", "ofitser"],
235
+ # офсет
236
+ ["офсет", "ofset"],
237
+ # оюннен
238
+ ["оюннен", "oyunnen"],
239
+ # публикация и однокоренные
240
+ ["публик", "publik"],
241
+ # публицистика и однокоренные
242
+ ["публиц", "publits"],
243
+ # сурет
244
+ ["сурет", "süret"],
245
+ # ультиматум и однокоренные
246
+ ["ультимат", "ultimat"],
247
+ # ультра
248
+ ["ультра", "ultra"],
249
+ # уника
250
+ ["([\s\"'\(\)\-.,:;!?>\]])уник", "\1unik"],
251
+ # универcаль, универмаг, университет
252
+ ["универ", "univer"],
253
+ # унтер
254
+ ["([\s\"'\(\)\-.,:;!?>\]])унтер", "\1unter"],
255
+ # урьян
256
+ ["урьян", "uryan"],
257
+ # джонк
258
+ ["джонкю", "cönkü"],
259
+ ["джонк([^ъ])", "cönk\1"],
260
+ # джуньджу
261
+ ["джуньджу", "cüncü"],
262
+ # шовинизм и однокоренные
263
+ ["шовини", "şovini"],
264
+ # шоссе
265
+ ["шоссе", "şosse"],
266
+ # шофёр
267
+ ["шоф[её]р", "şoför"],
268
+ # шунен
269
+ ["шунен", "şunen"],
270
+ ["шуннен", "şunnen"],
271
+ # юз
272
+ ["([\s\"'\(\)\-.,:;!?>\]])юз([\s\"'.,:;!?\)\-\[<])", "\1yüz\2"],
273
+ # юзбашы
274
+ ["([\s\"'\(\)\-.,:;!?>\]])юзбашы", "\1yüzbaşı"],
275
+ # юзйыллыкъ
276
+ ["([\s\"'\(\)\-.,:;!?>\]])юзйыл", "\1yüzyıl"],
277
+ # юк
278
+ ["([\s\"'\(\)\-.,:;!?>\]])юк([^ъ])", "\1yüк\2"],
279
+ # юрип
280
+ ["([\s\"'\(\)\-.,:;!?>\]])юрип", "\1yürip"],
281
+ # 3-юнджи, 4-юнджи
282
+ ["([34])-юнджи", "\1-ünci"],
283
+ # некоторые глагольные формы на -ама, -алма
284
+ # букама, букалма
285
+ ["([\s\"'\(\)\-.,:;!?>\]])букама", "\1bükama"],
286
+ ["([\s\"'\(\)\-.,:;!?>\]])букалма", "\1bükalma"],
287
+ # комама, комалма
288
+ ["([\s\"'\(\)\-.,:;!?>\]])комама", "\1kömama"],
289
+ ["([\s\"'\(\)\-.,:;!?>\]])комалма", "\1kömalma"],
290
+ # корама, коралма
291
+ ["([\s\"'\(\)\-.,:;!?>\]])корама", "\1körama"],
292
+ ["([\s\"'\(\)\-.,:;!?>\]])коралма", "\1köralma"],
293
+ # кочама, кочалма
294
+ ["([\s\"'\(\)\-.,:;!?>\]])кочама", "\1köçama"],
295
+ ["([\s\"'\(\)\-.,:;!?>\]])кочалма", "\1köçalma"],
296
+ # куяма, куялма
297
+ ["([\s\"'\(\)\-.,:;!?>\]])куяма", "\1küyama"],
298
+ ["([\s\"'\(\)\-.,:;!?>\]])куялма", "\1küyalma"],
299
+ # кулама, кулалма
300
+ # [ "([\s\"'\(\)\-.,:;!?>\]])кулама", "\1külama" ],
301
+ # [ "([\s\"'\(\)\-.,:;!?>\]])кулалма", "\1külalma" ],
302
+ # кусама, кусалма
303
+ ["([\s\"'\(\)\-.,:;!?>\]])кусама", "\1küsama"],
304
+ ["([\s\"'\(\)\-.,:;!?>\]])кусалма", "\1küsalma"],
305
+ # кутама, куталма
306
+ ["([\s\"'\(\)\-.,:;!?>\]])кутама", "\1kütama"],
307
+ ["([\s\"'\(\)\-.,:;!?>\]])куталма", "\1kütalma"],
308
+ # опама, опалма
309
+ ["([\s\"'\(\)\-.,:;!?>\]])опама", "\1öpama"],
310
+ ["([\s\"'\(\)\-.,:;!?>\]])опалма", "\1öpalma"],
311
+ # осама, осалма
312
+ ["([\s\"'\(\)\-.,:;!?>\]])осама", "\1ösama"],
313
+ ["([\s\"'\(\)\-.,:;!?>\]])осалма", "\1ösalma"],
314
+ # отама, оталма
315
+ # [ "([\s\"'\(\)\-.,:;!?>\]])отама", "\1ötama" ],
316
+ ["([\s\"'\(\)\-.,:;!?>\]])оталма", "\1ötalma"],
317
+ # узама, узалма
318
+ # [ "([\s\"'\(\)\-.,:;!?>\]])узама", "\1üzama" ],
319
+ ["([\s\"'\(\)\-.,:;!?>\]])узалма", "\1üzalma"],
320
+ # утама, уталма
321
+ ["([\s\"'\(\)\-.,:;!?>\]])утама", "\1ütama"],
322
+ ["([\s\"'\(\)\-.,:;!?>\]])уталма", "\1ütalma"],
323
+ # Имена собственные
324
+ ["аджыумер", "acıümer"],
325
+ ["аджыусеин", "acıüsein"],
326
+ ["боливия", "boliviya"],
327
+ ["([\s\"'\(\)\-.,:;!?>\]])ишунь", "\1işün"],
328
+ ["корбекул", "körbekül"],
329
+ ["корьбекул", "körbekül"],
330
+ ["куркулет", "kürkület"],
331
+ ["къарагоз", "qaragöz"],
332
+ ["къуртумер", "qurtümer"],
333
+ ["къуртусеин", "qurtüsein"],
334
+ ["марьино", "maryino"],
335
+ ["одесса", "odessa"],
336
+ ["одеса", "odesa"],
337
+ ["потелов", "potelov"],
338
+ ["пушкин", "puşkin"],
339
+ ["сеитумер", "seitümer"],
340
+ ["сеитусеин", "seitüsein"],
341
+ ["сейитумер", "seyitümer"],
342
+ ["сейитусеин", "seyitüsein"],
343
+ ["щёлкино", "şçolkino"],
344
+ ["эмирусеин", "emirüsein"],
345
+ ["юртер", "yurter"],
346
+ ["ющенко", "yuşçenko"],
347
+ # -ьон
348
+ ["([^\s])ьон", "\1yon"],
349
+ # Я
350
+ [
351
+ "([\s\"'\(\)\-.,:;!?>\]])Я([\s\"'.,:;!?\)\-\[<])",
352
+ "\1Ya\2",
353
+ ], # TODO: check why there is no case for small letters
354
+ # Ё
355
+ ["([\s\"'\(\)\-.,:;!?>\]])Ё([\s\"'.,:;!?\)\-\[<])", "\1Yo\2"],
356
+ # йе
357
+ ["йе", "yye"],
358
+ # йя
359
+ ["йя", "yya"],
360
+ # 1. буквы гъ, къ, нъ, дж
361
+ ["гъ", "ğ"],
362
+ ["къ", "q"],
363
+ ["нъ", "ñ"],
364
+ ["дж", "c"],
365
+ # 2. o', u' первый заход - ё и ю после согласных
366
+ ["([бвгджзйклмнпрстфхцчшщñcБВГДЖЗЙКЛМНПРСТФХЦЧШЩÑC])ю", "\1ü"],
367
+ ["([бвгджзйклмнпрстфхцчшщñcБВГДЖЗЙКЛМНПРСТФХЦЧШЩÑC])ё", "\1ö"],
368
+ # 3. o', u' второй заход
369
+ # буква u'
370
+ # ю
371
+ [
372
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёюАЫОУЕИЁЮ])ю([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеюэü])',
373
+ "\1yü\2\3\4",
374
+ ],
375
+ [
376
+ '([\s"\'\(\)\-.,:;!?>\]"АЫОУЕИЁЮ])Ю([БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ЬЕЮЭÜ])',
377
+ "\1YÜ\2\3\4",
378
+ ],
379
+ [
380
+ '([\s"\'\(\)\-.,:;!?>\]"(аыоуеиёюАЫОУЕИЁЮ])ю([бвгджзйклмнпрстфхцчшщcñ])([ьеюэü])',
381
+ "\1yü\2\3",
382
+ ],
383
+ [
384
+ '([\s"\'\(\)\-.,:;!?>\]"(АЫОУЕИЁЮ])Ю([БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ЬЕЮЭÜ])',
385
+ "\1YÜ\2\3",
386
+ ],
387
+ ["ю([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеюэü])", "yü\1\2\3"],
388
+ ["ю([бвгджзйклмнпрстфхцчшщcñ])([ьеюэü])", "yü\1\2"],
389
+ # у и ую
390
+ # после у или ую две согласных
391
+ # строчная у
392
+ [
393
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкмпшcБГКМПCШ])у([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
394
+ "\1\2ü\3\4\5",
395
+ ],
396
+ [
397
+ "([\s\"'\(\)\-.,:;!?>\]])у([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
398
+ "\1ü\2\3\4",
399
+ ],
400
+ [
401
+ "([\s\"'\(\)\-.,:;!?>\]])ую([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
402
+ "\1üyü\2\3\4",
403
+ ],
404
+ # заглавная У
405
+ [
406
+ "([\s\"'\(\)\-.,:;!?>\]])([бг��мпшcБГКМПШC])У([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
407
+ "\1\2Ü\3\4\5",
408
+ ],
409
+ [
410
+ "([\s\"'\(\)\-.,:;!?>\]])У([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
411
+ "\1Ü\2\3\4",
412
+ ],
413
+ [
414
+ "([\s\"'\(\)\-.,:;!?>\]])Ую([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
415
+ "\1Üyü\2\3\4",
416
+ ],
417
+ [
418
+ "([\s\"'\(\)\-.,:;!?>\]])УЮ([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
419
+ "\1ÜYÜ\2\3\4",
420
+ ],
421
+ # после у или ую одна согласная
422
+ # строчная у
423
+ [
424
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкмпшcБГКМПШC])у([бвгджзйклмнпрстфхцчшщycñ])([ьеёиюэü])",
425
+ "\1\2ü\3\4",
426
+ ],
427
+ ["([\s\"'\(\)\-.,:;!?>\]])у([бвгджзйклмнпрстфхцчшщycñ])([ьеёиюэü])", "\1ü\2\3"],
428
+ ["([\s\"'\(\)\-.,:;!?>\]])ую([бвгджзйклмнпрстфхцчшщycñ])([ьеёиюэü])", "\1üyü\2\3"],
429
+ # заглавная У
430
+ [
431
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкмпшcБГКМПШC])У([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
432
+ "\1\2Ü\3\4",
433
+ ],
434
+ [
435
+ "([\s\"'\(\)\-.,:;!?>\]])У([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
436
+ "\1Ü\2\3",
437
+ ],
438
+ [
439
+ "([\s\"'\(\)\-.,:;!?>\]])Ую([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
440
+ "\1Üyü\2\3",
441
+ ],
442
+ [
443
+ "([\s\"'\(\)\-.,:;!?>\]])УЮ([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
444
+ "\1ÜYÜ\2\3",
445
+ ],
446
+ # ещё один заход (не помню уже точно для чего он, но для чего-то нужен)
447
+ [
448
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкмпшcБГКМПШC])у([бвгджзйклмнпрстфхцчшщycñ])([ьеёиюэü])",
449
+ "\1\2ü\3\4",
450
+ ],
451
+ ["([\s\"'\(\)\-.,:;!?>\]])у([бвгджзйклмнпрстфхцчшщycñ])([ьеёиюэü])", "\1ü\2\3"],
452
+ [
453
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкмпшcБГКМПШC])У([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
454
+ "\1\2Ü\3\4",
455
+ ],
456
+ [
457
+ "([\s\"'\(\)\-.,:;!?>\]])У([бвгджзйклмнпрстфхцчшщcñyБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюüэЬЕЁИЮЭÜ])",
458
+ "\1Ü\2\3",
459
+ ],
460
+ # арабские слова на муи- муэ-
461
+ ["([\s\"'\(\)\-.,:;!?>\]])му([иэ])", "\1mü\2"],
462
+ # буква o'
463
+ # ё
464
+ [
465
+ "([\s\"'\(\)\-.,:;!?>\]])ё([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеюü])",
466
+ "\1yö\2\3\4",
467
+ ],
468
+ [
469
+ "([\s\"'\(\)\-.,:;!?>\]])Ё([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеюü])",
470
+ "\1Yö\2\3\4",
471
+ ],
472
+ [
473
+ "([\s\"'\(\)\-.,:;!?>\]])Ё([БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([БВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ЬЕЮÜ])",
474
+ "\1YÖ\2\3\4",
475
+ ],
476
+ ["([\s\"'\(\)\-.,:;!?>\]])ё([бвгджзйклмнпрстфхцчшщcñ])([ьеёюэü])", "\1yö\2\3"],
477
+ # о
478
+ # после о две согласных
479
+ [
480
+ "([\s\"'\(\)\-.,:;!?>\]])([бгкшcБГКШC])о([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
481
+ "\1\2ö\3\4\5",
482
+ ],
483
+ [
484
+ "([\s\"'\(\)\-.,:;!?>\]])о([бвгджзйклмнпрстфхцчшщcñ])([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
485
+ "\1ö\2\3\4",
486
+ ],
487
+ [
488
+ "([\s\"'\(\)\-.,:;!?>\]])([-\s\"'(бгкшcБГКШC])О([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
489
+ "\1\2Ö\3\4\5",
490
+ ],
491
+ # после о одна согласная
492
+ [
493
+ "([\s\"'\(\)\-.,:;!?>\]])О([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
494
+ "\1Ö\2\3\4",
495
+ ],
496
+ [
497
+ "([\s\"'\(\)\-.,:;!?>\]])([-\s\"'(бгкшcБГКШC])о([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])",
498
+ "\1\2ö\3\4",
499
+ ],
500
+ ["([\s\"'\(\)\-.,:;!?>\]])о([бвгджзйклмнпрстфхцчшщcñ])([ьеёиюэü])", "\1ö\2\3"],
501
+ [
502
+ "([\s\"'\(\)\-.,:;!?>\]])([-\s\"'(бгкшcБГКШC])О([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
503
+ "\1\2Ö\3\4",
504
+ ],
505
+ [
506
+ "([\s\"'\(\)\-.,:;!?>\]])О([бвгджзйклмнпрстфхцчшщcñБВГДЖЗЙКЛМНПРСТФХЦЧШЩCÑ])([ьеёиюэüЬЕЁИЮЭÜ])",
507
+ "\1Ö\2\3",
508
+ ],
509
+ # 4. o', u' третий заход
510
+ ["([бвгджзйклмнпрстфхцчшщcñ])ю", "\1ü"],
511
+ ["([бвгджзйклмнпрстфхцчшщcñ])ё", "\1ö"],
512
+ # 5. o', u' четвёртый заход
513
+ ["([ьеёюэöü])ю", "\1yü"],
514
+ # 6. буквы е и я
515
+ # случаи е -> ye и я -> ya
516
+ ['([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöüeАЫОУЕИЁЭЮЯЬЪÖÜE(])е', "\1ye"],
517
+ [
518
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöüeАЫОУЕИЁЭЮЯЬЪÖÜE(])Е([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ\s"\'.,:;!?\)\-\[<])',
519
+ "\1YE\2",
520
+ ],
521
+ [
522
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöÜeАЫОЯУЕИЁЭЮЯЬЪÖÜE(])Е([абвгдеёжзийклмнопрстуфхцчшщъыьэюяqcğñüö])',
523
+ "\1Ye\2",
524
+ ],
525
+ ['([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪE(])я', "\1ya"],
526
+ [
527
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪE(])Я([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ\s"\'.,:;!?\)\-\[<])',
528
+ "\1YA\2",
529
+ ],
530
+ [
531
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪE(])Я([абвгдеёжзийклмнопрстуфхцчшщъыьэюяqcğñüö])',
532
+ "\1Ya\2",
533
+ ],
534
+ ['([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöüaeАЫОУЕИЁЭЮЯЬЪÖÜAE(])е', "\1ye"],
535
+ [
536
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöüaeАЫОУЕИЁЭЮЯЬЪÖÜAE(])Е([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ\s"\'.,:;!?\)\-\[<])',
537
+ "\1YE\2",
538
+ ],
539
+ [
540
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяьъöÜaeАЫОУЕИЁЭЮЯЬЪÖÜAE(])Е([абвгдеёжзийклмнопрстуфхцчшщъыьэюяqcğñüö])',
541
+ "\1Ye\2",
542
+ ],
543
+ ['([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъaeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪAE(])я', "\1ya"],
544
+ [
545
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъaeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪAE(])Я([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ\s"\'.,:;!?\)\-\[<])',
546
+ "\1YA\2",
547
+ ],
548
+ [
549
+ '([\s"\'\(\)\-.,:;!?>\]"аыоуеиёэюяöÜñqğьъaeАЫОУЕИЁЭЮЯÖÜÑQĞЬЪAE(])Я([абвгдеёжзийклмнопрстуфхцчшщъыьэюяqcğñüö])',
550
+ "\1Ya\2",
551
+ ],
552
+ # остальные вхождения е и я
553
+ ["е", "e"],
554
+ ["я", "â"],
555
+ # 7. все оставшиеся вхождения о, у, ё, ю
556
+ ["Ю([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ])", "YU\1"],
557
+ ["ю", "yu"],
558
+ ["Ё([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ])", "YO\1"],
559
+ ["ё", "yo"],
560
+ ["у", "u"],
561
+ ["о", "o"],
562
+ # 8. убираем ь и ъ
563
+ ["ь", ""],
564
+ ["ъ", ""],
565
+ # 9. все остальные буквы
566
+ # заглавные Ц и Щ
567
+ ["Ц([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ])", "TS\1"],
568
+ ["Ц", "Ts"],
569
+ ["Щ([АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯQCĞÑÜÖ])", "ŞÇ\1"],
570
+ ["Щ", "Şç"],
571
+ # строчные
572
+ ["а", "a"],
573
+ ["б", "b"],
574
+ ["в", "v"],
575
+ ["г", "g"],
576
+ ["д", "d"],
577
+ ["ж", "j"],
578
+ ["з", "z"],
579
+ ["и", "i"],
580
+ ["й", "y"],
581
+ ["к", "k"],
582
+ ["л", "l"],
583
+ ["м", "m"],
584
+ ["н", "n"],
585
+ ["п", "p"],
586
+ ["р", "r"],
587
+ ["с", "s"],
588
+ ["т", "t"],
589
+ ["ф", "f"],
590
+ ["х", "h"],
591
+ ["ц", "ts"],
592
+ ["ч", "ç"],
593
+ ["ш", "ş"],
594
+ ["щ", "şç"],
595
+ ["ы", "ı"],
596
+ ["э", "e"],
597
+ ]
crh_transliterator/transliterator.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .cyr_to_lat import mappings
2
+ import re
3
+
4
+
5
+ def transliterate(text: str):
6
+ text = text.lower() # always treat lowercase
7
+ text = " " + text + " "
8
+
9
+ for mapping in mappings:
10
+ text = re.sub(mapping[0], mapping[1], text)
11
+
12
+ return text[1:-1]
pytest.ini CHANGED
@@ -1,3 +1,3 @@
1
  # pytest.ini
2
  [pytest]
3
- addopts = --cov --cov-report html --cov-report xml --cov-report term --cov-branch --ignore=tests
 
1
  # pytest.ini
2
  [pytest]
3
+ addopts = --cov --cov-report html --cov-report xml --cov-report term --cov-branch
tests/test_converter.py CHANGED
@@ -1,20 +1,31 @@
1
  import converter
 
2
  from tabulate import tabulate
3
 
4
 
5
- def test_cyrillic_converter():
6
  cases = _read_test_cases()
 
7
  for case in cases:
8
- assert converter.to_cyrillic(case[0]) == case[1]
 
 
 
 
 
 
 
 
 
9
 
10
 
11
- def test_latin_converter():
12
  cases = _read_test_cases()
13
  failed = []
14
  for case in cases:
15
- if converter.to_latin(case[1]).lower() != case[0].lower():
16
  failed.append(
17
- (case[1].lower(), converter.to_latin(case[1]).lower(), case[0].lower())
18
  )
19
  if len(failed) > 0:
20
  failed_rows = "\n".join([str(item) for item in failed])
 
1
  import converter
2
+ from crh_transliterator.transliterator import transliterate
3
  from tabulate import tabulate
4
 
5
 
6
+ def test_latin_converter():
7
  cases = _read_test_cases()
8
+ failed = []
9
  for case in cases:
10
+ if converter.to_latin(case[1]).lower() != case[0].lower():
11
+ failed.append(
12
+ (case[1].lower(), converter.to_latin(case[1]).lower(), case[0].lower())
13
+ )
14
+ if len(failed) > 0:
15
+ failed_rows = "\n".join([str(item) for item in failed])
16
+ raise Exception(
17
+ f"Failed {len(failed)}/{len(cases)} ({round((len(failed)/len(cases))*100,2)}%) cases.\n"
18
+ + tabulate(failed, headers=["Original", "Converted", "Ground truth"])
19
+ )
20
 
21
 
22
+ def test_transliterator():
23
  cases = _read_test_cases()
24
  failed = []
25
  for case in cases:
26
+ if transliterate(case[1]).lower() != case[0].lower():
27
  failed.append(
28
+ (case[1].lower(), transliterate(case[1]).lower(), case[0].lower())
29
  )
30
  if len(failed) > 0:
31
  failed_rows = "\n".join([str(item) for item in failed])