Ecobot_Scoala_Verde/backend/diacritice.py
Stefan Caramizoiu d7a7d2cafd Initial commit
2026-04-01 11:14:26 +03:00

280 lines
6.8 KiB
Python

"""
Post-processing module that adds Romanian diacritics to text.
Maps common words without diacritics to their correct forms.
"""
import re
# Common Romanian words: without diacritics -> with diacritics
# Only includes words where the diacriticed form is unambiguous
WORD_MAP = {
# A
"adevarata": "adevărată",
"adevarate": "adevărate",
"adevarat": "adevărat",
"adevaratii": "adevărații",
"adancime": "adâncime",
"ajuta": "ajuta",
"analfabet": "analfabet",
"aceasta": "aceasta",
"afara": "afară",
"altadata": "altădată",
"amandoi": "amândoi",
"amanare": "amânare",
"amintiri": "amintiri",
"anumita": "anumită",
"anumite": "anumite",
"apa": "apă",
"apoi": "apoi",
"asa": "așa",
"asadar": "așadar",
"asemanare": "asemănare",
"asemenea": "asemenea",
"asupra": "asupra",
"astazi": "astăzi",
"asteapta": "așteaptă",
"asteptare": "așteptare",
"ati": "ați",
"atata": "atâta",
"atatia": "atâția",
"atunci": "atunci",
# B
"baiatul": "băiatul",
"baiat": "băiat",
"baieti": "băieți",
"baietii": "băieții",
"batran": "bătrân",
"batrana": "bătrână",
"batranete": "bătrânețe",
"batrani": "bătrâni",
"buna": "bună",
# C
"cand": "când",
"candva": "cândva",
"cat": "cât",
"cata": "câtă",
"cate": "câte",
"cati": "câți",
"cativa": "câțiva",
"cateva": "câteva",
"catre": "către",
"caldura": "căldură",
"calduros": "călduros",
"calatorie": "călătorie",
"calatori": "călători",
"cautare": "căutare",
"cautam": "căutăm",
"casa": "casă",
"casuta": "căsuță",
"compasiune": "compasiune",
"constientiza": "conștientiza",
"constiinta": "conștiință",
"constient": "conștient",
"copacii": "copacii",
"curateniei": "curățeniei",
"curatenie": "curățenie",
# D
"deasupra": "deasupra",
"deseuri": "deșeuri",
"deseurile": "deșeurile",
"dimineata": "dimineață",
"disparitia": "dispariția",
"disparitie": "dispariție",
"dupa": "după",
# E
"emotie": "emoție",
"emotii": "emoții",
# F
"facand": "făcând",
"facuta": "făcută",
"fara": "fără",
"fiinta": "ființă",
"fiinte": "ființe",
"folosesti": "folosești",
"folosim": "folosim",
"functie": "funcție",
"functioneaza": "funcționează",
# G
"gasesti": "găsești",
"gasim": "găsim",
"gasit": "găsit",
"gandeste": "gândește",
"gandire": "gândire",
"ganduri": "gânduri",
"gradina": "grădină",
"gradinile": "grădinile",
# I
"iarasi": "iarăși",
"iata": "iată",
"inainte": "înainte",
"inaintea": "înaintea",
"incalzire": "încălzire",
"incalzirea": "încălzirea",
"incepe": "începe",
"incepem": "începem",
"inceput": "început",
"incerca": "încerca",
"inchide": "închide",
"inchis": "închis",
"inconjuratoare": "înconjurătoare",
"indata": "îndată",
"indeajuns": "îndeajuns",
"indrazneala": "îndrăzneală",
"informatii": "informații",
"informatie": "informație",
"inima": "inimă",
"inseamna": "înseamnă",
"insemnatate": "însemnătate",
"intelege": "înțelege",
"intelegem": "înțelegem",
"inteles": "înțeles",
"intotdeauna": "întotdeauna",
"intoarcere": "întoarcere",
"intr-un": "într-un",
"intr-o": "într-o",
"intrebare": "întrebare",
"intrebari": "întrebări",
"invatam": "învățăm",
"invata": "învață",
"invatare": "învățare",
# J
"jumatate": "jumătate",
# L
"lantul": "lanțul",
"legatura": "legătură",
"lumina": "lumină",
# M
"mancare": "mâncare",
"mancarea": "mâncarea",
"masina": "mașină",
"masini": "mașini",
"masinile": "mașinile",
"mediul": "mediul",
"mostenire": "moștenire",
"mostenirea": "moștenirea",
"muntii": "munții",
"munti": "munți",
# N
"natiune": "națiune",
"natura": "natură",
"naturii": "naturii",
# O
"oamenii": "oamenii",
"oras": "oraș",
"orasele": "orașele",
"orase": "orașe",
# P
"padure": "pădure",
"paduri": "păduri",
"padurile": "pădurile",
"padurea": "pădurea",
"pamant": "pământ",
"pamantul": "pământul",
"pana": "până",
"pasari": "păsări",
"pasarile": "păsările",
"pasare": "pasăre",
"planteaza": "plantează",
"plantam": "plantăm",
"poluare": "poluare",
"poluarea": "poluarea",
"populatie": "populație",
"populatia": "populația",
"povesteste": "povestește",
"protejeaza": "protejează",
"protejam": "protejăm",
"protectie": "protecție",
"protectia": "protecția",
"putina": "puțină",
"putin": "puțin",
# R
"ramanem": "rămânem",
"ramane": "rămâne",
"ramas": "rămas",
"raspuns": "răspuns",
"raspunsul": "răspunsul",
"raspunsuri": "răspunsuri",
"raspunde": "răspunde",
"rauri": "râuri",
"raurile": "râurile",
"rau": "râu",
"reciclare": "reciclare",
"reciclam": "reciclăm",
"reciclarea": "reciclarea",
"reducerea": "reducerea",
"reutilizare": "reutilizare",
"reutilizam": "reutilizăm",
# S
"sansa": "șansă",
"sanse": "șanse",
"scoala": "școală",
"scolile": "școlile",
"scoalele": "școlile",
"seara": "seară",
"siguranta": "siguranță",
"situatie": "situație",
"solutie": "soluție",
"solutii": "soluții",
"stim": "știm",
"stie": "știe",
"stiinta": "știință",
"stiintific": "științific",
"stiati": "știați",
"sustenabilitate": "sustenabilitate",
# T
"tara": "țară",
"tarile": "țările",
"tari": "țări",
"temperaturi": "temperaturi",
"trebuie": "trebuie",
# U
"unda": "undă",
"uneori": "uneori",
"usoara": "ușoară",
"usor": "ușor",
# V
"vant": "vânt",
"vantul": "vântul",
"viata": "viață",
"vietuitoare": "viețuitoare",
"vietuitoarele": "viețuitoarele",
}
def add_diacritics(text: str) -> str:
"""Add Romanian diacritics to text using word-level replacement."""
def replace_word(match):
word = match.group(0)
lower = word.lower()
if lower in WORD_MAP:
replacement = WORD_MAP[lower]
# Preserve original capitalization
if word[0].isupper():
replacement = replacement[0].upper() + replacement[1:]
if word.isupper():
replacement = replacement.upper()
return replacement
return word
# Match whole words only
return re.sub(r'\b[a-zA-ZăâîșțĂÂÎȘȚ]+\b', replace_word, text)