La listo ĉe http://homepage.ntlworld.com/edmund.grimley-evans/pivkap estas tro komprimita por tuja uzo. Pro tio, eta Java-programo estis skribita por resolvi plejparton de la mallongigoj. La fontokodo de tiu programeto sekvas ĉi tie:
import java.util.ArrayList; import java.util.Arrays; import eo.StringLib.StringLib; /** * Klaso por importi liston de kapvortoj de la plena ilustrita vortaro * kaj por poste uzi tiun liston por rekoni validajn esperanto-vortojn. * * @author memkompreneble */ public class PivKap { /** * Interna listo kun la plenaj formoj de cxiuj kapvortoj de la piv. */ private ArrayList<String> kapvortoj = new ArrayList<String>(); /** * Aldonas eron al la listo de kapvortoj. Rajtas esti "plurvorta vorto". Ne rajtas esti malplena nek <code>null</code>. * @param kapvorto */ private void aldoni(String kapvorto) { if (kapvorto != null && kapvorto.length() > 0) { kapvortoj.add(kapvorto); /* StringBuffer s = new StringBuffer(); s.append(Integer.toString(kapvortoj.size())); s.append(" "); s.append(kapvorto); System.out.println(s.toString()); */ } } /** * Sxangxas usklecon de sola signo kaj redonas la reusklitan signon. * @param ch * @return */ private char uskligi(char ch) { if (Character.isLowerCase(ch)) { return Character.toUpperCase(ch); } else { return Character.toLowerCase(ch); } } /** * Konstruktoro por krei novan liston kun piv-kapvortoj. * @param fontoteksto * @TODO korekti afiksojn de la formo "-vora" */ public PivKap(String fontoteksto) { // ricevi liston kun linioj String[] linioj_ = fontoteksto.split("\n"); ArrayList<String> linioj = new ArrayList<String>(); for (String linio : linioj_) { // ignori liniojn kun komentoj if (!linio.startsWith("#")) { // etendi liniojn kun pluraj enskriboj linioj.addAll(Arrays.asList(linio.split(";"))); } } // bufro por stori la lastan radikon String lasta_radiko = ""; // bufro por indiki usklecon de lasta radiko boolean majuskle = false; // iteracio tra la linioj de la enigo for (String linio : linioj) { // forpreni maltauxgajn signojn linio = linio.replaceAll("\n",""); linio = linio.replaceAll(";",""); // se temas pri nova radiko if (!linio.startsWith(" ") && !linio.startsWith("\t")) { // se la radiko havas finajxon int i = linio.indexOf("/"); if (i > 0) { // kopii la radikon lasta_radiko = linio.substring(0,i); // kopii la finajxon String finajxo = linio.substring(i + 1, linio.length()); // aldoni al kapvortoj la novan kapvorton aldoni(lasta_radiko + finajxo); // se la radiko ne havas finajxon } else { // kopii kaj aldoni la radikon lasta_radiko = linio; aldoni(lasta_radiko); } // eltrovi usklecon de la nova radiko majuskle = Character.isUpperCase(lasta_radiko.charAt(0)); // se ne temas pri nova radiko } else { // forpreni unuajn spacetojn while (linio.startsWith(" ") || linio.startsWith("\t")) { linio = linio.substring(1); } // trovi anstatauxigan signon int j = linio.indexOf("~"); // se trovis anstatauxigan signon if (j >= 0) { String vorto = ""; // se majuskla radiko ricevas afikson if (majuskle && j > 1) { // kalkuli bonan usklecon vorto = Character.toUpperCase(linio.charAt(0)) + linio.substring(1,j) + Character.toLowerCase(lasta_radiko.charAt(0)) + lasta_radiko.substring(1) + linio.substring(j + 1); // en cxiuj aliaj kazoj } else { // fari anstatauxigon sen uskligo vorto = linio.substring(0,j) + lasta_radiko + linio.substring(j + 1); } // anstatauxi eblajn aliajn okazojn vorto = vorto.replaceAll("~",lasta_radiko); // trovi uskligan signon int k = vorto.indexOf("\\"); // se trovis uskligan signon if (k >= 0) { // kalkuli uskligosxangxon String nova_vorto = vorto.substring(0,k) + uskligi(vorto.charAt(k + 1)) + vorto.substring(k + 2); // kaj transpreni la rezulton vorto = nova_vorto; } // sercxi krampojn int p = vorto.indexOf("("); int q = vorto.indexOf(")"); // se trovis malferman kaj ferman krampon if (p >= 0 && q > p) { // aldoni duan variajxon de la vorto String nova_vorto = vorto.substring(0,p) + vorto.substring(q + 1); aldoni(nova_vorto); // kalkuli unuan variajxon de la vorto nova_vorto = vorto.substring(0,p) + vorto.substring(p + 1,q) + vorto.substring(q + 1); // kaj transpreni la rezulton vorto = nova_vorto; } // aldoni la novan kapvorton aldoni(vorto); } } } } public void printi_al_konzolo() { int i = 0; for (String kapvorto : kapvortoj) { i++; StringBuffer s = new StringBuffer(); s.append(StringLib.aldonuMaldekstre(Integer.toString(i),"0",5)); s.append(" "); // s.append(StringLib.aldonuDekstre(Integer.toString(kapvorto.length())," ",5)); // s.append(" ["); s.append(kapvorto); // s.append("]"); System.out.println(s.toString()); } } ...
Ŝajnas ke tiu inserto ne konservis komencajn spacigajn signojn. Kiu bezonas, povas ankoraŭ kopii, enmeti, apliki funkcion de aŭtomata formatigo, kaj aldoni eventuale maltroajn parentezojn. Poste alvoki per enhavo de la supre ligita dosiero. Al ties loka kopio mi tamen faris unu etan ŝanĝon: la eloriginala linio “Vulkan/o” nun estas ŝanĝita al “vulkan/o”, ĉar la majuskligo jam estas indikita en la tuj sekva linio, sed alikaze fuŝas uskligon de la sekvaj idaj kapvortoj.
La ideo estas, ke la etendita rezulta listo utilos por kontroli la kvaliton de la “renversa radikorekonado” per analizado de aperantaj esperantaj afiksoj kiel priskribite en antaŭaj blogeroj. Pro tio gravas, ke la kvalito de ĉi tiu listo mem estu laŭeble plejalta. Se la kara leganto do trovos kiajn ajn erarojn en la du partoj de la listo de la piv-kapvortoj, bv. komentu pri tio.
Fonto por alia kvalitokontrolilo estos iam la listo de oficialaj radikoj donita ĉe la paĝaro de la akademio de esperanto. Se iu el tiuj, kiuj fakte legis ĝis ĉi tie, konas alian eblan fonton de altkvalitaj eo-vortaroj aŭ kolektoj, aŭ havas aliajn pensojn, bv. skribu komenton.
[…] de unikaj radikoj aperantaj en la plena ilustrita vortaro kiel priskribita en la antaŭa artikolo pri-la-listo-de-piv-kapvortoj mi faris serion de testoj kontraŭ aro de segmentoj, kies lingvon mi antaŭe kontrolis okulumante […]