!7 concept Example { S input; Triple triple; transient Triple guessed; } static F1> guesser; static JLabel lblStatus; static Map> examples, errors; p-subst { dbIndexing(Example, 'input); autoRestart(); for (S s : keys(gac36k())) uniq(Example, input := s); print("Making CRUD"); sexyTable_drag = false; final SimpleCRUD crud = simpleCRUD(Example); swing { tablePopupMenuItemFirst(crud.table, "Accept", voidfunc(int row) { for (Example e : crud.selectedConcepts()) cset(e, triple := e.guessed); }); /*containerAddFirst(crud.buttons, jbutton("Set multi...", r { final L l = crud.selectedConcepts(); showTextFieldForm("Set multi (" + l(l) + ")", "Verb", first(l).verb_guessed, voidfunc(S s) { for (Example e : l) cset(e, verb := s); }); }), jbutton("Show errors", f showErrors));*/ } addToFrame(crud.panel, lblStatus = jlabel()); thread { guessLoop(); } } static SS examples() { ret mapFromKeyAndValueField([Example e : list(Example) | e.triple != null], 'input, 'triple); } svoid guessLoop { repeat with sleep 5 { int changes = 0; new HashMap> guessedMap; Window anim = miniLoadingAnim(); try { examples = examples(); int nTrain = l(examples)/2; SS trainExamples = keysToMap(examples, selectRandom_fast(keysList(examples), nTrain)); guesser = new F1>() { Triple get(S s) { ret ai_tripelize(unquoteIfNotContainingOtherQuotes(s)); } }; for (Example e) { Triple t = (Triple) pcallF(guesser, e.input); changes += cset(e, guessed := t); guessedMap.put(e.input, t); } if (changes > 0) change(); Pair p = scoreTripelizer(mapGetter(guessedMap), examples); double score = p.a; errors = p.b; setText(lblStatus, n(examples, "example") + ", trained with " + l(trainExamples) + ", score: " + formatDouble(score*100, 1) + "% (" + iround((1-score)*l(examples)) + " missing)"); } finally { disposeWindow(anim); } } } svoid showErrors { showTable(map(keys(errors), func(S input) { litorderedmap(Input := input, Real := ai_tripleToString(examples.get(input), Guessed := ai_tripleToString(errors.get(input)))) }), "Errors"); }