Exemple #1
0
def testBtree():
    nodeInfo1 = NodeInfo("Sentence", "S")
    nodeInfo2 = NodeInfo("Henri", "NP")
    nodeInfo3 = NodeInfo("mange", "(S\\NP)/NP")
    nodeInfo4 = NodeInfo("des", "NP\\NP")
    nodeInfo5 = NodeInfo("pommes", "NP")
    nodeInfo6 = NodeInfo("que", "Empty")
    nodeInfo7 = NodeInfo("je", "NP")
    nodeInfo8 = NodeInfo("lui", "NP")
    nodeInfo9 = NodeInfo("donne", "(S\\NP)/NP")

    mytree = BTree()
    mytree.put(nodeInfo1, 0)
    mytree.put(nodeInfo2, 0)
    mytree.put(nodeInfo3, 0)
    mytree.put(nodeInfo4, 1)
    mytree.put(nodeInfo5, 0)
    mytree.put(nodeInfo6, 0)
    mytree.put(nodeInfo7, 1)
    mytree.put(nodeInfo8, 0)
    mytree.put(nodeInfo9, 1)

    mytree.drawTree()

    print(mytree)
Exemple #2
0
    def foreachChunk(self, dtree, chunk):
        bTree = None
        bChildTree = None
        if hasattr(chunk[0], "form") == True:
            i = 0
        else:
            i = len(chunk) - 1
        while i >= 0:
            if hasattr(chunk[i], "form") == True:
                bChildTree = self.buildBranch(chunk, self.key)
                self.key += bChildTree.size + 1
            else:
                bChildTree = self.foreachChunk(dtree, chunk[i])

            if bTree is None:
                bTree = bChildTree
            else:
                tempTree = BTree()
                # can be difine CCG here for node
                treeNode = TreeNode(self.key, NodeInfo("", ccgtag=[]))
                self.key += 1
                treeNode.parent = None
                tempTree.put(treeNode)
                tempTree.putTree(bTree, treeNode, 1)
                tempTree.putTree(bChildTree, treeNode, 0)

                bTree = tempTree
                bChildTree = None
            i -= 1
        return bTree
        ''' #non delete
Exemple #3
0
    def buildTree(self, dTreeCluster, elementList):
        bTree = BTree()
        #for root of tree
        key = 0
        rootTreeNode = TreeNode(key, NodeInfo("Phrase", ccgtag=[]))
        bTree.put(rootTreeNode)
        #for the others
        #left tree
        #self.foreachChunk(bTree, rootTreeNode, dTreeCluster[0], position=0)
        #right tree
        parentChunk = dTreeCluster
        dtree = dTreeCluster
        insertNode = rootTreeNode
        for i in range(0, len(dTreeCluster)):
            self.foreachChunk(bTree,
                              rootTreeNode,
                              dtree,
                              parentChunk,
                              dTreeCluster[i],
                              insertNode,
                              position=0)
        self.assigneDependencyForBTree(bTree, elementList)
        self.adjustTree(bTree)

        return bTree
Exemple #4
0
    def adjustAddingNode(self, treeNode, btree):
        if treeNode.hasLeftChild():
            self.adjustAddingNode(treeNode.leftChild, btree)
        if treeNode.hasRightChild():
            self.adjustAddingNode(treeNode.rightChild, btree)

        if treeNode.nodeInfo.element and treeNode.hasAnyChildren():
            # copie temperal node
            temNode = treeNode
            temNode.key = treeNode.key
            temNode.nodeInfo = treeNode.nodeInfo
            temNode.leftChild = treeNode.leftChild
            temNode.rightChild = treeNode.rightChild
            # set parent for news node
            # temNode.parent = treeNode.parent
            # create a new node

            newsNode = TreeNode(btree.size + 1, NodeInfo("", ccgtag=[]))
            btree.size += 1
            newsNode.parent = treeNode
            treeNode.leftChild = newsNode
            newsNode.nodeInfo = temNode.nodeInfo
            treeNode.nodeInfo = NodeInfo("", ccgtag=[], element=None)
Exemple #5
0
    def buildBranchWithFirstChunk(self, cluster, key):
        primaryElement = cluster[0]
        cluster = sorted(cluster, key=lambda element: int(element.id))
        btreeChild = BTree()
        sizeCluster = len(cluster)
        if sizeCluster == 1:  # Btree with one noeud
            element = cluster[0]
            nodeInfo = NodeInfo(element.form,
                                element=element,
                                ccgtag=[],
                                dependency=element.deprel,
                                cluster=[int(element.id),
                                         int(element.id)])
            treeNode = TreeNode(key, nodeInfo)
            btreeChild.put(treeNode)
            key += 1
        elif len(cluster) >= 2:
            for i in range(0, sizeCluster):
                if btreeChild.length() < 2:

                    nodeInfo = NodeInfo("ccg", ccgtag=[])
                    treeNode = TreeNode(key, nodeInfo)
                    key = key + 1
                    btreeChild.put(treeNode)  # left: 0 root right:1
                    if cluster[i] is primaryElement:
                        element = cluster[i]
                        elementHead = self.findSmallestHeadinChunk(cluster)
                        elementId = self.findSmallestIdinChunk(cluster)
                        if int(element.id) == int(elementId.id) and int(
                                element.head) == int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(element.id),
                                                        int(elementHead.head)
                                                    ])
                        elif int(element.id) != int(elementId.id) and int(
                                element.head) == int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(elementId.id),
                                                        int(elementHead.head)
                                                    ])
                        elif int(element.id) == int(elementId.id) and int(
                                element.head) != int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(elementId.id),
                                                        int(elementHead.head)
                                                    ])
                        else:
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel)
                    else:
                        nodeInfoLeaf = NodeInfo(cluster[i].form,
                                                ccgtag=[],
                                                element=cluster[i],
                                                dependency=None)
                    treeNodeLeaf = TreeNode(key, nodeInfoLeaf, parent=treeNode)
                    key += 1
                    btreeChild.put(treeNodeLeaf, position=0)

                else:
                    btreeChildTemp = BTree()
                    nodeInfo = NodeInfo("ccg", ccgtag=[])
                    treeNode = TreeNode(key, nodeInfo)
                    key += 1
                    btreeChildTemp.put(treeNode)  # left: 0 root right:1
                    if cluster[i] is primaryElement:
                        element = cluster[i]
                        elementHead = self.findSmallestHeadinChunk(cluster)
                        elementId = self.findSmallestIdinChunk(cluster)
                        if int(element.id) == int(elementId.id) and int(
                                element.head) == int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(element.id),
                                                        int(elementHead.head)
                                                    ])
                        elif int(element.id) != int(elementId.id) and int(
                                element.head) == int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(elementId.id),
                                                        int(elementHead.head)
                                                    ])
                        elif int(element.id) == int(elementId.id) and int(
                                element.head) != int(elementHead.head):
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel,
                                                    cluster=[
                                                        int(elementId.id),
                                                        int(elementHead.head)
                                                    ])
                        else:
                            nodeInfoLeaf = NodeInfo(element.form,
                                                    ccgtag=[],
                                                    element=element,
                                                    dependency=element.deprel)

                    else:
                        nodeInfoLeaf = NodeInfo(cluster[i].form,
                                                ccgtag=[],
                                                element=cluster[i],
                                                dependency=None)
                    treeNodeLeaf = TreeNode(key, nodeInfoLeaf, parent=treeNode)
                    key += 1
                    btreeChildTemp.put(treeNodeLeaf, position=0)
                    btreeChild.putTree(btreeChildTemp,
                                       btreeChild.getExtremeRightNode(),
                                       position=1)
        return btreeChild
Exemple #6
0
    def foreachChunkWithComponent(self,
                                  bTree,
                                  currentNode,
                                  dtree,
                                  parentChunk,
                                  chunk,
                                  insertNode,
                                  position=0):
        if hasattr(chunk[0], "form") == False:
            for i in range(0, len(chunk)):
                bTree = self.foreachChunkWithComponent(
                    bTree,
                    currentNode,
                    dtree,
                    chunk,
                    chunk[i],
                    bTree.findNodeHasRightNode(bTree.root),
                    position=position)
            return bTree
        else:
            '''             CurrentNode
                                    \
                                     \
                                    TreeNodeInsert
                                     /
                                    /
                            ChunkChildTree

            '''
            if parentChunk is dtree:
                key = bTree.size
                treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                treeNode.parent = currentNode
                bTree.put(treeNode, 1)
                key += 1
                btreeChild = self.buildBranch(chunk, key)
                # decide branch for putting the child tree in tree
                bTree.putTree(btreeChild, treeNode, position=position)
            else:
                print("chunk: " + self.dTreeChunkRecursiveInText(chunk))
                print("Tree size: " + str(bTree.size))
                if chunk is not parentChunk[len(parentChunk) - 1]:
                    key = bTree.size
                    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                    # treeNode.parent = currentNode
                    print("Insert Node Key: " + str(insertNode.key))
                    bTree._put(treeNode, 1, insertNode)
                    key += 1
                    bTree.size += 1
                    btreeChild = self.buildBranchWithFirstChunk(chunk, key)
                    # decide branch for putting the child tree in tree
                    bTree.putTree(btreeChild, treeNode, position=position)

                    insertNode = btreeChild.findNodeHasRightNode(
                        btreeChild.root)
                    print("Insert Node Key: " + str(insertNode.key))
                else:
                    key = bTree.size
                    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                    # treeNode.parent = currentNode
                    bTree._put(treeNode, 1, insertNode)
                    key += 1
                    bTree.size += 1
                    btreeChild = self.buildBranch(chunk, key)
                    # decide branch for putting the child tree in tree
                    bTree.putTree(btreeChild, treeNode, position=position)
Exemple #7
0
    def foreachChunk(self,
                     bTree,
                     currentNode,
                     dtree,
                     parentChunk,
                     chunk,
                     insertNode,
                     position=0):
        if hasattr(chunk[0], "form") == False:
            for i in range(0, len(chunk)):
                bTree = self.foreachChunk(bTree,
                                          currentNode,
                                          dtree,
                                          chunk,
                                          chunk[i],
                                          bTree.findNodeHasRightNode(
                                              bTree.root),
                                          position=position)
            return bTree
        else:
            '''             CurrentNode
                                    \
                                     \
                                    TreeNodeInsert
                                     /
                                    /
                            ChunkChildTree
                                
            '''
            if parentChunk is dtree:
                key = bTree.size
                treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                treeNode.parent = currentNode
                bTree.put(treeNode, 1)
                key += 1
                btreeChild = self.buildBranch(chunk, key)
                # decide branch for putting the child tree in tree
                bTree.putTree(btreeChild, treeNode, position=position)
            else:
                print("chunk: " + self.dTreeChunkRecursiveInText(chunk))
                print("Tree size: " + str(bTree.size))
                if chunk is not parentChunk[len(parentChunk) - 1]:
                    key = bTree.size
                    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                    #treeNode.parent = currentNode
                    print("Insert Node Key: " + str(insertNode.key))
                    bTree._put(treeNode, 1, insertNode)
                    key += 1
                    bTree.size += 1
                    btreeChild = self.buildBranchWithFirstChunk(chunk, key)
                    # decide branch for putting the child tree in tree
                    bTree.putTree(btreeChild, treeNode, position=position)

                    insertNode = btreeChild.findNodeHasRightNode(
                        btreeChild.root)
                    print("Insert Node Key: " + str(insertNode.key))
                else:
                    key = bTree.size
                    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
                    #treeNode.parent = currentNode
                    bTree._put(treeNode, 1, insertNode)
                    key += 1
                    bTree.size += 1
                    btreeChild = self.buildBranch(chunk, key)
                    # decide branch for putting the child tree in tree
                    bTree.putTree(btreeChild, treeNode, position=position)
                    #insertNode = btreeChild.findNodeHasRightNode(btreeChild.root)
                '''print("co kho " + chunk[0].form + " parent " + parentChunk[0][0].form + " length " + str(len(parentChunk)))
