Coverage for src/wiktextract/extractor/ru/tags.py: 85%
41 statements
« prev ^ index » next coverage.py v7.9.0, created at 2025-06-13 07:43 +0000
« prev ^ index » next coverage.py v7.9.0, created at 2025-06-13 07:43 +0000
1from typing import Union
3from .models import WordEntry
5# https://ru.wiktionary.org/wiki/Викисловарь:Условные_сокращения
6# Стиль
7STYLE_TAGS: dict[str, Union[str, list[str]]] = {
8 "бран.": "offensive",
9 "вульг.": "vulgar",
10 "высок.": "honorific",
11 "гипокор.": "familiar",
12 "груб.": "vulgar",
13 "детск.": "childish",
14 "диал.": "dialectal",
15 # "дисфм.": "дисфемизм",
16 "жарг.": "slang",
17 "ирон.": "ironic",
18 "истор.": "historical",
19 # "канц.": "канцелярское",
20 "книжн.": "literary",
21 "ласк.": "diminutive",
22 # "мол.": "молодёжное",
23 "нар.-поэт.": "poetic",
24 "нар.-разг.": "colloquial",
25 # "научн.": "научное",
26 "неодобр.": "disapproving",
27 "неол.": "neologism",
28 "обсц.": "vulgar",
29 "офиц.": "formal",
30 # "патет.": "патетическое",
31 "поэт.": "poetic",
32 "презр.": "contemplative",
33 "пренебр.": "derogatory",
34 "прост.": "colloquial",
35 # "проф.": "профессиональное",
36 # "публиц.": "публицистическое",
37 "разг.": "colloquial",
38 "рег.": "regional",
39 "ритор.": "rhetoric",
40 "сленг.": "slang",
41 "сниж.": "reduced",
42 # "советск.": "советизм",
43 "спец.": "special",
44 "старин.": "archaic",
45 "табу": "taboo",
46 # "торж.": "торжественное",
47 "трад.-нар.": "traditional",
48 "трад.-поэт.": ["traditional", "poetic"],
49 # "увелич.": "увеличительное",
50 "уменьш.": "diminutive",
51 "умласк.": ["diminutive", "endearing"],
52 "унич.": "pejorative",
53 "усилит.": "emphatic",
54 "устар.": "obsolete",
55 "фам.": "familiar",
56 # "школьн.": "школьное",
57 "шутл.": "humorous",
58 "эвф.": "euphemistic",
59 # "экзот.": "экзотизм",
60 "экспр.": "expressively",
61 # "эррат.": "эрративное",
62 # Категория:Стилистические пометы
63 "неофиц.": "informal",
64 "одобр.": "approving",
65 "сленг": "slang",
66 "уважит.": "polite",
67 "уничиж.": "derogatory",
68}
70# Предметные области
71TOPICS = {
72 "авиац.": "aeronautics",
73 "автомоб.": "automotive",
74 "агрон.": "agriculture",
75 "алхим.": "pseudoscience",
76 "альп.": "sports",
77 "анат.": "medicine",
78 "антроп.": "anthropology",
79 "артилл.": "weaponry",
80 "археол.": "history",
81 "архит.": "architecture",
82 "астрол.": "astrology",
83 "астрон.": "astronomy",
84 "библейск.": "religion",
85 "биол.": "biology",
86 "биохим.": "biochemistry",
87 "ботан.": "botany",
88 "бухг.": "finance",
89 "вет.": "zoology pathology",
90 "воен.": "military",
91 "гастрон.": "medicine",
92 "генет.": ["biology", "medicine"],
93 "геогр.": "geography",
94 "геод.": "geography",
95 "геол.": "geology",
96 "геометр.": "geometry",
97 "геофиз.": "geology",
98 "геральд.": "heraldry",
99 "гидрол.": "geography",
100 "гидротехн.": "engineering",
101 "гляциол.": "geography",
102 "горн.": "mining",
103 "дипл.": "politics",
104 "ж.-д.": "railways",
105 "живоп.": "arts",
106 # "животн.": "животноводство",
107 "зоол.": "zoology",
108 "игр.": "games",
109 "информ.": "computing",
110 "искусств.": "art-history",
111 "ислам.": "Islam",
112 "ихтиол.": "ichthyology",
113 # "йогич.": "йогическое",
114 "карт.": "card-games",
115 "керам.": ["chemistry", "engineering"],
116 "кино": "film",
117 "кинол.": "dogs",
118 "комп.": "computing",
119 "косм.": "astronomy",
120 "кулин.": "cuisine",
121 # "культурол.": "культурологическое",
122 "лес.": "business",
123 "лингв.": "linguistics",
124 "матем.": "mathematics",
125 "машин.": "engineering",
126 "мед.": "medicine",
127 "металл.": "metallurgy",
128 "метеорол.": "meteorology",
129 "мех.": "mechanical-engineering",
130 "микробиол.": "microbiology",
131 "минер.": "mineralogy",
132 "мифол,": "mythology",
133 "морск.": "nautical",
134 "муз.": "music",
135 # "нефтегаз.": "нефтегазовая промышленность и нефтепереработка",
136 "нумизм.": "numismatics",
137 "океан.": "oceanography",
138 "оккульт.": "mysticism",
139 "опт.": ["physics", "engineering"],
140 "орнитол.": "ornithology",
141 "охотн.": "hunting",
142 "палеонт.": "paleontology",
143 "паразит.": "medicine",
144 "парикмах.": "hairdressing",
145 "плотн.": "carpentry",
146 "полигр.": "printing",
147 "полит.": "politics",
148 "портн.": "textiles",
149 "прогр.": "programming",
150 "психиатр.": "psychiatry",
151 "психол.": "psychology",
152 "пчел.": "agriculture",
153 "радио.": ["radio", "engineering"],
154 "радиоэл.": ["radio", "electricity"],
155 "рекл.": "marketing",
156 "религ.": "religion",
157 "рыбол.": "fishing",
158 "с.-х.": "agriculture",
159 "сексол.": "sexuality",
160 # "скорн.": "скорняжное дело",
161 "социол.": "sociology",
162 # "спелеол.": "спелеологический",
163 "спорт.": "sports",
164 "стат.": "statistics",
165 "столярн.": "carpentry",
166 "строит.": "construction",
167 "театр.": "theater",
168 "текст.": "textiles",
169 "телеком.": "telecommunications",
170 "техн.": "engineering",
171 "торг.": "commerce",
172 "управл.": "management",
173 "фант.": "fantasy",
174 "фарм.": "pharmacology",
175 "физ.": "physics",
176 "физиол.": "physiology",
177 "филат.": "philately",
178 "филол.": "philology",
179 "филос.": "philosophy",
180 "фин.": "finance",
181 "фолькл.": "folklore",
182 "фотогр.": "photography",
183 "хим.": "chemistry",
184 "хоз.": "economics",
185 # "хореогр.": "хореографическое",
186 "церк.": "religion",
187 "цирк.": "circus",
188 "цитол.": "cytology",
189 "шахм.": "chess",
190 "швейн.": "sewing",
191 "экол.": "ecology",
192 "экон.": "economics",
193 "эл.-техн.": "electrical-engineering",
194 "эл.-энерг.": "electricity",
195 "энтомол.": "entomology",
196 "этногр": "ethnography",
197 "этнолог.": "ethnology",
198 "ювел.": "jewelry",
199 "юр.": "legal",
200 # Категория:Стилистические пометы
201 "бизн.": "business",
202}
204# Жаргон
205SLANG_TOPICS = {
206 "автомоб. жарг.": "motorcycling",
207 "арест.": "prison",
208 "воен. жарг.": "military",
209 "жарг. аним.": "anime",
210 # "жарг. викип.": "жаргон википроектов"
211 "интернет.": "Internet",
212 "комп. жарг.": "computer",
213 # "студ. жарг.": "студенческий жаргон",
214 "техн. жарг.": "technical",
215 "крим. и крим. жарг.": "criminology",
216 "полит. жарг.": "politics",
217 "жарг. нарк.": "drugs",
218 "жарг. ЛГБТ": "LGBT",
219 # "жарг. гом.": "жаргон гомосексуалов",
220}
222# Грамматические категории
223GRAMMATICAL_TAGS = {
224 "3л.": "impersonal",
225 "адъектив.": "adjective",
226 "безл.": "impersonal",
227 "вводн. сл.": "parenthetic",
228 "вин. п.": "accusative",
229 "вопр.": "interrogative",
230 # "восклиц.": "в восклицательных предложениях",
231 "гл.": "verb",
232 "дат. п.": "dative",
233 "ед. ч.": "singular", # Шаблон:ед
234 "ж. р.": "feminine",
235 "женск.": "feminine",
236 "им. п.": "nominative",
237 "исх. п.": "ablative",
238 "исч.": "countable",
239 "м. р.": "masculine",
240 "местн. п.": "locative",
241 "метоним.": "metonymically",
242 "мн. ч.": "plural", # Шаблон:мн, Шаблон:мн.
243 "неисч.": "uncountable",
244 "неодуш.": "inanimate",
245 "неперех.": "intransitive",
246 "нескл.": "indeclinable",
247 # "обобщ": "",
248 # "общ.": "",
249 "одуш.": "animate",
250 # "отриц.": "",
251 "перех.": "transitive",
252 # "повел.": "",
253 "предик.": "predicative",
254 # "предл. п.": "",
255 "прил.": "adjective",
256 # "прош.": "",
257 # "разд. п.": "",
258 "род. п.": "genitive",
259 "собир.": "collective",
260 # "ср. р.": "",
261 "статив.": "stative",
262 "субстантивир.": "substantive",
263 "сущ.": "noun",
264 "тв. п.": "instrumental",
265 # https://ru.wiktionary.org/wiki/Категория:Шаблоны:Условные_сокращения
266 "м.": "masculine", # Шаблон:m
267 "ср.": "neuter", # Шаблон:n
268 "ж.": "feminine", # Шаблон:f
269 "ж. мн.": ["feminine", "plural"], # Шаблон:f.pl
270 "несов.": "imperfective", # Шаблон:impf
271 "м./ж.": ["masculine", "feminine"], # Шаблон:m/f
272 "ср./м.": ["neuter", "masculine"], # Шаблон:n/m
273 "сов.": "perfective", # Шаблон:pf
274 # Шаблон:прил ru 1a^
275 "муж. р.": "masculine",
276 "ср. р.": "neuter",
277 "жен. р.": "feminine",
278 "неод.": "inanimate",
279 "т.": "instrumental",
280 "п.": "prepositional",
281 "кратк. форма": "short-form",
282 # Шаблон:мест ru п1*b
283 "с.": "neuter",
284 "в. (^(одуш.)/_(неодуш.))": ["accusative", "animate", "inanimate"],
285 # Шаблон:словоформы tt
286 "прит.": "possessive",
287 "1-е": "first-person",
288 "2-е": "second-person",
289 "3-е": "third-person",
290 # Template:гл ru ^bСВ
291 "пр. действ. прош.": ["active", "participle", "past"],
292 "деепр. прош.": ["adverbial", "participle", "past"],
293 "пр. страд. прош.": ["passive", "participle", "past"],
294 "прич. страд. прош.": ["passive", "participle", "past"],
295 # Template:гл ru 2a
296 "пр. действ. наст.": ["active", "participle", "present"],
297 "деепр. наст.": ["adverbial", "participle", "present"],
298 "пр. страд. наст.": ["passive", "participle", "present"],
299}
301# Прочие сокращения
302OTHER_TAGS = {
303 "букв.": "literary",
304 # "искаж.": "искажённое",
305 "неправ.": "irregular",
306 "перен.": "figuratively",
307 "редк.": "rare",
308 # "тж.": "", # Шаблон:тж.
309 "общая": "indefinite",
310 "опред.": "definite",
311 "счётн.": "count-form",
312 "наречия": "adverb",
313 "имена собственные": "proper-noun",
314 "причастия": "participle",
315 "деепричастия": ["adverbial", "participle"],
316 "топонимы": "toponymic",
317 "неопр.": "indefinite",
318 "опр.": "definite",
319 "imperfectum": "imperfect",
320 "perfectum": "perfect",
321 "gerundium": "gerund",
322 "gerundivum": "gerundive",
323 "plusquamperfectum": "pluperfect",
324 "инфинитив": "infinitive",
325 "герундий": "gerund",
326 "предикативы": "predicative",
327 "сша": "USA",
328 "превосх. формы": "superior",
329 "местоимения": "pronoun",
330 "ум.-ласк.": "diminutive",
331 "междометия": "interjection",
332 # Template:гл cu IV
333 "аорист": "aorist",
334 "нетемат.": "non-thematic",
335 "темат.": "thematic",
336 "предлоги": "prepositional",
337}
339CASE_TAGS = {
340 # Шаблон:сущ ru m a 1a
341 "им.": "nominative",
342 "р.": "genitive",
343 "д.": "dative",
344 "в.": "accusative",
345 "тв.": "instrumental",
346 "пр.": "prepositional",
347 # Шаблон:сущ bg 7
348 "зват.": "vocative",
349 # Шаблон:сущ de (e)s er ern/n
350 "ном.": "nominative",
351 "ген.": "genitive",
352 "дат.": "dative",
353 "акк.": "accusative",
354 # Шаблон:сущ cu (-а)
355 # "м.": "locative", # conflict with gender tag
356 "местный": "locative",
357 "зв.": "vocative",
358 # Template:падежи la 3
359 "абл.": "ablative",
360 "вок.": "vocative",
361 # Template:гл la 1
362 "supinum i": "supine-i",
363 "supinum ii": "supine-ii",
364 # Template:падежи tr
365 "вин.": "accusative",
366 "мест.": "locative",
367 "род.": "genitive",
368}
370TENSE_TAGS = {
371 # Шаблон:Гл-блок
372 "наст.": "present",
373 "будущ.": "future",
374 "прош.": "past",
375 "будущее": "future",
376 # Template:гл la 1
377 "praesens": "present",
378 "futūrum i": "future-i",
379 "futūrum ii": "future-ii",
380 "infīnitivus praesentis actīvi": ["infinitive", "present", "active"],
381 "infīnitivus praesentis passīvi": ["infinitive", "present", "passive"],
382 "participium praesentis actīvi": ["participle", "present", "active"],
383 "infīnitivus perfecti actīvi": ["infinitive", "perfect", "active"],
384 "participium perfecti passivi": ["participle", "perfect", "passive"],
385 "participium futuri activi": ["participle", "future", "active"],
386 # Template:гл en irreg
387 "прош. вр.": "past",
388 "прич. прош. вр.": ["past", "participle"],
389 # Template:гл ru 2a-ся
390 "наст./будущ.": ["present", "future"],
391}
393MOOD_TAGS = {
394 # Шаблон:Гл-блок
395 "повелит.": "imperative",
396 # Template:гл la 1
397 "indicatīvus": "indicative",
398 "coniunctīvus": "conjunctive",
399 "imperatīvus": "imperative",
400}
402PERSON_TAGS = {
403 # Шаблон:Гл-блок
404 "я": ["first-person", "singular"],
405 "ты": ["second-person", "singular"],
406 "он\nона\nоно": ["third-person", "singular"],
407 "он\nона": ["third-person", "singular"],
408 "мы": ["first-person", "plural"],
409 "вы": ["second-person", "plural"],
410 "они": ["third-person", "plural"],
411 # Template:гл la 1
412 "1 p.": "first-person",
413 "2 p.": "second-person",
414 "3 p.": "third-person",
415 # Template:гл en irreg
416 "3-е л. ед. ч.": ["third-person", "singular"],
417}
419VOICE_TAGS = {
420 # Шаблон:Гл-блок
421 "пр. действ.": "active",
422 "деепр.": "adverbial",
423 "пр. страд.": "passive",
424 # Template:гл la 1
425 "act.": "active",
426 "pass.": "passive",
427}
429NUMBER_TAGS = {
430 # Шаблон:сущ cu (-а)
431 "дв. ч.": "dual",
432 "часто мн. ч.": ["often", "plural"],
433 # Template:гл la 1
434 "sing.": "singular",
435 "plur.": "plural",
436 "sg.": "singular",
437 "pl.": "plural",
438}
440TRANSLATION_TAGS = {
441 # Шаблон:перев-блок
442 # https://en.wikipedia.org/wiki/Azerbaijani_alphabet
443 # https://ru.wiktionary.org/wiki/Модуль:languages/data
444 "арабск.": "Arabic",
445 "кир.": "Cyrillic",
446 "лат.": "Latin",
447 "лат": "Latin",
448 "кана": "katakana",
449 "сир.": "Syriac",
450 "иуд.": "Jewish",
451 "центральный": "Central",
452 "демот.": "Demotic Greek",
453 "кафар.": "Katharevousa",
454 "мальдивский": "Maldivian",
455 "традиц.": "traditional",
456 "у": "Wu",
457 "упрощ.": "simplified",
458 "южноминьский": "Min",
459 "курманджи": "Kurmanji",
460 "сорани": "Sorani",
461 "севернокурдский": "Kurmanji",
462 "южнокурдский": "Southern Kurdish",
463 "кириллица": "Cyrillic",
464 "глаголица": "Glagolitic",
465 "араб.": "Arabic",
466 "письменный": "Written-Form", # italic tag
467 "устный": "colloquial",
468}
470MORPHOLOGICAL_TEMPLATE_TAGS = {
471 # "Шаблон:inflection/ru/noun/text" used in "сущ-ru"
472 "одушевлённое": "animate",
473 "неодушевлённое": "inanimate",
474 "одушевлённое или неодушевлённое": ["animate", "inanimate"],
475 "неодушевлённое или одушевлённое": ["animate", "inanimate"],
476 "мужской род": "masculine",
477 "женский род": "feminine",
478 "средний род": "neuter",
479 "общий род (может согласовываться с другими частями речи как мужского": "common", # noqa: E501
480 "мужской или женский род": ["masculine", "feminine"],
481 "мужской или средний род": ["masculine", "neuter"],
482 "женский или мужской род": ["masculine", "feminine"],
483 "женский или средний род": ["feminine", "neuter"],
484 "средний или мужской род": ["masculine", "neuter"],
485 "средний или женский род": ["feminine", "neuter"],
486 "несклоняемое": "indeclinable",
487 "адъективное": "adjective",
488 "местоименное": "pronominal",
489 # https://en.wikipedia.org/wiki/Russian_declension
490 "1-е": "declension-1",
491 "2-е": "declension-2",
492 "3-е": "declension-3",
493 "2-е (5-e)": ["declension-1", "declension-5"],
494 # Шаблон:inflection/ru/adj
495 "качественное": "qualitative",
496 "относительное": "relative",
497 "притяжательное": "possessive",
498 # verb tags from "Шаблон:Гл-блок"
499 "совершенный вид": "perfect",
500 "несовершенный вид": "imperfective",
501 "двувидовой": "biaspectual",
502 "непереходный": "intransitive",
503 "переходный": "transitive",
504 "безличный": "impersonal",
505 "возвратный": "reflexive",
506}
508ALL_TAGS = {
509 **STYLE_TAGS,
510 **GRAMMATICAL_TAGS,
511 **OTHER_TAGS,
512 **CASE_TAGS,
513 **TENSE_TAGS,
514 **MOOD_TAGS,
515 **PERSON_TAGS,
516 **VOICE_TAGS,
517 **NUMBER_TAGS,
518 **TRANSLATION_TAGS,
519}
522def translate_raw_tags(data: WordEntry) -> None:
523 raw_tags = []
524 for raw_tag in data.raw_tags:
525 raw_tag_lower = raw_tag.lower()
526 if raw_tag_lower in ALL_TAGS:
527 tr_data = ALL_TAGS[raw_tag_lower]
528 if isinstance(tr_data, str):
529 data.tags.append(tr_data)
530 elif isinstance(tr_data, list): 530 ↛ 524line 530 didn't jump to line 524 because the condition on line 530 was always true
531 data.tags.extend(tr_data)
532 elif hasattr(data, "topics"):
533 tr_data = ""
534 if raw_tag_lower in TOPICS:
535 tr_data = TOPICS[raw_tag_lower]
536 elif raw_tag_lower in SLANG_TOPICS: 536 ↛ 540line 536 didn't jump to line 540 because the condition on line 536 was always true
537 tr_data = SLANG_TOPICS[raw_tag_lower]
538 if "slang" not in data.tags: 538 ↛ 540line 538 didn't jump to line 540 because the condition on line 538 was always true
539 data.tags.append("slang")
540 if isinstance(tr_data, str) and len(tr_data) > 0: 540 ↛ 542line 540 didn't jump to line 542 because the condition on line 540 was always true
541 data.topics.append(tr_data)
542 elif isinstance(tr_data, list):
543 data.topics.extend(tr_data)
544 else:
545 raw_tags.append(raw_tag)
546 else:
547 raw_tags.append(raw_tag)
548 data.raw_tags = raw_tags