| """Fix 10: Turkish compound word annotation.""" |
|
|
| from __future__ import annotations |
|
|
| KNOWN_COMPOUNDS: dict[str, list[str]] = { |
| "başbakan": ["baş", "bakan"], |
| "cumhurbaşkanı": ["cumhur", "başkan"], |
| "dışişleri": ["dış", "iş"], |
| "içişleri": ["iç", "iş"], |
| "maliye": ["mal", "iye"], |
| "belediye": ["beled", "iye"], |
| "ayakkabı": ["ayak", "kap"], |
| "yelkovan": ["yel", "kovan"], |
| "saatlik": ["saat", "lik"], |
| "günlük": ["gün", "lük"], |
| "yıllık": ["yıl", "lık"], |
| "aylık": ["ay", "lık"], |
| "haftalık": ["hafta", "lık"], |
| "gastrointestinal": ["gastro", "intestinal"], |
| "kardiyovasküler": ["kardio", "vasküler"], |
| "nöropsikiyatri": ["nöro", "psikiyatri"], |
| "biyokimya": ["biyo", "kimya"], |
| "mikrobiyoloji": ["mikro", "biyoloji"], |
| "farmakoloji": ["farma", "koloji"], |
| "patoloji": ["pato", "loji"], |
| "hematoloji": ["hemato", "loji"], |
| "nefroloji": ["nefro", "loji"], |
| "kardiyoloji": ["kardio", "loji"], |
| "radyoloji": ["radyo", "loji"], |
| "onkoloji": ["onko", "loji"], |
| "elektromanyetik": ["elektro", "manyetik"], |
| "termodinamik": ["termo", "dinamik"], |
| "hidroelektrik": ["hidro", "elektrik"], |
| "biyoinformatik": ["biyo", "informatik"], |
| "nanoteknoloji": ["nano", "teknoloji"], |
| "futbolcu": ["futbol", "cu"], |
| "basketbolcu": ["basketbol", "cu"], |
| "voleybolcu": ["voleybol", "cu"], |
| } |
|
|
|
|
| def _decompose_zemberek(word: str, morphology) -> list[str] | None: |
| try: |
| import jpype |
| wa = morphology.analyze(jpype.JString(word)) |
| for sa in wa.getAnalysisResults(): |
| morphemes = [str(m) for m in sa.getMorphemes()] |
| roots = [m for m in morphemes if "Noun" in m or "Verb" in m or "Adj" in m] |
| if len(roots) > 1: |
| return roots |
| except Exception: |
| pass |
| return None |
|
|
|
|
| def add_compound_info(tokens: list[dict], morphology=None) -> list[dict]: |
| """Annotate ROOT tokens that are compound words with ``_compound`` and ``_parts``.""" |
| result: list[dict] = [] |
| for tok in tokens: |
| if tok["type"] != "ROOT" or tok["token"].strip().startswith("<"): |
| result.append(tok) |
| continue |
|
|
| surface = tok["token"].strip().lower() |
|
|
| if morphology is not None: |
| parts = _decompose_zemberek(surface, morphology) |
| if parts and len(parts) > 1: |
| result.append({**tok, "_compound": True, "_parts": parts, "_source": "zemberek"}) |
| continue |
|
|
| if surface in KNOWN_COMPOUNDS: |
| result.append({**tok, "_compound": True, "_parts": KNOWN_COMPOUNDS[surface], "_source": "manual"}) |
| else: |
| result.append(tok) |
|
|
| return result |
|
|