a816b119e7
Backfill ELP vocabulary from FULL lexicons (UniMorph + kaikki.org Wiktionary, real gender/inflections) for 8 languages, 812,894 entries total, in the proven seed-fn format matching the 18 ancient vocabularies: es 72,032 | fr 130,517 | de 144,692 | la 22,590 | it 193,675 | pt 115,772 | ro 86,504 | ca 47,112 4 of these (es fr de la) backfill ELP languages that had morphology but no vocabulary; it/pt/ro/ca are new Romance (need morphology-*.el ports next). Adds lang_profile_* for all 8 + reproducible generators under tests/lang-gen. Vocab is runtime seed data (not in build manifest, like the 18 ancients); seed-fn format validated to compile to C via elc.
101 lines
4.0 KiB
Python
101 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Full-lexicon vocabulary-{de,la}.el emitters (custom field mapping for the
|
|
German declension/gender API and the Latin case-paradigm API). Reuses the
|
|
chunked seed-fn writer from gen_elp_seed_full.
|
|
"""
|
|
import sys, importlib
|
|
from gen_elp_seed_full import write_seed
|
|
|
|
def uw(x):
|
|
"""Unwrap (form, source) tuples that some morphology fns return."""
|
|
if isinstance(x, (tuple, list)):
|
|
return x[0] if x else ""
|
|
return x if x is not None else ""
|
|
|
|
def build_de():
|
|
M = importlib.import_module("morphology_de_full")
|
|
rows = []; st = {"verbs":0,"nouns":0,"adjs":0}
|
|
# nouns: form0=nom-sg(lemma) form1=plural form2=gender
|
|
for lem in sorted(M._NOUNS):
|
|
if not lem: continue
|
|
try:
|
|
g = uw(M.noun_gender(lem))
|
|
pl = uw(M.pluralize(lem))
|
|
except Exception:
|
|
continue
|
|
rows.append([lem, "noun", lem, pl, g or "", "", "gender:lexicon"])
|
|
st["nouns"] += 1
|
|
# adjs: form0=positive form1=comparative form2=superlative
|
|
for lem in sorted(M._ADJS):
|
|
if not lem: continue
|
|
try:
|
|
cmpr = uw(M.comparative(lem))
|
|
sprl = uw(M.superlative(lem))
|
|
except Exception:
|
|
continue
|
|
rows.append([lem, "adj", lem, cmpr, sprl, "", "degree:lexicon"])
|
|
st["adjs"] += 1
|
|
# verbs (only the ~30 irregular/strong stems the cache carries):
|
|
# form0=pres-3sg form1=past-3sg form2=past-participle
|
|
if hasattr(M, "_VERBS"):
|
|
for lem in sorted({k[0] if isinstance(k, tuple) else k for k in M._VERBS}):
|
|
if not lem: continue
|
|
try:
|
|
f0 = uw(M.finite(lem, "present", "third", "singular"))
|
|
f1 = uw(M.finite(lem, "past", "third", "singular"))
|
|
pp = uw(M.past_participle(lem))
|
|
except Exception:
|
|
continue
|
|
rows.append([lem, "verb", f0, f1, pp, "", "class:strong/irregular"])
|
|
st["verbs"] += 1
|
|
return rows, st
|
|
|
|
def build_la():
|
|
M = importlib.import_module("morphology_lat_full")
|
|
rows = []; st = {"verbs":0,"nouns":0,"adjs":0}
|
|
def dn(lem, c, n):
|
|
try:
|
|
r = M.decline_noun(lem, c, n)
|
|
return uw(r)
|
|
except Exception:
|
|
return ""
|
|
# nouns: dictionary citation — form0=nom-sg form1=gen-sg form2=gender
|
|
for lem in sorted(M._NOUNS):
|
|
if not lem: continue
|
|
nom = dn(lem, "NOM", "SG") or lem
|
|
gen = dn(lem, "GEN", "SG")
|
|
try: g = uw(M.noun_gender(lem))
|
|
except Exception: g = ""
|
|
rows.append([lem, "noun", nom, gen, g, "", "case-paradigm nom/gen-sg"])
|
|
st["nouns"] += 1
|
|
# adjs: three-gender nom-sg citation — form0=masc form1=fem form2=neut
|
|
for lem in sorted(M._ADJS):
|
|
if not lem: continue
|
|
try:
|
|
m = uw(M.decline_adj(lem, "NOM", "MASC", "SG")) or lem
|
|
f = uw(M.decline_adj(lem, "NOM", "FEM", "SG"))
|
|
nt = uw(M.decline_adj(lem, "NOM", "NEUT", "SG"))
|
|
except Exception:
|
|
continue
|
|
rows.append([lem, "adj", m, f, nt, "", "3-gender nom-sg"])
|
|
st["adjs"] += 1
|
|
# verbs: principal parts — form0=pres-ind-1sg form1=pres-infinitive form2=perf-participle
|
|
if hasattr(M, "_VERBS"):
|
|
for lem in sorted({k[0] if isinstance(k, tuple) else k for k in M._VERBS}):
|
|
if not lem: continue
|
|
try:
|
|
f0 = uw(M.conjugate(lem, "present", "indicative", "active", "first", "singular"))
|
|
inf = uw(M.infinitive(lem, "present", "active"))
|
|
pp = uw(M.participle(lem, "perfect", "nom", "m", "singular"))
|
|
except Exception:
|
|
continue
|
|
rows.append([lem, "verb", f0, inf, pp, "", "principal-parts pres1sg/inf/pfppl"])
|
|
st["verbs"] += 1
|
|
return rows, st
|
|
|
|
if __name__ == "__main__":
|
|
lang = sys.argv[1]; out = sys.argv[2]
|
|
rows, st = build_de() if lang == "de" else build_la()
|
|
total, _ = write_seed(lang, rows, st, out)
|
|
print(f"{lang}: wrote {out} total={total} verbs={st['verbs']} nouns={st['nouns']} adjs={st['adjs']}")
|