Esempio n. 1
0
    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)
Esempio n. 2
0
    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)