def afterGenerating(self, hyps, i, sentence): if not hyps[i + 1]: #fail? return for level,gamma in enumerate(self.gammas): if level == 0: if "level" in self.verbose: print >>sys.stderr, "Specified", \ len(hyps[i + 1]), "hypotheses" bestSub = hyps[i + 1][0] print >>sys.stderr, "Best parse at level", level,\ treeToStr(bestSub.tree(allowPartial=True)),\ bestSub.prob print >>sys.stderr, bestSub.expansionProfile(bestSub) continue if "level" in self.verbose: print >>sys.stderr, "Specifying at level", level self.specifyAtLevel(1, level, hyps[i + 1], 1.0, sentence) if "level" in self.verbose: gen = hyps[i + 1] try: for subL in range(level): gen = gen[0].subLevelHeap bestSub = gen[0] print >>sys.stderr, "Best parse at level", level,\ treeToStr(bestSub.tree(allowPartial=True)),\ bestSub.prob print >>sys.stderr, bestSub.expansionProfile(bestSub) except: print >>sys.stderr, \ "Warning: best hypothesis has no parse at level",\ level if self.verbose: reportMatchingParses(self.verbose, hyps[i + 1], 0) reportMatchingParses(self.verbose, hyps[i + 1], level) if "level" in self.verbose: bestSub = hyps[i + 1][0] print >>sys.stderr, "Best top-level parse",\ treeToStr(bestSub.tree(allowPartial=True)),\ bestSub.prob print >>sys.stderr, bestSub print >>sys.stderr, bestSub.expansionProfile(bestSub)
def parse(self, sentence): self.grammar.preload(sentence) n = len(sentence) hyps = [[] for i in range(n + 3)] baseAnalysis = self.makeAnalysis(top=self.top, initial=self.grammar.depth()) hyps[0].append(baseAnalysis) for i in range(0, n): if "index" in self.verbose: print >>sys.stderr, "************* WORD", i, sentence[i] while self.aboveThreshold(hyps, i): self.generateHypotheses(hyps, i, sentence) if self.verbose: reportMatchingParses(self.verbose, hyps[i+1], 0) self.afterGenerating(hyps, i, sentence) hyps[i] = [] #try to allow gc for bad hypotheses if "index" in self.verbose: print >>sys.stderr, "************* EMPTYING STACKS" while self.aboveThreshold(hyps, n): self.generateFinalHypotheses(hyps, n) self.afterGenerating(hyps, n, sentence) if "index" in self.verbose: print >>sys.stderr, "************* COMPLETE" if hyps[n + 1]: return hyps[n + 1][0] raise ParseError("Can't parse: %s" % sentence)