print ("detail " + self.dTreeChunkRecursiveInText(chunk))
print("detail parent " + self.dTreeChunkRecursiveInText(parentChunk))
#build btreeChild
if chunk is parentChunk[len(parentChunk)-1]:
    print("value. " + chunk[0].form + " len:" + str(len(chunk)))
    childTree = BTree()
    key = bTree.size
    childTreeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
    childTree.put(childTreeNode)
    insertNode = None
    for ichunk in range(0, len(parentChunk) - 1):
        print("danh gia: " + parentChunk[ichunk][0].form)
        key = childTree.size + bTree.size
        treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
        if ichunk == 0:
            insertNode = childTreeNode
        print("insert node Info: " + str(insertNode.key))
        childTree.putNode(treeNode, 1, insertNode)
        key += 1
        childTree.size += 1
        btreeChild = self.buildBranchWithFirstChunk(parentChunk[ichunk], key)

        # decide branch for putting the child tree in tree
        childTree.putTree(btreeChild, treeNode, position=position)
        insertNode = childTree.findNodeHasRightNode(childTree.root)

    key = childTree.size + bTree.size
    finalChunk = parentChunk[len(parentChunk) - 1]
    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
    childTree.putNode(treeNode, 1, insertNode)
    key += 1
    childTree.size += 1
    btreeChild = self.buildBranch(finalChunk, key)
    # decide branch for putting the child tree in tree
    childTree.putTree(btreeChild, treeNode, 1)

    key = bTree.size + childTree.size
    treeNode = TreeNode(key, NodeInfo("", ccgtag=[]))
    treeNode.parent = currentNode
    bTree.put(treeNode, 1)

    # decide branch for putting the child tree in tree
    bTree.putTree(childTree, treeNode, position=position)
    bTree = childTree'''
            return bTree