| from __future__ import annotations | |
| from utils import normalize_for_search | |
| NORM_TYPE_PATTERNS = { | |
| "kurulus": ("nasil kurulur", "kurma", "kurulma", "kurulmasi", "acilma", "acilmasi", "kanunla kurulur"), | |
| "atama": ("nasil atan", "kim atar", "atanir", "atanmasi", "secilir", "secim"), | |
| "kurul_olusumu": ("kac uye", "kaç üye", "uyeden olusur", "üyeden oluşur", "kac kisiden", "kaç kişiden", "kimlerden olusur", "kimlerden oluşur", "olusan", "olusur"), | |
| "gorev": ( | |
| "gorev", "gorevleri", "ne yapar", "yetki", "yetkileri", "sorumluluk", | |
| "rolu", "rolu nedir", "konumu", "ne ifade eder", "ne saglar", "ne getirir", | |
| ), | |
| "sure": ("kac yil", "kac sene", "sure", "suresi", "ne kadar", "ay", "gun"), | |
| "sart": ("sart", "kosul", "hangi sart", "hangi kosul", "kaydiyla", "aranir", "gerekir", "icin ne gerekir", "için ne gerekir", "sinirlama", "siniri", "temel sinir"), | |
| "istisna": ("istisna", "haric", "ancak", "sakli"), | |
| "yaptirim": ("ceza", "cezasi", "yaptirim", "kapatilir", "uyarilir", "kesilir", "hukuki sonuc", "sonuclari"), | |
| "itiraz": ("itiraz", "dava", "basvuru yolu", "hangi yola basvur"), | |
| "hak": ("hak", "yararlan", "alabilir", "kazanir"), | |
| "usul": ("nasil", "basvuru", "surec", "adim", "islem", "usul"), | |
| "olcut": ("oran", "kac", "en az", "en cok", "azami", "asgari", "yuzde"), | |
| "ilke": ("ana ilke", "ana ilkeler", "temel ilke", "temel ilkeler", "genel ilke", "genel ilkeler"), | |
| "amac": ("amac", "amaclari", "temel amac", "temel amaclar", "yuksekogretimin amaci", "kanunun amaci"), | |
| "tanim": ("nedir", "kimdir", "tanim", "ne demek", "ne anlama gelir", "anlami", "nasil anlamaliyiz", "nasil yorumlanir", "yorumla"), | |
| } | |
| ACTOR_PATTERNS = { | |
| "yuksekogretim denetleme kurulu": ("yuksekogretim denetleme kurulu", "denetleme kurulu", "denetleme kurulunun"), | |
| "universitelerarasi kurul": ("universitelerarasi kurul", "universitelerarasi kurulun"), | |
| "universite yonetim kurulu": ("universite yonetim kurulu", "universite yonetim kurulunun"), | |
| "fakulte yonetim kurulu": ("fakulte yonetim kurulu", "fakulte yonetim kurulunun"), | |
| "fakulte kurulu": ("fakulte kurulu", "fakulte kurulunun"), | |
| "disiplin kurulu": ("disiplin kurulu", "disiplin kurulunun"), | |
| "yuksek disiplin kurulu": ("yuksek disiplin kurulu", "yuksek disiplin kurulunun"), | |
| "bolum baskani": ("bolum baskani", "bolum baskaninin"), | |
| "dekan": ("dekan", "dekanin"), | |
| "rektor": ("rektor", "rektorun"), | |
| "yuksekogretim kurulu": ("yok", "yuksekogretim kurulu", "yuksekogretim kurulunun"), | |
| "universite": ("universite", "universiteler"), | |
| "fakulte": ("fakulte", "fakulteler"), | |
| "enstitu": ("enstitu", "enstituler"), | |
| "yuksekokul": ("yuksekokul", "yuksekokullar"), | |
| "ogrenci": ("ogrenci", "ogrenciler"), | |
| "ogretim elemani": ("ogretim elemani", "ogretim elemanlari"), | |
| "ogretim uyesi": ("ogretim uyesi", "ogretim uyeleri"), | |
| "ogretim gorevlisi": ("ogretim gorevlisi", "ogretim gorevlileri"), | |
| "arastirma gorevlisi": ("arastirma gorevlisi", "arastirma gorevlileri"), | |
| "docent": ("docent", "docentlik"), | |
| "profesor": ("profesor", "profesorluk"), | |
| "senato": ("senato",), | |
| } | |
| def detect_norm_type(question: str) -> str: | |
| q = normalize_for_search(question) | |
| compact = q.replace(" ", "") | |
| if "onlisans" in compact and ("nedir" in q or "diploma" in q or "derece" in q): | |
| return "tanim" | |
| if any(term in q for term in ("uye", "uyeleri", "uyeden", "kimlerden", "olusur")) and any(term in q for term in ("kurul", "yok", "yuksekogretim kurulu", "senato")): | |
| return "kurul_olusumu" | |
| for norm_type, patterns in NORM_TYPE_PATTERNS.items(): | |
| if any(pattern in q for pattern in patterns): | |
| return norm_type | |
| return "" | |
| def detect_actors(question: str) -> list[str]: | |
| q = normalize_for_search(question) | |
| actors = [] | |
| for actor, patterns in ACTOR_PATTERNS.items(): | |
| if any(pattern in q for pattern in patterns): | |
| actors.append(actor) | |
| return actors | |
| def intent_profile(question: str) -> dict: | |
| q = normalize_for_search(question) | |
| interpretive = any(term in q for term in ( | |
| "ne anlama gelir", "anlami", "yorum", "nasil anlamaliyiz", "nasil yorumlanir", | |
| "rolu", "konumu", "ne ifade eder", "ne saglar", "ne getirir", "sonuc", | |
| )) | |
| return { | |
| "norm_type": detect_norm_type(question), | |
| "actors": detect_actors(question), | |
| "normalized_question": q, | |
| "interpretive_intent": interpretive, | |
| "practical_effect_intent": interpretive and any(term in q for term in ("sonuc", "hak", "yukumluluk", "pratik")), | |
| "requires_condition": any(term in q for term in ("hangi durumda", "hangi sart", "hangi kosul", "kosul", "sart", "ne zaman")), | |
| "requires_exception": any(term in q for term in ("istisna", "haric", "ancak", "sakli", "disinda")), | |
| "allows_temporary_article": any(term in q for term in ("gecici madde", "gecis", "gecici")), | |
| } | |