File size: 5,026 Bytes
eff511c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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")),
    }