def translateNBest(self, data_tree, data_dep): """ Translate in forest @param data_tree: @param data_dep: @return: """ # Get pare tree. #self.model.cacheMode = False setting.load(["nbest", "hypothesis_cluster_limit", "head_phrases_limit"]) tree = SenseTree(data_tree,data_dep) tree.rebuildTopNode() tree.appendXToTree() tree.upMergeAllConjNodes() tree.rebuildCommaNodes() tree.convertTags() tree.separateContiniousNonTerminals() tree.buildLevelMap() # Prepare for chiropractic process. treeForest = [tree] resultStack = [] for tree in treeForest: resultStack.append(self.chiropracticTranslation(tree))
def translateNBestOLD(self,data_tree,data_dep): """ Translate and return a N-best list @type data_tag: string @type data_dep: string @rtype: list of GentileHypothesis """ # first, we need get the tree of input self.model.cacheMode = False setting.load(["nbest", "head_phrases_limit"]) tree = SenseTree(data_tree,data_dep) tree.rebuildTopNode() tree.appendXToTree() tree.upMergeAllConjNodes() tree.rebuildCommaNodes() tree.convertTags() tree.separateContiniousNonTerminals() # tree.mergeContinuousNTs() fetcher = self.prepareRulesForTranslation(tree) # build lexical hypothesis stack # { id->[lexical hyp,] } # stack_lex = self.buildLexicalStack(fetcher) # { id->[lexical hyp,] } hypStacks = {} # for each fragment ( head node is not leaf ) at bottom-up style # use corresponding rules and basic hypothesis(lex or normal) to build normal hyp for this fragment tree.buildLevelMap() cur_level = tree.getMaxLevel() # A dirty trick: save current sense tree to cross-module global variable. __builtin__.currentSenseTree = tree # start pruning self.model.cacheMode = True while cur_level > 0: # [head id,] nodes_cur_level = tree.getNodesByLevel(cur_level) if cur_level == 1: self.model.smode = True else: self.model.smode = False for node in nodes_cur_level: if node not in fetcher.joints: # only prune for joint nodes continue # get rules rules, sitesInvolved = fetcher.mapJointRules[node] # okay available could in random order # we dont need sort it if not rules: # No rules found, force to use CYK. rc = Reconstructor(self.ruletable, self.model, tree, hypStacks, node) hyps = rc.parse() else: # Rules found then cube prunning. # sort rules rules = self.model.sortRules(rules) # now run the cube pruning and get normal hypothesises for current node hyps = separately_prune(self.model, node, rules, sitesInvolved, hypStacks) hypStacks[node] = hyps self.model.clearCache() # end of current node cur_level -= 1 rootNode = tree.getRootNode() if rootNode not in hypStacks or len(hypStacks[rootNode])==0: # failed print "[GentileDecoder]","Translation Failed!!!" return [] # end building normal hypothesis stack # hypStacks[rootNode][0].trace() return hypStacks[rootNode][:setting.nbest]