docs: def as_dependencygraph( self, keep_dummy_root=False, add_morph=True ):
          ''' Returns this tree as NLTK's DependencyGraph object.
              
              Note that this method constructs 'zero_based' graph,
              where counting of the words starts from 0 and the 
              root index is -1 (not 0, as in Malt-TAB format);
              
              Parameters
              -----------
              add_morph : bool
                  Specifies whether the morphological information 
                  (information about word lemmas, part-of-speech, and 
                  features) should be added to graph nodes.
                  Note that even if **add_morph==True**, morphological
                  information is only added if it is available via
                  estnltk's layer  token['analysis'];
                  Default: True
              keep_dummy_root : bool
                  Specifies whether the graph should include a dummy
                  TOP / ROOT node, which does not refer to any word,
                  and yet is the topmost node of the tree.
                  If the dummy root node is not used, then the root 
                  node is the word node headed by -1;
                  Default: False
              
              For more information about NLTK's DependencyGraph, see:
               http://www.nltk.org/_modules/nltk/parse/dependencygraph.html
          '''
          from nltk.parse.dependencygraph import DependencyGraph
          graph = DependencyGraph( zero_based = True )
          all_tree_nodes = [self] + self.get_children()
          #
          # 0) Fix the root
          #
          if keep_dummy_root:
              #  Note: we have to re-construct  the root node manually, 
              #  as DependencyGraph's current interface seems to provide
              #  no easy/convenient means for fixing the root node;
              graph.nodes[-1] = graph.nodes[0]
              graph.nodes[-1].update( { 'address': -1 } )
              graph.root = graph.nodes[-1]
          del graph.nodes[0]
          #
          # 1) Update / Add nodes of the graph 
          #
          for child in all_tree_nodes:
              rel  = 'xxx' if not child.labels else '|'.join(child.labels)
              address = child.word_id
              word    = child.text
              graph.nodes[address].update(
              {
                  'address': address,
                  'word':  child.text,
                  'rel':   rel,
              } )
              if not keep_dummy_root and child == self:
                  # If we do not keep the dummy root node, set this tree
                  # as the root node
                  graph.root = graph.nodes[address]
              if add_morph and child.morph:
                  # Add morphological information, if possible
                  lemmas  = set([analysis[LEMMA] for analysis in child.morph])
                  postags = set([analysis[POSTAG] for analysis in child.morph])
                  feats   = set([analysis[FORM] for analysis in child.morph])
                  lemma  = ('|'.join( list(lemmas)  )).replace(' ','_')
                  postag = ('|'.join( list(postags) )).replace(' ','_')
                  feats  = ('|'.join( list(feats) )).replace(' ','_')
                  graph.nodes[address].update(
                  {
                      'tag  ': postag,
                      'ctag' : postag,
                      'feats': feats,
                      'lemma': lemma
                  } )
  
          #
          # 2) Update / Add arcs of the graph 
          #
          for child in all_tree_nodes:
              #  Connect children of given word
              deps = [] if not child.children else [c.word_id for c in child.children]
              head_address = child.word_id
              for dep in deps:
                  graph.add_arc( head_address, dep )
              if child.parent == None and keep_dummy_root:
                  graph.add_arc( -1, head_address )
              #  Connect the parent of given node
              head = -1 if not child.parent else child.parent.word_id
              graph.nodes[head_address].update(
              {
                  'head':  head,
              } )
          return graph