Coverage for src/wiktextract/extractor/ru/tags.py: 85%
41 statements
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-12 08:27 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-09-12 08:27 +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 "статив.": "stative",
261 "субстантивир.": "substantive",
262 "сущ.": "noun",
263 "тв. п.": "instrumental",
264 # https://ru.wiktionary.org/wiki/Категория:Шаблоны:Условные_сокращения
265 "м.": "masculine", # Шаблон:m
266 "ср.": "neuter", # Шаблон:n
267 "ж.": "feminine", # Шаблон:f
268 "ж. мн.": ["feminine", "plural"], # Шаблон:f.pl
269 "несов.": "imperfective", # Шаблон:impf
270 "м./ж.": ["masculine", "feminine"], # Шаблон:m/f
271 "ср./м.": ["neuter", "masculine"], # Шаблон:n/m
272 "сов.": "perfective", # Шаблон:pf
273 # Шаблон:прил ru 1a^
274 "муж. р.": "masculine",
275 "ср. р.": "neuter",
276 "жен. р.": "feminine",
277 "неод.": "inanimate",
278 "т.": "instrumental",
279 "п.": "prepositional",
280 "кратк. форма": "short-form",
281 # Шаблон:мест ru п1*b
282 "с.": "neuter",
283 "в. (^(одуш.)/_(неодуш.))": ["accusative", "animate", "inanimate"],
284 # Шаблон:словоформы tt
285 "прит.": "possessive",
286 "1-е": "first-person",
287 "2-е": "second-person",
288 "3-е": "third-person",
289 # Template:гл ru ^bСВ
290 "пр. действ. прош.": ["active", "participle", "past"],
291 "деепр. прош.": ["adverbial", "participle", "past"],
292 "пр. страд. прош.": ["passive", "participle", "past"],
293 "прич. страд. прош.": ["passive", "participle", "past"],
294 # Template:гл ru 2a
295 "пр. действ. наст.": ["active", "participle", "present"],
296 "деепр. наст.": ["adverbial", "participle", "present"],
297 "пр. страд. наст.": ["passive", "participle", "present"],
298}
300# Прочие сокращения
301OTHER_TAGS = {
302 "букв.": "literary",
303 # "искаж.": "искажённое",
304 "неправ.": "irregular",
305 "перен.": "figuratively",
306 "редк.": "rare",
307 # "тж.": "", # Шаблон:тж.
308 "общая": "indefinite",
309 "опред.": "definite",
310 "счётн.": "count-form",
311 "наречия": "adverb",
312 "имена собственные": "proper-noun",
313 "причастия": "participle",
314 "деепричастия": ["adverbial", "participle"],
315 "топонимы": "toponymic",
316 "неопр.": "indefinite",
317 "опр.": "definite",
318 "imperfectum": "imperfect",
319 "perfectum": "perfect",
320 "gerundium": "gerund",
321 "gerundivum": "gerundive",
322 "plusquamperfectum": "pluperfect",
323 "инфинитив": "infinitive",
324 "герундий": "gerund",
325 "предикативы": "predicative",
326 "сша": "USA",
327 "превосх. формы": "superior",
328 "местоимения": "pronoun",
329 "ум.-ласк.": "diminutive",
330 "междометия": "interjection",
331 # Template:гл cu IV
332 "аорист": "aorist",
333 "нетемат.": "non-thematic",
334 "темат.": "thematic",
335 "предлоги": "prepositional",
336}
338CASE_TAGS = {
339 # Шаблон:сущ ru m a 1a
340 "им.": "nominative",
341 "р.": "genitive",
342 "д.": "dative",
343 "в.": "accusative",
344 "тв.": "instrumental",
345 "пр.": "prepositional",
346 # Шаблон:сущ bg 7
347 "зват.": "vocative",
348 # Шаблон:сущ de (e)s er ern/n
349 "ном.": "nominative",
350 "ген.": "genitive",
351 "дат.": "dative",
352 "акк.": "accusative",
353 # Шаблон:сущ cu (-а)
354 # "м.": "locative", # conflict with gender tag
355 "местный": "locative",
356 "зв.": "vocative",
357 # Template:падежи la 3
358 "абл.": "ablative",
359 "вок.": "vocative",
360 # Template:гл la 1
361 "supinum i": "supine-i",
362 "supinum ii": "supine-ii",
363 # Template:падежи tr
364 "вин.": "accusative",
365 "мест.": "locative",
366 "род.": "genitive",
367}
369TENSE_TAGS = {
370 # Шаблон:Гл-блок
371 "наст.": "present",
372 "будущ.": "future",
373 "прош.": "past",
374 "будущее": "future",
375 # Template:гл la 1
376 "praesens": "present",
377 "futūrum i": "future-i",
378 "futūrum ii": "future-ii",
379 "infīnitivus praesentis actīvi": ["infinitive", "present", "active"],
380 "infīnitivus praesentis passīvi": ["infinitive", "present", "passive"],
381 "participium praesentis actīvi": ["participle", "present", "active"],
382 "infīnitivus perfecti actīvi": ["infinitive", "perfect", "active"],
383 "participium perfecti passivi": ["participle", "perfect", "passive"],
384 "participium futuri activi": ["participle", "future", "active"],
385 # Template:гл en irreg
386 "прош. вр.": "past",
387 "прич. прош. вр.": ["past", "participle"],
388 # Template:гл ru 2a-ся
389 "наст./будущ.": ["present", "future"],
390}
392MOOD_TAGS = {
393 # Шаблон:Гл-блок
394 "повелит.": "imperative",
395 # Template:гл la 1
396 "indicatīvus": "indicative",
397 "coniunctīvus": "conjunctive",
398 "imperatīvus": "imperative",
399}
401PERSON_TAGS = {
402 # Шаблон:Гл-блок
403 "я": ["first-person", "singular"],
404 "ты": ["second-person", "singular"],
405 "он\nона\nоно": ["third-person", "singular"],
406 "он\nона": ["third-person", "singular"],
407 "мы": ["first-person", "plural"],
408 "вы": ["second-person", "plural"],
409 "они": ["third-person", "plural"],
410 # Template:гл la 1
411 "1 p.": "first-person",
412 "2 p.": "second-person",
413 "3 p.": "third-person",
414 # Template:гл en irreg
415 "3-е л. ед. ч.": ["third-person", "singular"],
416}
418VOICE_TAGS = {
419 # Шаблон:Гл-блок
420 "пр. действ.": "active",
421 "деепр.": "adverbial",
422 "пр. страд.": "passive",
423 # Template:гл la 1
424 "act.": "active",
425 "pass.": "passive",
426}
428NUMBER_TAGS = {
429 # Шаблон:сущ cu (-а)
430 "дв. ч.": "dual",
431 "часто мн. ч.": ["often", "plural"],
432 # Template:гл la 1
433 "sing.": "singular",
434 "plur.": "plural",
435 "sg.": "singular",
436 "pl.": "plural",
437}
439TRANSLATION_TAGS = {
440 # Шаблон:перев-блок
441 # https://en.wikipedia.org/wiki/Azerbaijani_alphabet
442 # https://ru.wiktionary.org/wiki/Модуль:languages/data
443 "арабск.": "Arabic",
444 "кир.": "Cyrillic",
445 "лат.": "Latin",
446 "лат": "Latin",
447 "кана": "katakana",
448 "сир.": "Syriac",
449 "иуд.": "Jewish",
450 "центральный": "Central",
451 "демот.": "Demotic Greek",
452 "кафар.": "Katharevousa",
453 "мальдивский": "Maldivian",
454 "традиц.": "traditional",
455 "у": "Wu",
456 "упрощ.": "simplified",
457 "южноминьский": "Min",
458 "курманджи": "Kurmanji",
459 "сорани": "Sorani",
460 "севернокурдский": "Kurmanji",
461 "южнокурдский": "Southern Kurdish",
462 "кириллица": "Cyrillic",
463 "глаголица": "Glagolitic",
464 "араб.": "Arabic",
465 "письменный": "Written-Form", # italic tag
466 "устный": "colloquial",
467}
469MORPHOLOGICAL_TEMPLATE_TAGS = {
470 # "Шаблон:inflection/ru/noun/text" used in "сущ-ru"
471 "одушевлённое": "animate",
472 "неодушевлённое": "inanimate",
473 "одушевлённое или неодушевлённое": ["animate", "inanimate"],
474 "неодушевлённое или одушевлённое": ["animate", "inanimate"],
475 "мужской род": "masculine",
476 "женский род": "feminine",
477 "средний род": "neuter",
478 "общий род (может согласовываться с другими частями речи как мужского": "common", # noqa: E501
479 "мужской или женский род": ["masculine", "feminine"],
480 "мужской или средний род": ["masculine", "neuter"],
481 "женский или мужской род": ["masculine", "feminine"],
482 "женский или средний род": ["feminine", "neuter"],
483 "средний или мужской род": ["masculine", "neuter"],
484 "средний или женский род": ["feminine", "neuter"],
485 "несклоняемое": "indeclinable",
486 "адъективное": "adjective",
487 "местоименное": "pronominal",
488 # https://en.wikipedia.org/wiki/Russian_declension
489 "1-е": "declension-1",
490 "2-е": "declension-2",
491 "3-е": "declension-3",
492 "2-е (5-e)": ["declension-1", "declension-5"],
493 # Шаблон:inflection/ru/adj
494 "качественное": "qualitative",
495 "относительное": "relative",
496 "притяжательное": "possessive",
497 # verb tags from "Шаблон:Гл-блок"
498 "совершенный вид": "perfect",
499 "несовершенный вид": "imperfective",
500 "двувидовой": "biaspectual",
501 "непереходный": "intransitive",
502 "переходный": "transitive",
503 "безличный": "impersonal",
504 "возвратный": "reflexive",
505}
507ALL_TAGS = {
508 **STYLE_TAGS,
509 **GRAMMATICAL_TAGS,
510 **OTHER_TAGS,
511 **CASE_TAGS,
512 **TENSE_TAGS,
513 **MOOD_TAGS,
514 **PERSON_TAGS,
515 **VOICE_TAGS,
516 **NUMBER_TAGS,
517 **TRANSLATION_TAGS,
518}
521def translate_raw_tags(data: WordEntry) -> None:
522 raw_tags = []
523 for raw_tag in data.raw_tags:
524 raw_tag_lower = raw_tag.lower()
525 if raw_tag_lower in ALL_TAGS:
526 tr_data = ALL_TAGS[raw_tag_lower]
527 if isinstance(tr_data, str):
528 data.tags.append(tr_data)
529 elif isinstance(tr_data, list): 529 ↛ 523line 529 didn't jump to line 523 because the condition on line 529 was always true
530 data.tags.extend(tr_data)
531 elif hasattr(data, "topics"):
532 tr_data = ""
533 if raw_tag_lower in TOPICS:
534 tr_data = TOPICS[raw_tag_lower]
535 elif raw_tag_lower in SLANG_TOPICS: 535 ↛ 539line 535 didn't jump to line 539 because the condition on line 535 was always true
536 tr_data = SLANG_TOPICS[raw_tag_lower]
537 if "slang" not in data.tags: 537 ↛ 539line 537 didn't jump to line 539 because the condition on line 537 was always true
538 data.tags.append("slang")
539 if isinstance(tr_data, str) and len(tr_data) > 0: 539 ↛ 541line 539 didn't jump to line 541 because the condition on line 539 was always true
540 data.topics.append(tr_data)
541 elif isinstance(tr_data, list):
542 data.topics.extend(tr_data)
543 else:
544 raw_tags.append(raw_tag)
545 else:
546 raw_tags.append(raw_tag)
547 data.raw_tags = raw_tags