-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path04_tokenizer_kanish.py
More file actions
57 lines (46 loc) · 2.08 KB
/
04_tokenizer_kanish.py
File metadata and controls
57 lines (46 loc) · 2.08 KB
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
import re
class KanishTokenizer:
"""
Tokenizador especializado para textos cuneiformes (Old Assyrian).
Separa morfemas gramaticales (-ma, -ni) sin romper logogramas.
"""
def __init__(self):
# Lista de clíticos comunes en Kanesh para separar
# -ma: Enfático / Conectivo
# -ni: Subjuntivo
# -kum/šum: Dativo
# -am: Ventivo
self.cliticos = [
'ma', 'ni', 'kum', 'šum', 'am', 'kunu', 'šunu', 'ka', 'su'
]
# Regex compilado para velocidad
# Busca un guion seguido de un clítico, pero SOLO si es el final de la palabra (\b)
self.regex_cliticos = re.compile(r'-(' + '|'.join(self.cliticos) + r')\b', re.IGNORECASE)
def tokenizar(self, texto):
if not texto or not isinstance(texto, str):
return []
texto = texto.strip()
# PASO 1: Protección de Logogramas complejos (Heurística)
# Si hay puntos (DUMU.ZI) asumimos que es un logograma y no lo tocamos por ahora.
# (En versiones futuras, esto se conecta al Grafo para validar entidades)
# PASO 2: Separación Quirúrgica de Clíticos
# Transforma "iqbi-ma" en "iqbi -ma"
texto_procesado = self.regex_cliticos.sub(r' -\1', texto)
# PASO 3: Split estándar por espacios
tokens = texto_procesado.split()
return tokens
# --- BLOQUE DE PRUEBA RÁPIDA ---
if __name__ == "__main__":
tk = KanishTokenizer()
ejemplos = [
"um-ma En-lil-ba-ni-ma", # Nombre propio + clítico -ma
"kù-babbar i-di-in-šum", # Verbo + clítico dativo -šum
"DUMU.ZI i-li-ik", # Logograma con punto (no debe separarse)
"a-na bīt kar-im", # Preposición y sustantivo
"[x ... ] <BROKEN>" # Token de rotura (del paso anterior)
]
print("--- 🧪 PRUEBA DE TOKENIZACIÓN ---")
for ej in ejemplos:
print(f"ORIGINAL: {ej}")
print(f"TOKENS: {tk.tokenizar(ej)}")
print("-" * 30)