def subtrees(tree): #setOfTrees = set() #setOfSubTrees = set() setOfTrees = [] setOfSubTrees = [] if tree.isPreTerminal(): tree.children[0].wasTerminal = True #setOfTrees.add(tree) #setOfSubTrees.add(tree) setOfTrees.append(tree) setOfSubTrees.append(tree) else: baseChildrenList = [[]] for child in tree.children: newBaseChildrenList = [] c_setOfTrees, c_setOfSubtrees = DT.subtrees(child) #setOfSubTrees = setOfSubTrees.union(c_setOfSubtrees) setOfSubTrees = setOfSubTrees + c_setOfSubtrees for treeSubChild in c_setOfTrees: for treeSub in baseChildrenList: newBaseChildrenList.append(treeSub + [treeSubChild]) baseChildrenList = newBaseChildrenList for children in baseChildrenList: newTree = Tree(root=tree.root,children=children, id=tree.id()) #setOfTrees.add(newTree) #setOfSubTrees.add(newTree) setOfTrees.append(newTree) setOfSubTrees.append(newTree) #setOfTrees.add(Tree(root=tree.root, id=tree.id())) setOfTrees.append(Tree(root=tree.root, id=tree.id())) return setOfTrees,setOfSubTrees
def activationQC(self, relevance, tree): ''' :param relevance: np.array() dim D :param tree: str :return: ({'tree': str(tree), 'act_sub_trees':[(subtree, np.array())]},{'tree': str(tree), 'act_sub_trees':[(subtree, np.array())]}) ''' # calcolo i dtf dei sottoalberi di tree, cosi già ce li ho in cache tree = Tree(string=tree) self.calculateDTFs(tree) # genero la matrice M, proprietà: M*M^T = I_nn m = self.generateMatrixSubTree() # print(m.shape, m.transpose().shape, relevance.shape) # mmt = np.dot(m, m.transpose()) # a questo punto moltiplico il vettore della rilevanza per la matrice trasposta # prendo prima tree1 relevance_tree = self.createRelevanceVector(relevance[:4000], m.transpose()) # genero i 4 dizionari che mi servono per risalire ai sottoalberi tree_index, tree_index_dict, embedding_matrix, tree_index_dict_inverse = self.relevance_matrix( ) act_tree = self.saveActivation(tree, relevance_tree, tree_index_dict) return act_tree
def activationRTE(self, relevance, tree1, tree2): ''' It takes two trees in parenthetical form (str) as input. 1) convert trees to kerMIT.Tree 2) I calculate the dtf for each sub-tree of both trees 3) I take the generated sub trees from the cache and construct a matrix (N, D) N=number of subtrees, D=dimension dtf 4) multiply r * M^T so as to obtain a vector of dim (, N) => (, D) * (D, N) = (, N). This vector tells us: how much each subtree (in the form of an index) is relevant for that input phrase 5) from the index step to the subtree itself 6) I return a list of pairs: (subtree, relevance) :param relevance: np.array() dim D :param tree1: str :param tree2: str :return: ({'tree': str(tree), 'act_sub_trees':[(subtree, np.array())]},{'tree': str(tree), 'act_sub_trees':[(subtree, np.array())]}) ''' # calcolo i dtf dei sottoalberi di tree1 e tree2, cosi già ce li ho in cache tree1 = Tree(string=tree1) tree2 = Tree(string=tree2) self.calculateDTFs(tree1) self.calculateDTFs(tree2) # genero la matrice M, proprietà: M*M^T = I_nn m = self.generateMatrixSubTree() #print(m.shape, m.transpose().shape, relevance.shape) #mmt = np.dot(m, m.transpose()) # a questo punto moltiplico il vettore della rilevanza per la matrice trasposta # prendo prima tree1 relevance_tree_1 = self.createRelevanceVector(relevance[:4000], m.transpose()) # prendo poi tree2 relevance_tree_2 = self.createRelevanceVector(relevance[4000:], m.transpose()) # genero i 4 dizionari che mi servono per risalire ai sottoalberi tree_index, tree_index_dict, embedding_matrix, tree_index_dict_inverse = self.relevance_matrix( ) #print(relevance_tree_1) #print(relevance_tree_2) act_tree1 = self.saveActivation(tree1, relevance_tree_1, tree_index_dict) act_tree2 = self.saveActivation(tree2, relevance_tree_2, tree_index_dict) return act_tree1, act_tree2
def createDTK(parenthetical_tree): tree = Tree(string=parenthetical_tree) dtCalculator = DT(dimension=4000, LAMBDA=0.4, operation=fast_shuffled_convolution) distributedTree1 = dtCalculator.dt(tree=tree) return distributedTree1
def kernel(self, t1, t2): try: f = self.type_dic[self.kernelType] except KeyError: print("kernelType ", self.kernelType, " not implemented.") return f(t1).dot(f(t2)) if __name__ == "__main__": #s = "(S#trade$v:-1:4095 (NP#oil$n:-1:63 (NP#oil$n:-1:63 (JJ#Crude$j:1:7 Crude)(NN#oil$n:2:56 oil)))(VP#trade$v:-1:4032 (VBD#trade$v:-1:0 traded)(PP#barrel$n:-1:4032 (IN#at$i:-1:0 at)(NP#barrel$n:-1:4032 (NP#37.80$c:-1:448 ($#$$$:-1:0 $)(CD#37.80$c:3:448 37.80))(NP#barrel$n:-1:3584 (DT#a$d:-1:0 a)(NN#barrel$n:4:3584 barrel))))))" ss = "(S (@S (NP (NP (@NP (DT The) (NN wait)) (NN time)) (PP (IN for) (NP (@NP (DT a) (JJ green)) (NN card)))) (VP (AUX has) (VP (@VP (VBN risen) (PP (IN from) (NP (@NP (NP (CD 21) (NNS months)) (TO to)) (NP (CD 33) (NNS months))))) (PP (IN in) (NP (@NP (DT those) (JJ same)) (NNS regions)))))) (. .))" ss = '(NOTYPE##ROOT(NOTYPE##NP(NOTYPE##S(NOTYPE##NP(NOTYPE##NNP(NOTYPE##Children)))(NOTYPE##VP-REL(NOTYPE##VBG-REL(NOTYPE##W))(NOTYPE##CC(NOTYPE##and))(NOTYPE##VBG(NOTYPE##waving))(NOTYPE##PP(NOTYPE##IN(NOTYPE##W))(NOTYPE##NP(NOTYPE##NN(NOTYPE##camera))))))))' ss = ss.replace(")", ") ").replace("(", " (") t = Tree(string=ss) kernel = DT(dimension=4000, LAMBDA=0.6, operation=op.fast_shuffled_convolution) v = kernel.drule(t) vv = kernel.dt(t) for r in t.allRules(): print(r) print(v) print(vv) print(np.dot(v, vv)) #print(kernel.kernel(t,frag))
def demo(): import random def fill(cw): cw['fill'] = '#%06d' % random.randint(0, 999999) cf = CanvasFrame(width=550, height=450, closeenough=2) t = Tree.fromstring(''' (S (NP the very big cat) (VP (Adv sorta) (V saw) (NP (Det the) (N dog))))''') tc = TreeWidget(cf.canvas(), t, draggable=1, node_font=('helvetica', -14, 'bold'), leaf_font=('helvetica', -12, 'italic'), roof_fill='white', roof_color='black', leaf_color='green4', node_color='blue2') cf.add_widget(tc, 10, 10) def boxit(canvas, text): big = ('helvetica', -16, 'bold') return BoxWidget(canvas, TextWidget(canvas, text, font=big), fill='green') def ovalit(canvas, text): return OvalWidget(canvas, TextWidget(canvas, text), fill='cyan') treetok = Tree.fromstring( '(S (NP this tree) (VP (V is) (AdjP shapeable)))') tc2 = TreeWidget(cf.canvas(), treetok, boxit, ovalit, shapeable=1) def color(node): node['color'] = '#%04d00' % random.randint(0, 9999) def color2(treeseg): treeseg.label()['fill'] = '#%06d' % random.randint(0, 9999) treeseg.label().child()['color'] = 'white' tc.bind_click_trees(tc.toggle_collapsed) tc2.bind_click_trees(tc2.toggle_collapsed) tc.bind_click_nodes(color, 3) tc2.expanded_tree(1).bind_click(color2, 3) tc2.expanded_tree().bind_click(color2, 3) paren = ParenWidget(cf.canvas(), tc2) cf.add_widget(paren, tc.bbox()[2] + 10, 10) tree3 = Tree.fromstring(''' (S (NP this tree) (AUX was) (VP (V built) (PP (P with) (NP (N tree_to_treesegment)))))''') tc3 = tree_to_treesegment(cf.canvas(), tree3, tree_color='green4', tree_xspace=2, tree_width=2) tc3['draggable'] = 1 cf.add_widget(tc3, 10, tc.bbox()[3] + 10) def orientswitch(treewidget): if treewidget['orientation'] == 'horizontal': treewidget.expanded_tree(1, 1).subtrees()[0].set_text('vertical') treewidget.collapsed_tree(1, 1).subtrees()[0].set_text('vertical') treewidget.collapsed_tree(1).subtrees()[1].set_text('vertical') treewidget.collapsed_tree().subtrees()[3].set_text('vertical') treewidget['orientation'] = 'vertical' else: treewidget.expanded_tree(1, 1).subtrees()[0].set_text('horizontal') treewidget.collapsed_tree(1, 1).subtrees()[0].set_text('horizontal') treewidget.collapsed_tree(1).subtrees()[1].set_text('horizontal') treewidget.collapsed_tree().subtrees()[3].set_text('horizontal') treewidget['orientation'] = 'horizontal' text = """ Try clicking, right clicking, and dragging different elements of each of the trees. The top-left tree is a TreeWidget built from a Tree. The top-right is a TreeWidget built from a Tree, using non-default widget constructors for the nodes & leaves (BoxWidget and OvalWidget). The bottom-left tree is built from tree_to_treesegment.""" twidget = TextWidget(cf.canvas(), text.strip()) textbox = BoxWidget(cf.canvas(), twidget, fill='white', draggable=1) cf.add_widget(textbox, tc3.bbox()[2] + 10, tc2.bbox()[3] + 10) tree4 = Tree.fromstring('(S (NP this tree) (VP (V is) (Adj horizontal)))') tc4 = TreeWidget(cf.canvas(), tree4, draggable=1, line_color='brown2', roof_color='brown2', node_font=('helvetica', -12, 'bold'), node_color='brown4', orientation='horizontal') tc4.manage() cf.add_widget(tc4, tc3.bbox()[2] + 10, textbox.bbox()[3] + 10) tc4.bind_click(orientswitch) tc4.bind_click_trees(tc4.toggle_collapsed, 3) # Run mainloop cf.mainloop()
return self.spectrum if __name__ == "__main__": #s = "(S#trade$v:-1:4095 (NP#oil$n:-1:63 (NP#oil$n:-1:63 (JJ#Crude$j:1:7 Crude)(NN#oil$n:2:56 oil)))(VP#trade$v:-1:4032 (VBD#trade$v:-1:0 traded)(PP#barrel$n:-1:4032 (IN#at$i:-1:0 at)(NP#barrel$n:-1:4032 (NP#37.80$c:-1:448 ($#$$$:-1:0 $)(CD#37.80$c:3:448 37.80))(NP#barrel$n:-1:3584 (DT#a$d:-1:0 a)(NN#barrel$n:4:3584 barrel))))))" ss = "(S (@S (NP (NP (@NP (DT The) (NN wait)) (NN time)) (PP (IN for) (NP (@NP (DT a) (JJ green)) (NN card)))) (VP (AUX has) (VP (@VP (VBN risen) (PP (IN from) (NP (@NP (NP (CD 21) (NNS months)) (TO to)) (NP (CD 33) (NNS months))))) (PP (IN in) (NP (@NP (DT those) (JJ same)) (NNS regions)))))) (. .))" ss = '(NOTYPE##ROOT(NOTYPE##NP(NOTYPE##S(NOTYPE##NP(NOTYPE##NNP(NOTYPE##Children)))(NOTYPE##VP-REL(NOTYPE##VBG-REL(NOTYPE##W))(NOTYPE##CC(NOTYPE##and))(NOTYPE##VBG(NOTYPE##waving))(NOTYPE##PP(NOTYPE##IN(NOTYPE##W))(NOTYPE##NP(NOTYPE##NN(NOTYPE##camera))))))))' ss = ss.replace(")", ") ").replace("(", " (") t = Tree(string=ss) kernel = partialTreeKernel(dimension=8192, LAMBDA= 0.6, operation=op.fast_shuffled_convolution) v = kernel.sRecursive(t) w = kernel.dt(t) print (v) print (w) #print(kernel.kernel(t,frag))
outStrings.append( treeWithActivationsToString(tree, i, (minmax[0][i], minmax[1][i]))) else: outStrings.append( treeWithActivationsToString(tree, i, minmax_global)) return outStrings if __name__ == "__main__": cf = CanvasFrame() #t = Tree.fromstring('(S (NP:red this pippo) (VP (V is) (AdjP pretty)))') t = Tree(string='(S (NP this pippo) (VP (V is) (AdjP pretty)))') (_, subtrees) = DT.subtrees(t) r.seed(10) swa = [(st, [r.random(), r.random(), r.random()]) for st in subtrees] treeout = activationsCalculator(t, swa) stringout = treesWithActivationsToString(treeout) print(stringout) #activationsVisualizer(t,swa,cf) #cf.mainloop() #tree.demo()