docs: public Iterator<IntTaggedWord> ruleIteratorByWord(int word, int loc, String featureSpec) {
      // if (rulesWithWord == null) { // tested in isKnown already
      // initRulesWithWord();
      // }
      List<IntTaggedWord> wordTaggings;
      if (isKnown(word)) {
        if ( ! flexiTag) {
          // Strict lexical tagging for seen items
          wordTaggings = rulesWithWord[word];
        } else {
          /* Allow all tags with same basicCategory */
          /* Allow all scored taggings, unless very common */
          IntTaggedWord iW = new IntTaggedWord(word, nullTag);
          if (seenCounter.getCount(iW) > smoothInUnknownsThreshold) {
            return rulesWithWord[word].iterator();
          } else {
            // give it flexible tagging not just lexicon
            wordTaggings = new ArrayList<IntTaggedWord>(40);
            for (IntTaggedWord iTW2 : tags) {
              IntTaggedWord iTW = new IntTaggedWord(word, iTW2.tag);
              if (score(iTW, loc, wordIndex.get(word)) > Float.NEGATIVE_INFINITY) {
                wordTaggings.add(iTW);
              }
            }
          }
        }
      } else {
        // we copy list so we can insert correct word in each item
        wordTaggings = new ArrayList<IntTaggedWord>(40);
        for (IntTaggedWord iTW : rulesWithWord[wordIndex.indexOf(UNKNOWN_WORD)]) {
          wordTaggings.add(new IntTaggedWord(word, iTW.tag));
        }
      }
      if (DEBUG_LEXICON) {
        EncodingPrintWriter.err.println("Lexicon: " + wordIndex.get(word) + " (" +
                (isKnown(word) ? "known": "unknown") + ", loc=" + loc + ", n=" +
                (isKnown(word) ? word: wordIndex.indexOf(UNKNOWN_WORD)) + ") " +
                (flexiTag ? "flexi": "lexicon") + " taggings: " + wordTaggings, "UTF-8");
      }
      return wordTaggings.iterator();
   }