static NLABlock nla_parse(S text) { ret nla_parse(new NLABlock(text)); } // fills and returns original object static NLABlock nla_parse(NLABlock nla) { // parse into lines (or sentences, both is OK) if (nla.lines == null) nla.lines = sentencesOrLines(nla.text); // parse lines into fragments & define entities if (nla.parsedLines == null) { new Matches m; nla.entities = linkedHashSet(); nla.parsedLines = new L; MapSO wordTree = wordTree(); for (int i = 0; i < l(nla.lines); i++) { S s = nla.lines.get(i); NLABlock.Line line = nla.new Line; line.text = s; line.proposition = parseToFragmentsUsingWordTree(s, wordTree); // define entity & extend word tree if "There is...|there are..." { S name = m.rest(); NLABlock.Entity e = new(name, line); if (matchX2("a...|an...", name, m)) e.addSynonym("the " + m.rest()); nla.entities.add(e); addToWordTree_multi(wordTree, e.synonyms, e); } nla.parsedLines.add(line); } } ret nla; }