Warning: session_start(): open(/var/lib/php/sessions/sess_2da7pohtm7tb87dgcg8m7s5v67, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept Sentence {
S text;
S action;
}
sclass Example {
L tok;
int start, end;
*() {}
*(L *tok, IntRange subjectTokens) {
start = subjectTokens.start;
end = subjectTokens.end;
}
toString {
ret quote(joinWithSpaces(tok)) + " => " + joinWithSpaces(subList(tok, start, end));
}
}
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)));
}
}
Guesser > G3 {
new StringTree1 continuationTree;
IntRange getSubjectTokens(L tok) {
int n = walkStringTreeToLeaf(continuationTree, allToLower(tok));
if (n >= 0) ret new IntRange(0, n+1);
null;
}
void learn(Example e) {
L l = allToLower(subList(e.tok, e.start, e.end-1));
if (nempty(l))
addToStringTree(continuationTree, l);
}
}
Guesser > Chained {
new L l;
*(Guesser... guessers) { addAll(l, guessers); }
IntRange getSubjectTokens(L tok) {
for (Guesser g : l) {
IntRange result = cast pcall(g, "getSubjectTokens", tok);
if (result != null) ret result;
}
null;
}
}
Guesser > GCheater {
new Map map;
IntRange getSubjectTokens(L tok) {
ret map.get(joinWithSpace(tok));
}
void learn(Example e) {
map.put(joinWithSpace(e.tok), intRange(e.start, e.end));
}
}
p {
loadConceptsFrom(#1008607);
L material = learningMaterial();
pnlStruct(material);
Guesser g1, g2, g3;
checkGuesser(material, g1 = new G1);
set printSuccesses;
checkGuesserAfterFullLearn(material, g2 = new G2);
checkGuesserAfterFullLearn(material, g3 = new G3);
checkGuesserAfterFullLearn(material, new GCheater);
checkGuesser(material, new Chained(g1, g2, g3));
}
sbool printDetails, printSuccesses;
sS checkGuesser(L testMaterial, Guesser g) {
print();
int score = 0, n = 0;
for (Example e : testMaterial) {
IntRange r = cast pcall(g, "getSubjectTokens", e.tok);
bool ok = eq(IntRange(e.start, e.end), r);
if (ok) ++score;
++n;
if (printDetails || ok && printSuccesses)
if (ok)
print("OK " + e);
else
print("FAIL " + (r == null ? "-" : joinWithSpaces(subList(e.tok, r.start, r.end))) + " for " + e);
}
ret printScore(shortClassName(g), score, n);
}
svoid checkGuesserAfterFullLearn(L testMaterial, Guesser g) {
g.learn(testMaterial);
S s = checkGuesser(testMaterial, g);
}
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 = nlTok5(s.text);
r = charRangeToTokenRange(tok, r);
r = IntRange((r.start | 1)/2, r.end/2);
tok = codeTokens(tok);
out.add(Example(tok, r));
}
}
ret out;
}