docs: def candidates(text):
          """
          Given a `text` string, get candidates and context for feature
          extraction and classification
          """
          for Pmatch in finditer(TARGET, text):
              # the punctuation mark itself
              P = Pmatch.group(1)
              # is it a boundary?
              B = bool(match(NEWLINE, Pmatch.group(5)))
              # L & R
              start = Pmatch.start()
              end = Pmatch.end()
              Lmatch = search(LTOKEN, text[max(0, start - BUFSIZE):start])
              if not Lmatch:  # this happens when a line begins with '.'
                  continue
              L = word_tokenize(" " + Lmatch.group(1))[-1]
              Rmatch = search(RTOKEN, text[end:end + BUFSIZE])
              if not Rmatch:  # this happens at the end of the file, usually
                  continue
              R = word_tokenize(Rmatch.group(1) + " ")[0]
              # complete observation
              yield Observation(L, P, R, B, end)