Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
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
Example #5
0
    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))
Example #6
0
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()
Example #7
0
        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))
Example #8
0
            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()