      return alignment
  
  
  punct_re = re.compile(r'\W')
  
  
  def _min_edit_path(cand_words, gold_words):
      cdef:
          Pool mem
          int i, j, n_cand, n_gold
          int* curr_costs
          int* prev_costs
  
      # TODO: Fix this --- just do it properly, make the full edit matrix and
      # then walk back over it...
      # Preprocess inputs
      cand_words = [punct_re.sub('', w).lower() for w in cand_words]
      gold_words = [punct_re.sub('', w).lower() for w in gold_words]
  
      if cand_words == gold_words:
          return 0, ''.join(['M' for _ in gold_words])
      mem = Pool()
      n_cand = len(cand_words)
      n_gold = len(gold_words)
 
</s> remove         return 0, ''.join(['M' for _ in gold_words])
    mem = Pool()
    n_cand = len(cand_words)
    n_gold = len(gold_words)
    # Levenshtein distance, except we need the history, and we may want
    # different costs. Mark operations with a string, and score the history
    # using _edit_cost.
    previous_row = []
    prev_costs = <int*>mem.alloc(n_gold + 1, sizeof(int))
    curr_costs = <int*>mem.alloc(n_gold + 1, sizeof(int))
    for i in range(n_gold + 1):
        cell = ''
        for j in range(i):
            cell += 'I'
        previous_row.append('I' * i)
        prev_costs[i] = i
    for i, cand in enumerate(cand_words):
        current_row = ['D' * (i + 1)]
        curr_costs[0] = i+1
        for j, gold in enumerate(gold_words):
            if gold.lower() == cand.lower():
                s_cost = prev_costs[j]
                i_cost = curr_costs[j] + 1
                d_cost = prev_costs[j + 1] + 1
            else:
                s_cost = prev_costs[j] + 1
                i_cost = curr_costs[j] + 1
                d_cost = prev_costs[j + 1] + (1 if cand else 0)

            if s_cost <= i_cost and s_cost <= d_cost:
                best_cost = s_cost
                best_hist = previous_row[j] + ('M' if gold == cand else 'S')
            elif i_cost <= s_cost and i_cost <= d_cost:
                best_cost = i_cost
                best_hist = current_row[j] + 'I'
            else:
                best_cost = d_cost
                best_hist = previous_row[j + 1] + 'D'

            current_row.append(best_hist)
            curr_costs[j+1] = best_cost
        previous_row = current_row
        for j in range(len(gold_words) + 1):
            prev_costs[j] = curr_costs[j]
            curr_costs[j] = 0

    return prev_costs[n_gold], previous_row[-1]
 </s> add         alignment = numpy.arange(len(cand_words))
        return 0, alignment, alignment, {}, {}
    cand_words = [w.replace(' ', '') for w in cand_words]
    gold_words = [w.replace(' ', '') for w in gold_words]
    cost, i2j, j2i, matrix = _align.align(cand_words, gold_words)
    i2j_multi, j2i_multi = _align.multi_align(i2j, j2i, [len(w) for w in cand_words],
                                [len(w) for w in gold_words])
    for i, j in list(i2j_multi.items()):
        if i2j_multi.get(i+1) != j and i2j_multi.get(i-1) != j:
            i2j[i] = j
            i2j_multi.pop(i)
    for j, i in list(j2i_multi.items()):
        if j2i_multi.get(j+1) != i and j2i_multi.get(j-1) != i:
            j2i[j] = i
            j2i_multi.pop(j)
    return cost, i2j, j2i, i2j_multi, j2i_multi </s> remove def align(cand_words, gold_words):
    cost, edit_path = _min_edit_path(cand_words, gold_words)
    alignment = []
    i_of_gold = 0
    for move in edit_path:
        if move == 'M':
            alignment.append(i_of_gold)
            i_of_gold += 1
        elif move == 'S':
            alignment.append(None)
            i_of_gold += 1
        elif move == 'D':
            alignment.append(None)
        elif move == 'I':
            i_of_gold += 1
        else:
            raise Exception(move)
    return alignment


 </s> add  </s> remove         for i in range(self.max_length):
            self._phrase_key[i] = 0
 </s> add         cdef Pool mem = Pool()
        phrase_key = <attr_t*>mem.alloc(end-start, sizeof(attr_t))
def align(cand_words, gold_words):
      return alignment
  
  
  punct_re = re.compile(r'\W')
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
def align(cand_words, gold_words):
      if cand_words == gold_words:
          return 0, ''.join(['M' for _ in gold_words])
      mem = Pool()
      n_cand = len(cand_words)
      n_gold = len(gold_words)
keep keep keep keep replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace keep keep keep keep keep
 Revert "Merge branch 'develop' of https://github.com/explosion/spaCy into develop"

This reverts commit c9ba3d3c2dc7067cf8bd55f878cec45a8c6d73d4, reversing
changes made to 92c26a35d425d4e8ca1b805ea776ea10f5ded3df. 
spacy/gold.pyx