if (tag != null ? prunedPretermsPosSet.contains(tag) : (prunedPretermsPosMap.containsKey(word) && !word.toString().equals("'"))) {
if (Language.training().removeWord(word, tag, i, sentence, tags, originalTags, prunedPretermsPosSet, prunedPretermsPosMap))
  protected void preProcess(SexpList sentence, SexpList tags)  throws RemoteException {    // preserve original sentence    originalSentence.clear();    originalSentence.addAll(sentence);    // preserve original tags, if non-null    if (tags != null)      originalTags = new SexpList(tags);    else      originalTags = null;    originalWords.clear();    originalWords.addAll(sentence);    // eliminate pruned words    for (int i = sentence.length() - 1; i >= 0; i--) {      Symbol word = (downcaseWords ?		     Symbol.get(sentence.get(i).toString().toLowerCase()) :		     sentence.symbolAt(i));      Symbol tag = tags == null ? null : tags.listAt(i).first().symbol();      if (tag != null ? prunedPretermsPosSet.contains(tag) :			(prunedPretermsPosMap.containsKey(word) &&			 !word.toString().equals("'"))) {	removeWord(sentence, tags, i);      }    }    SexpList convertedSentence = server.convertUnknownWords(sentence);    // we cannot just say    //   sentence = server.convertUnknownWords(sentence);    // because the server might return a copy of the sentence list (this is    // guaranteed to happen if the server is remote), and we need    // to modify the object that was passed as an arg to this function, because    // that's what the caller of preProcess expects; the alternative would be    // for this method to work with the (potentially) different list object    // returned by the server and then return that list object, but then this    // method should probably also return the tags list as well, making things    // difficult, since we only get to return a single object    if (convertedSentence != sentence) {      sentence.clear();      sentence.addAll(convertedSentence);    }    // downcase words    int sentLen = sentence.length();    if (downcaseWords) {      for (int i = 0; i < sentLen; i++) {	if (sentence.get(i).isList()) // skip unknown words	  continue;	Symbol downcasedWord =	  Symbol.add(sentence.symbolAt(i).toString().toLowerCase());	sentence.set(i, downcasedWord);      }    }    // remove intitial and final punctuation "words"    for (int i = 0; i < sentence.length() - 1; i++) {      if (sentence.get(i).isList())	break;      if (isPuncRaiseWord(sentence.get(i))) {	removeWord(sentence, tags, i);	i--;      }      else	break;    }    for (int i = sentence.length() - 1; i > 0; i--) {      if (sentence.get(i).isList())	break;      if (isPuncRaiseWord(sentence.get(i))) {	removeWord(sentence, tags, i);      }      else	break;    }    // finally, perform any language-specific pre-processing of the words    // and tags    SexpList langSpecific =      Language.training.preProcessTest(sentence, originalWords, tags);    sentence = langSpecific.listAt(0);    if (tags != null)      tags = langSpecific.listAt(1);  }