code: def _to_edges(self, tokens):
          
          # prepend self.order Nones
          chain = self._end_context + tokens + self._end_context
  
          has_space = False
  
          context = []
  
          for i in xrange(len(chain)):
              context.append(chain[i])
  
              if len(context) == self.order:
                  if chain[i] == self.SPACE_TOKEN_ID:
                      context.pop()
                      has_space = True
                      continue
  
                  yield tuple(context), has_space
  
                  context.pop(0)
                  has_space = False
docs: This is an iterator that returns the nodes of our graph:
  "This is a test" -> "None This" "This is" "is a" "a test" "test None"
  
  Each is annotated with a boolean that tracks whether whitespace was
  found between the two tokens.