7d4fdbcc22
Adds a deterministic Romance front-end to comprehend.el (parse_spec_romance), dispatched from parse_spec_lang for lang es/pt. English path untouched (byte-identical, regression gate still 5/5). Pro-drop aware clause skeleton (subject | neg | verb | object | PP), cross-lingual negation lexemes already SACRED. Romance telephone gate: polarity PRESERVED 6/6 and EXTRACTED 6/6 through parse->realize->re-parse for 3 ES + 3 PT sentences. Built bounded (elc rc=0 peak 24MB, cc rc=0). Named gaps (honest): ending-only verb detection misfires on prepositions (contra) and -a/-o nouns (menina); lemma recovery keeps surface form; the non-English realizer is a generic preverbal-negator skeleton so ES/PT surfaces are not byte-parity. Full paradigm inversion + Romance lexicon deferred.
88 lines
3.9 KiB
EmacsLisp
88 lines
3.9 KiB
EmacsLisp
// comprehend_romance_gate.el - ES / PT native telephone test (SACRED polarity).
|
|
//
|
|
// The spec is language-neutral. This gate proves the Romance front-end extracts
|
|
// SACRED polarity correctly and that negation survives parse -> realize ->
|
|
// re-parse for Spanish and Portuguese (byte-parity of the surface is NOT expected
|
|
// yet — the non-English realizer path is a generic preverbal-negator skeleton).
|
|
|
|
fn rg_line(text: String, lang: String, expected_pol: String) -> String {
|
|
let spec: [String] = parse_spec_lang(text, lang)
|
|
let pol_in: String = slots_get(spec, "polarity")
|
|
let surf: String = realize(spec)
|
|
let spec2: [String] = parse_spec_lang(surf, lang)
|
|
let pol_out: String = slots_get(spec2, "polarity")
|
|
let status: String = "LOST"
|
|
if str_eq(pol_in, pol_out) { let status = "PRESERVED" }
|
|
let okexp: String = "MISMATCH"
|
|
if str_eq(pol_in, expected_pol) { let okexp = "ok" }
|
|
let out: String = "IN[" + lang + "]: " + text + "\n"
|
|
let out = out + " spec: pol=" + pol_in + " pred=" + slots_get(spec, "predicate")
|
|
let out = out + " agent=" + slots_get(spec, "agent")
|
|
let out = out + " pat=" + slots_get(spec, "patient")
|
|
let out = out + " iobj=" + slots_get(spec, "iobj")
|
|
let out = out + " loc=" + slots_get(spec, "location")
|
|
let out = out + " tense=" + slots_get(spec, "tense") + "\n"
|
|
let out = out + " realized: " + surf + "\n"
|
|
let out = out + " reparse: pol=" + pol_out + " [" + status + "] expected=" + expected_pol + " (" + okexp + ")\n"
|
|
return out
|
|
}
|
|
|
|
fn rg_pres(text: String, lang: String) -> Int {
|
|
let spec: [String] = parse_spec_lang(text, lang)
|
|
let surf: String = realize(spec)
|
|
let spec2: [String] = parse_spec_lang(surf, lang)
|
|
if str_eq(slots_get(spec, "polarity"), slots_get(spec2, "polarity")) { return 1 }
|
|
return 0
|
|
}
|
|
|
|
fn rg_corr(text: String, lang: String, expected_pol: String) -> Int {
|
|
let spec: [String] = parse_spec_lang(text, lang)
|
|
if str_eq(slots_get(spec, "polarity"), expected_pol) { return 1 }
|
|
return 0
|
|
}
|
|
|
|
fn run_romance_gate() -> String {
|
|
let e1: String = "El niño no comió el pescado."
|
|
let e2: String = "Yo nunca luché contra el océano."
|
|
let e3: String = "El profesor lee el libro."
|
|
let p1: String = "O professor não leu o livro."
|
|
let p2: String = "Eu nunca lutei contra o oceano."
|
|
let p3: String = "A menina comeu o peixe."
|
|
|
|
let rep: String = "==== ELP Romance telephone test (ES / PT) ====\n"
|
|
let rep = rep + rg_line(e1, "es", "neg")
|
|
let rep = rep + rg_line(e2, "es", "neg")
|
|
let rep = rep + rg_line(e3, "es", "aff")
|
|
let rep = rep + rg_line(p1, "pt", "neg")
|
|
let rep = rep + rg_line(p2, "pt", "neg")
|
|
let rep = rep + rg_line(p3, "pt", "aff")
|
|
|
|
let pres: Int = 0
|
|
if rg_pres(e1, "es") == 1 { let pres = pres + 1 }
|
|
if rg_pres(e2, "es") == 1 { let pres = pres + 1 }
|
|
if rg_pres(e3, "es") == 1 { let pres = pres + 1 }
|
|
if rg_pres(p1, "pt") == 1 { let pres = pres + 1 }
|
|
if rg_pres(p2, "pt") == 1 { let pres = pres + 1 }
|
|
if rg_pres(p3, "pt") == 1 { let pres = pres + 1 }
|
|
let corr: Int = 0
|
|
if rg_corr(e1, "es", "neg") == 1 { let corr = corr + 1 }
|
|
if rg_corr(e2, "es", "neg") == 1 { let corr = corr + 1 }
|
|
if rg_corr(e3, "es", "aff") == 1 { let corr = corr + 1 }
|
|
if rg_corr(p1, "pt", "neg") == 1 { let corr = corr + 1 }
|
|
if rg_corr(p2, "pt", "neg") == 1 { let corr = corr + 1 }
|
|
if rg_corr(p3, "pt", "aff") == 1 { let corr = corr + 1 }
|
|
|
|
let rep = rep + "-----------------------------------------------------------------\n"
|
|
let rep = rep + "polarity PRESERVED through round-trip: " + int_to_str(pres) + "/6\n"
|
|
let rep = rep + "polarity EXTRACTED correctly: " + int_to_str(corr) + "/6\n"
|
|
if pres == 6 {
|
|
if corr == 6 { let rep = rep + "ROMANCE GATE: PASS\n" }
|
|
else { let rep = rep + "ROMANCE GATE: FAIL (extraction)\n" }
|
|
} else {
|
|
let rep = rep + "ROMANCE GATE: FAIL (round-trip)\n"
|
|
}
|
|
return rep
|
|
}
|
|
|
|
println(run_romance_gate())
|