!7 concept Sentence { S text; S action; } sclass Example { L tok; int start, end; *() {} *(L *tok, IntRange subjectTokens) { start = subjectTokens.start; end = subjectTokens.end; } } sclass Result { Example e; IntRange answer; bool correct; } abstract sclass Guesser { abstract IntRange getSubjectTokens(L tok); void learn(L material) { for (Example e : material) learn(e); } void learn(Example e) {} } Guesser > G1 { IntRange getSubjectTokens(L tok) { ret new IntRange(0, 1); } } Guesser > G2 { new StringTree1 skipTree; IntRange getSubjectTokens(L tok) { int n = walkStringTreeToLeaf(skipTree, allToLower(tok)); if (n >= 0) ret new IntRange(n, n+1); null; } void learn(Example e) { if (e.start > 0) addToStringTree(skipTree, allToLower(takeFirst(e.tok, e.start))); } } sclass GuesserNode extends DefaultMutableTreeNode { *(S *text) { super(text); } } p { loadConceptsFrom(#1008607); L material = learningMaterial(); pnlStruct(material); DefaultMutableTreeNode root = new("Guesser results"); checkGuesser(root, material, new G1); checkGuesserAfterFullLearn(root, material, new G2); showFrame(jDynamicTree(new F1() { Bool get(DefaultMutableTreeNode node) { if (node.isRoot()) ret guess } }, root)); } sS checkGuesser(L testMaterial, Guesser g) { int score = 0, n = 0; for (Example e : testMaterial) { IntRange r = cast pcall(g, "getSubjectTokens", e.tok); if (eq(IntRange(e.start, e.end), r)) ++score; ++n; } ret printScore(getClassName(g), score, n); } svoid checkGuesserAfterFullLearn(DefaultMutableTreeNode root, L testMaterial, Guesser g) { g.learn(testMaterial); S s = checkGuesser(testMaterial, g); root.add(new DefaultMutableTreeNode(s)); } static L learningMaterial() { L out = new L; for (Sentence s) { if (s.action == null) continue; IntRange r = ai_parseSubjectAction(s.action); if (r != null) { L tok = codeTokens(nlTok5(s.text)); out.add(Example(tok, charRangeToTokenRange(tok, r))); } } ret out; }