!747 abstract class P { abstract void write(S tok); abstract S read(); } m { static class Pairs extends P { new Map map; S last; void write(S tok) { if (last != null) map.put(last, tok); last = tok; } S read() { return last == null ? null : map.get(last); } } p { P p = new Pairs; S corpus = makeCorpus(10); L tok = javaTok(corpus); print("Tokens in corpus: " + tok.size()); new L predicted; int points = 0; for (int i = 1; i < tok.size(); i += 2) { S t = tok.get(i); S x = p.read(); boolean correct = t.equals(x); while (predicted.size() < i) predicted.add(false); predicted.add(correct); if (correct) ++points; p.write(t); } double score = points*100.0/(tok.size()/2); print(points + "/"+ tok.size()/2 + " = " + formatDouble(score, 2) + "%"); showColoredText(tok, predicted); } static void showColoredText(L tok, L predicted) ctex { JFrame jf = new JFrame("Predicted = green"); Container cp = jf.getContentPane(); JTextPane pane = new JTextPane(); //pane.setFont(loadFont("#1000993", 24)); Document doc = pane.getStyledDocument(); for (int i = 0; i < tok.size(); i++) { if (tok.get(i).length() == 0) continue; boolean green = i < predicted.size() && predicted.get(i); SimpleAttributeSet set = new SimpleAttributeSet(); StyleConstants.setForeground(set, green ? Color.green : Color.gray); doc.insertString(doc.getLength(), tok.get(i), set); } JScrollPane scrollPane = new JScrollPane(pane); cp.add(scrollPane, BorderLayout.CENTER); jf.setBounds(100, 100, 600, 600); jf.setVisible(true); } !include #1000989 // SnippetDB static S makeCorpus(int numSnippets) { new StringBuilder buf; SnippetDB db = new SnippetDB("#1000673"); List> rows = db.rowsOrderedBy("sn_created"); for (int i = 0; i < Math.min(rows.size(), numSnippets); i++) { S id = db.getField(rows.get(i), "sn_id"); S title = db.getField(rows.get(i), "sn_title"); S text = db.getField(rows.get(i), "sn_text"); buf.append("\n== ID: " + id); buf.append("\n== Title: " + title); buf.append("\n==\n"); buf.append(text).append("\n"); ++i; } return buf.toString(); } }