def findRecontructMatchingRules(self, nodeId): """ Use modified CKY to just build rules for node. """ tokens = self.tree.node(nodeId) assert len(tokens) > 0 if len(tokens) == 1: return [] nodeTag = self.getTagOfNode(nodeId) rc = Reconstructor(self.ruletable, self.model, self.sense, tokens, nodeTag) rules = rc.parse() if rules: self.recordDependentSitesForNode(nodeId,[-t for t in tokens if t < 0]) return rules
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]