package edu.stanford.nlp.sempre.tables.baseline;
import java.util.*;
import edu.stanford.nlp.sempre.*;
import edu.stanford.nlp.sempre.tables.*;
import fig.basic.*;
/**
* Baseline parser for table.
*
* Choose the answer from a table cell.
*
* @author ppasupat
*/
public class TableBaselineParser extends Parser {
public TableBaselineParser(Spec spec) {
super(spec);
}
@Override
public ParserState newParserState(Params params, Example ex, boolean computeExpectedCounts) {
return new TableBaselineParserState(this, params, ex, computeExpectedCounts);
}
}
/**
* Actual logic for generating candidates.
*/
class TableBaselineParserState extends ParserState {
public TableBaselineParserState(Parser parser, Params params, Example ex, boolean computeExpectedCounts) {
super(parser, params, ex, computeExpectedCounts);
}
@Override
public void infer() {
LogInfo.begin_track("TableBaselineParser.infer()");
// Add all entities and possible normalizations to the list of candidates
TableKnowledgeGraph graph = (TableKnowledgeGraph) ex.context.graph;
for (Formula f : graph.getAllFormulas(FuzzyMatchFn.FuzzyMatchFnMode.ENTITY)) {
buildAllDerivations(f);
}
// Execute + Compute expected counts
ensureExecuted();
if (computeExpectedCounts) {
expectedCounts = new HashMap<>();
ParserState.computeExpectedCounts(predDerivations, expectedCounts);
}
LogInfo.end_track();
}
private void buildAllDerivations(Formula f) {
generateDerivation(f);
// Try number and date normalizations as well
generateDerivation(new JoinFormula(Formula.fromString("!" + TableTypeSystem.CELL_NUMBER_VALUE.id), f));
generateDerivation(new JoinFormula(Formula.fromString("!" + TableTypeSystem.CELL_DATE_VALUE.id), f));
}
private void generateDerivation(Formula f) {
Derivation deriv = new Derivation.Builder()
.cat(Rule.rootCat).start(-1).end(-1)
.formula(f).children(Collections.emptyList())
.type(TypeInference.inferType(f))
.createDerivation();
deriv.ensureExecuted(parser.executor, ex.context);
if (deriv.value instanceof ErrorValue) return;
if (deriv.value instanceof ListValue && ((ListValue) deriv.value).values.isEmpty()) return;
if (!deriv.isFeaturizedAndScored()) featurizeAndScoreDerivation(deriv);
predDerivations.add(deriv);
}
}