code: func (pt *PerceptronTagger) Tag(words []string) []Token {
  	var tokens []Token
  	var clean []string
  	var tag string
  	var found bool
  
  	p1, p2 := "-START-", "-START2-"
  	context := []string{p1, p2}
  	for _, w := range words {
  		if w == "" {
  			continue
  		}
  		context = append(context, normalize(w))
  		clean = append(clean, w)
  	}
  	context = append(context, []string{"-END-", "-END2-"}...)
  	for i, word := range clean {
  		if none.MatchString(word) {
  			tag = "-NONE-"
  		} else if keep.MatchString(word) {
  			tag = word
  		} else if tag, found = pt.model.tagMap[word]; !found {
  			tag = pt.model.predict(featurize(i, context, word, p1, p2))
  		}
  		tokens = append(tokens, Token{Tag: tag, Text: word})
  		p2 = p1
  		p1 = tag
  	}
  
  	return tokens
  }
docs: // Tag takes a slice of words and returns a slice of tagged tokens.