normalizeTokens = function (tokens) {
  if (typeof tokens === 'string') {
    tokens = [tokens]
  }
  let results = []
  const ruleCount = rules.length
  const numTokens = tokens.length
  let i, token, r, rule

  for (i = 0; i < numTokens; i++) {
    token = tokens[i]
    // Check the conversion table
    if (conversionTable[token.toLowerCase()]) {
      results = results.concat(conversionTable[token.toLowerCase()].split(/\W+/))
    } else { // Apply the rules
      let matched = false
      for (r = 0; r < ruleCount; r++) {
        rule = rules[r]
        if (token.match(rule.regex)) {
          results = results.concat(token.replace(rule.regex, rule.output).split(/\W+/))
          matched = true
          break
        }
      }
      if (!matched) {
        results.push(token)
      }
    }
  }

  return results
}
The english normalizer will create a string in which all contractions are expanded to their
full meaning (i.e. "we'll" becomes "we will").

It currently works off a conversion table and falls back to a set of rules.
Since it is applied first, the conversion table provides an "override" for the rules.