All Downloads are FREE. Search and download functionalities are using the official Maven repository.

edu.stanford.nlp.process.Morpha.flex Maven / Gradle / Ivy

Go to download

Stanford Parser processes raw text in English, Chinese, German, Arabic, and French, and extracts constituency parse trees.

There is a newer version: 3.9.2
Show newest version
package edu.stanford.nlp.process;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.logging.Logger;

import edu.stanford.nlp.util.Generics;

%%

%class Morpha
%unicode
%function next
%type String
%caseless

%{

  private static final Logger LOGGER = Logger.getLogger(Morphology.class.getName());

 /** If this option is set, print the word affix after a + character */
 private final static int print_affixes = 0;  
 /** If this option is set, lowercase all tokens */
 private final static int change_case = 1;
 /** Return the tags on the input words if present?? */
 private final static int tag_output= 2;

  //accessors for the options maintained as booleans
  private final boolean[] options;
  private static final int NUM_OPTIONS = 3;
  void setOption(int i, boolean b)	 { options[i] = b; }
  boolean  option(int i)	{ return (options[i]); }
  void setOptions(int opts) {
    for (int i = 0; i < NUM_OPTIONS; i++) {
      setOption(i, (opts & (1 << i)) != 0);
    }
  }

 private final static boolean noTags = false;

 // A list of verbs that have doubling of consonants 
 // this list can be rebuilt with the main method in process.Morphology!
 // the verb stem list lives in "/u/nlp/data/morph/verbstem.list"
 private static final String[] verbStems = { "abat", 
    "abet", "abhor", "abut", "accur", "acquit", 
    "adlib", "admit", "aerobat", "aerosol", "agendaset", 
    "allot", "alot", "anagram", "annul", "appal", 
    "apparel", "armbar", "aver", "babysit", "airdrop", 
    "appal", "blackleg", "bobsled", "bur", "chum", 
    "confab", "counterplot", "curet", "dib", "backdrop", 
    "backfil", "backflip", "backlog", "backpedal", "backslap", 
    "backstab", "bag", "balfun", "ballot", "ban", 
    "bar", "barbel", "bareleg", "barrel", "bat", 
    "bayonet", "becom", "bed", "bedevil", "bedwet", 
    "beenhop", "befit", "befog", "beg", "beget", 
    "begin", "bejewel", "bemedal", "benefit", "benum", 
    "beset", "besot", "bestir", "bet", "betassel", 
    "bevel", "bewig", "bib", "bid", "billet", 
    "bin", "bip", "bit", "bitmap", "blab", 
    "blag", "blam", "blan", "blat", "bles", 
    "blim", "blip", "blob", "bloodlet", "blot", 
    "blub", "blur", "bob", "bodypop", "bog", 
    "booby-trap", "boobytrap", "booksel", "bootleg", "bop", 
    "bot", "bowel", "bracket", "brag", "brig", 
    "brim", "bud", "buffet", "bug", "bullshit", 
    "bum", "bun", "bus", "but", "cab", 
    "cabal", "cam", "can", "cancel", "cap", 
    "caracol", "caravan", "carburet", "carnap", "carol", 
    "carpetbag", "castanet", "cat", "catcal", "catnap", 
    "cavil", "chan", "chanel", "channel", "chap", 
    "char", "chargecap", "chat", "chin", "chip", 
    "chir", "chirrup", "chisel", "chop", "chug", 
    "chur", "clam", "clap", "clearcut", "clip", 
    "clodhop", "clog", "clop", "closet", "clot", 
    "club", "co-occur", "co-program", "co-refer", "co-run", 
    "co-star", "cob", "cobweb", "cod", "coif", 
    "com", "combat", "comit", "commit", "compel", 
    "con", "concur", "confer", "confiscat", "control", 
    "cop", "coquet", "coral", "corbel", "corral", 
    "cosset", "cotransmit", "councel", "council", "counsel", 
    "court-martial", "crab", "cram", "crap", "crib", 
    "crop", "crossleg", "cub", "cudgel", "cum", 
    "cun", "cup", "cut", "dab", "dag", 
    "dam", "dan", "dap", "daysit", "de-control", 
    "de-gazet", "de-hul", "de-instal", "de-mob", "de-program", 
    "de-rig", "de-skil", "deadpan", "debag", "debar", 
    "debug", "decommit", "decontrol", "defer", "defog", 
    "deg", "degas", "deinstal", "demit", "demob", 
    "demur", "den", "denet", "depig", "depip", 
    "depit", "der", "deskil", "deter", "devil", 
    "diagram", "dial", "dig", "dim", "din", 
    "dip", "disbar", "disbud", "discomfit", "disembed", 
    "disembowel", "dishevel", "disinter", "dispel", "disprefer", 
    "distil", "dog", "dognap", "don", "doorstep", 
    "dot", "dowel", "drag", "drat", "driftnet", 
    "distil", "egotrip", "enrol", "enthral", "extol", 
    "fulfil", "gaffe", "golliwog", "idyl", "inspan", 
    "drip", "drivel", "drop", "drub", "drug", 
    "drum", "dub", "duel", "dun", "dybbuk", 
    "earwig", "eavesdrop", "ecolabel", "eitherspigot", "electroblot", 
    "embed", "emit", "empanel", "enamel", "endlabel", 
    "endtrim", "enrol", "enthral", "entrammel", "entrap", 
    "enwrap", "equal", "equip", "estop", "exaggerat", 
    "excel", "expel", "extol", "fag", "fan", 
    "farewel", "fat", "featherbed", "feget", "fet", 
    "fib", "fig", "fin", "fingerspel", "fingertip", 
    "fit", "flab", "flag", "flap", "flip", 
    "flit", "flog", "flop", "fob", "focus", 
    "fog", "footbal", "footslog", "fop", "forbid", 
    "forget", "format", "fortunetel", "fot", "foxtrot", 
    "frag", "freefal", "fret", "frig", "frip", 
    "frog", "frug", "fuel", "fufil", "fulfil", 
    "fullyfit", "fun", "funnel", "fur", "furpul", 
    "gab", "gad", "gag", "gam", "gambol", 
    "gap", "garot", "garrot", "gas", "gat", 
    "gel", "gen", "get", "giftwrap", "gig", 
    "gimbal", "gin", "glam", "glenden", "glendin", 
    "globetrot", "glug", "glut", "gob", "goldpan", 
    "goostep", "gossip", "grab", "gravel", "grid", 
    "grin", "grip", "grit", "groundhop", "grovel", 
    "grub", "gum", "gun", "gunrun", "gut", 
    "gyp", "haircut", "ham", "han", "handbag", 
    "handicap", "handknit", "handset", "hap", "hareleg", 
    "hat", "headbut", "hedgehop", "hem", "hen", 
    "hiccup", "highwal", "hip", "hit", "hobnob", 
    "hog", "hop", "horsewhip", "hostel", "hot", 
    "hotdog", "hovel", "hug", "hum", "humbug", 
    "hup", "hushkit", "hut", "illfit", "imbed", 
    "immunblot", "immunoblot", "impannel", "impel", "imperil", 
    "incur", "infer", "infil", "inflam", "initial", 
    "input", "inset", "instil", "inter", "interbed", 
    "intercrop", "intercut", "interfer", "instal", "instil", 
    "intermit", "japan", "jug", "kris", "manumit", 
    "mishit", "mousse", "mud", "interwar", "jab", 
    "jag", "jam", "jar", "jawdrop", "jet", 
    "jetlag", "jewel", "jib", "jig", "jitterbug", 
    "job", "jog", "jog-trot", "jot", "jut", 
    "ken", "kennel", "kid", "kidnap", "kip", 
    "kissogram", "kit", "knap", "kneecap", "knit", 
    "knob", "knot", "kor", "label", "lag", 
    "lam", "lap", "lavel", "leafcut", "leapfrog", 
    "leg", "lem", "lep", "let", "level", 
    "libel", "lid", "lig", "lip", "lob", 
    "log", "lok", "lollop", "longleg", "lop", 
    "lowbal", "lug", "mackerel", "mahom", "man", 
    "map", "mar", "marshal", "marvel", "mat", 
    "matchwin", "metal", "micro-program", "microplan", "microprogram", 
    "milksop", "mis-cal", "mis-club", "mis-spel", "miscal", 
    "mishit", "mislabel", "mit", "mob", "mod", 
    "model", "mohmam", "monogram", "mop", "mothbal", 
    "mug", "multilevel", "mum", "nab", "nag", 
    "nan", "nap", "net", "nightclub", "nightsit", 
    "nip", "nod", "nonplus", "norkop", "nostril", 
    "not", "nut", "nutmeg", "occur", "ocur", 
    "offput", "offset", "omit", "ommit", "onlap", 
    "out-general", "out-gun", "out-jab", "out-plan", "out-pol", 
    "out-pul", "out-put", "out-run", "out-sel", "outbid", 
    "outcrop", "outfit", "outgas", "outgun", "outhit", 
    "outjab", "outpol", "output", "outrun", "outship", 
    "outshop", "outsin", "outstrip", "outswel", "outspan", 
    "overcrop", "pettifog", "photostat", "pouf", "preset", 
    "prim", "pug", "ret", "rosin", "outwit", 
    "over-commit", "over-control", "over-fil", "over-fit", "over-lap", 
    "over-model", "over-pedal", "over-pet", "over-run", "over-sel", 
    "over-step", "over-tip", "over-top", "overbid", "overcal", 
    "overcommit", "overcontrol", "overcrap", "overdub", "overfil", 
    "overhat", "overhit", "overlap", "overman", "overplot", 
    "overrun", "overshop", "overstep", "overtip", "overtop", 
    "overwet", "overwil", "pad", "paintbal", "pan", 
    "panel", "paperclip", "par", "parallel", "parcel", 
    "partiescal", "pat", "patrol", "pedal", "peewit", 
    "peg", "pen", "pencil", "pep", "permit", 
    "pet", "petal", "photoset", "phototypeset", "phut", 
    "picket", "pig", "pilot", "pin", "pinbal", 
    "pip", "pipefit", "pipet", "pit", "plan", 
    "plit", "plod", "plop", "plot", "plug", 
    "plumet", "plummet", "pod", "policyset", "polyfil", 
    "ponytrek", "pop", "pot", "pram", "prebag", 
    "predistil", "predril", "prefer", "prefil", "preinstal", 
    "prep", "preplan", "preprogram", "prizewin", "prod", 
    "profer", "prog", "program", "prop", "propel", 
    "pub", "pummel", "pun", "pup", "pushfit", 
    "put", "quarel", "quarrel", "quickskim", "quickstep", 
    "quickwit", "quip", "quit", "quivertip", "quiz", 
    "rabbit", "rabit", "radiolabel", "rag", "ram", 
    "ramrod", "rap", "rat", "ratecap", "ravel", 
    "re-admit", "re-cal", "re-cap", "re-channel", "re-dig", 
    "re-dril", "re-emit", "re-fil", "re-fit", "re-flag", 
    "re-format", "re-fret", "re-hab", "re-instal", "re-inter", 
    "re-lap", "re-let", "re-map", "re-metal", "re-model", 
    "re-pastel", "re-plan", "re-plot", "re-plug", "re-pot", 
    "re-program", "re-refer", "re-rig", "re-rol", "re-run", 
    "re-sel", "re-set", "re-skin", "re-stal", "re-submit", 
    "re-tel", "re-top", "re-transmit", "re-trim", "re-wrap", 
    "readmit", "reallot", "rebel", "rebid", "rebin", 
    "rebut", "recap", "rechannel", "recommit", "recrop", 
    "recur", "recut", "red", "redril", "refer", 
    "refit", "reformat", "refret", "refuel", "reget", 
    "regret", "reinter", "rejig", "rekit", "reknot", 
    "relabel", "relet", "rem", "remap", "remetal", 
    "remit", "remodel", "reoccur", "rep", "repel", 
    "repin", "replan", "replot", "repol", "repot", 
    "reprogram", "rerun", "reset", "resignal", "resit", 
    "reskil", "resubmit", "retransfer", "retransmit", "retro-fit", 
    "retrofit", "rev", "revel", "revet", "rewrap", 
    "rib", "richochet", "ricochet", "rid", "rig", 
    "rim", "ringlet", "rip", "rit", "rival", 
    "rivet", "roadrun", "rob", "rocket", "rod", 
    "roset", "rot", "rowel", "rub", "run", 
    "runnel", "rut", "sab", "sad", "sag", 
    "sandbag", "sap", "scab", "scalpel", "scam", 
    "scan", "scar", "scat", "schlep", "scrag", 
    "scram", "shall", "sled", "smut", "stet", 
    "sulfuret", "trepan", "unrip", "unstop", "whir", 
    "whop", "wig", "scrap", "scrat", "scrub", 
    "scrum", "scud", "scum", "scur", "semi-control", 
    "semi-skil", "semi-skim", "semiskil", "sentinel", "set", 
    "shag", "sham", "shed", "shim", "shin", 
    "ship", "shir", "shit", "shlap", "shop", 
    "shopfit", "shortfal", "shot", "shovel", "shred", 
    "shrinkwrap", "shrivel", "shrug", "shun", "shut", 
    "side-step", "sideslip", "sidestep", "signal", "sin", 
    "sinbin", "sip", "sit", "skid", "skim", 
    "skin", "skip", "skir", "skrag", "slab", 
    "slag", "slam", "slap", "slim", "slip", 
    "slit", "slob", "slog", "slop", "slot", 
    "slowclap", "slug", "slum", "slur", "smit", 
    "snag", "snap", "snip", "snivel", "snog", 
    "snorkel", "snowcem", "snub", "snug", "sob", 
    "sod", "softpedal", "son", "sop", "spam", 
    "span", "spar", "spat", "spiderweb", "spin", 
    "spiral", "spit", "splat", "split", "spot", 
    "sprag", "spraygun", "sprig", "springtip", "spud", 
    "spur", "squat", "squirrel", "stab", "stag", 
    "star", "stem", "sten", "stencil", "step", 
    "stir", "stop", "storytel", "strap", "strim", 
    "strip", "strop", "strug", "strum", "strut", 
    "stub", "stud", "stun", "sub", "subcrop", 
    "sublet", "submit", "subset", "suedetrim", "sum", 
    "summit", "sun", "suntan", "sup", "super-chil", 
    "superad", "swab", "swag", "swan", "swap", 
    "swat", "swig", "swim", "swivel", "swot", 
    "tab", "tag", "tan", "tansfer", "tap", 
    "tar", "tassel", "tat", "tefer", "teleshop", 
    "tendril", "terschel", "th'strip", "thermal", "thermostat", 
    "thin", "throb", "thrum", "thud", "thug", 
    "tightlip", "tin", "tinsel", "tip", "tittup", 
    "toecap", "tog", "tom", "tomorrow", "top", 
    "tot", "total", "towel", "traget", "trainspot", 
    "tram", "trammel", "transfer", "tranship", "transit", 
    "transmit", "transship", "trap", "travel", "trek", 
    "trendset", "trim", "trip", "tripod", "trod", 
    "trog", "trot", "trousseaushop", "trowel", "trup", 
    "tub", "tug", "tunnel", "tup", "tut", 
    "twat", "twig", "twin", "twit", "typeset", 
    "tyset", "un-man", "unban", "unbar", "unbob", 
    "uncap", "unclip", "uncompel", "undam", "under-bil", 
    "under-cut", "under-fit", "under-pin", "under-skil", "underbid", 
    "undercut", "underlet", "underman", "underpin", "unfit", 
    "unfulfil", "unknot", "unlip", "unlywil", "unman", 
    "unpad", "unpeg", "unpin", "unplug", "unravel", 
    "unrol", "unscrol", "unsnap", "unstal", "unstep", 
    "unstir", "untap", "unwrap", "unzip", "up", 
    "upset", "upskil", "upwel", "ven", "verbal", 
    "vet", "victual", "vignet", "wad", "wag", 
    "wainscot", "wan", "war", "water-log", "waterfal", 
    "waterfil", "waterlog", "weasel", "web", "wed", 
    "wet", "wham", "whet", "whip", "whir", 
    "whiteskin", "whiz", "whup", "wildcat", "win", 
    "windmil", "wit", "woodchop", "woodcut", "wor", 
    "worship", "wrap", "will", "wiretap", "yen", 
    "yak", "yap", "yarnspin", "yip", "yodel", 
    "zag", "zap", "zig", "zig-zag", "zigzag", 
    "zip", "ztrip" };

 private final Set verbStemSet;

%}


%init{
  options = new boolean[NUM_OPTIONS];
  for (int j=0;j loadVerbStemSet(String[] verbStems) {
  Set set = Generics.newHashSet(verbStems.length);
  for (String stem : verbStems) {
    set.add(stem);
  }
  return set;
}    


String condub_stem(int del, String add, String affix) {
  StringBuilder yytextBuff;
  if (option(change_case)) {
    yytextBuff = new StringBuilder(yytext().toLowerCase());
  } else {
    yytextBuff = new StringBuilder(yytext());
  }

  int stem_length = yylength() - del;
  char d = yytextBuff.charAt(stem_length - 1);
  if (del > 0) { yytextBuff.setLength(stem_length-1); }

  if ( ! verbStemSet.contains(yytextBuff.toString().toLowerCase())) {
    yytextBuff.append(d);
  } 

  if (option(print_affixes)) { yytextBuff.append('+'); yytextBuff.append(affix); }

  return yytextBuff.toString();
}


  /** word is a singular- or plural-only noun. */
  String xnull_stem() {
    return common_noun_stem();
  }

  /** this form is actually the stem so don't apply any generic analysis rules.
   */
  String cnull_stem() {
    return common_noun_stem();
  }


  /** the +ed/+en form is the same as the stem */
  String null_stem() {
    return common_noun_stem();
  }

  /** Delete del letters from end of token, and append string add to
   *  give stem.  Return affix as the affix of the word.
   */
  private String stem(int del, String add, String affix) {
    int stem_length = yylength() - del;
    int i = 0;

    String result=yytext().substring(0,stem_length); 

    if (option(change_case)) { result=result.toLowerCase(); }
    if (!(add.length()==0)) result+=add;

    if(option(print_affixes)) { result+=("+"+affix); }

    return result;
  }


  private String semi_reg_stem(int del, String add) {
    int stem_length = 0;
    int i = 0;
    String affix="";
 
    char[] yytext=yytext().toCharArray();
    int yyleng=yylength(); 

     if (yytext[yyleng-1] == 's' || yytext[yyleng-1] == 'S') {
       stem_length = yyleng - 2 - del; 
       affix = "s"; 
     }
     if (yytext[yyleng-1] == 'd' || yytext[yyleng-1] == 'D') {
       stem_length = yyleng - 2 - del; 
       affix = "ed"; 
     }
     if (yytext[yyleng-1] == 'g' || yytext[yyleng-1] == 'G') {
       stem_length = yyleng - 3 - del; 
       affix = "ing"; 
     }

    String result=yytext().substring(0,stem_length);

    if(option(change_case)){
      result=result.toLowerCase();
    }

    result+=add;
    if (option(print_affixes)) {
      result+="+"+affix; 
    }
 
    return result;
   }

%}

%xstate verb noun any scan




A = ['+a-zA-Z0-9]
V = [aeiouAEIOU]
VY = [aeiouyAEIOUY]
C = [bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]
CXY = [bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]
CXY2 = "bb"|"cc"|"dd"|"ff"|"gg"|"hh"|"jj"|"kk"|"ll"|"mm"|"nn"|"pp"|"qq"|"rr"|"ss"|"tt"|"vv"|"ww"|"xx"|"zz"
S2 = "ss"|"zz"
S = [sxzSXZ]|([csCS]"h")
PRE = "be"|"ex"|"in"|"mis"|"pre"|"pro"|"re"
EDING = "ed"|"ing"
ESEDING = "es"|"ed"|"ing"
G = [^ \t\r\n\u2028\u2029\u000B\u000C\u0085_]
GM = [^ \t\r\n\u2028\u2029\u000B\u000C\u0085_-]
SKIP = [ \t\r\n\u2028\u2029\u000B\u000C\u0085]

%%

 /* can and will not always modal so can be inflected */
"shall"  { return(ynull_stem()); }
"would"  { return(ynull_stem()); }
"may"  { return(ynull_stem()); }
"might"  { return(ynull_stem()); }
"ought"  { return(ynull_stem()); }
"should"  { return(ynull_stem()); }
"am"  { return(stem(2,"be","")); }
"are"  { return(stem(3,"be","")); }             /* disprefer */
"is"  { return(stem(2,"be","s")); }           
"was"  { return(stem(3,"be","ed")); }
"wast"  { return(stem(4,"be","ed")); }          /* disprefer */
"wert"  { return(stem(4,"be","ed")); }          /* disprefer */
"were"  { return(stem(4,"be","ed")); }          /* disprefer */
"being"  { return(stem(5,"be","ing")); }        
"been"  { return(stem(4,"be","en")); }          
"had"  { return(stem(3,"have","ed")); }         /* en */
"has"  { return(stem(3,"have","s")); }          
"hath"  { return(stem(4,"have","s")); }         /* disprefer */
"does"  { return(stem(4,"do","s")); }            
"did"  { return(stem(3,"do","ed")); }          
"done"  { return(stem(4,"do","en")); }          
"didst"  { return(stem(5,"do","ed")); }         /* disprefer */
"'ll"  { return(stem(3,"will","")); }
"'m"  { return(stem(2,"be","")); }              /* disprefer */
"'re"  { return(stem(3,"be","")); }             /* disprefer */
"'ve"  { return(stem(3,"have","")); }

("beat"|"browbeat")"en"  { return(stem(2,"","en")); }
("beat"|"beset"|"bet"|"broadcast"|"browbeat"|"burst"|"cost"|"cut"|"hit"|"let"|"set"|"shed"|"shut"|"slit"|"split"|"put"|"quit"|"spread"|"sublet"|"spred"|"thrust"|"upset"|"hurt"|"bust"|"cast"|"forecast"|"inset"|"miscast"|"mishit"|"misread"|"offset"|"outbid"|"overbid"|"preset"|"read"|"recast"|"reset"|"telecast"|"typecast"|"typeset"|"underbid"|"undercut"|"wed"|"wet") { return(null_stem()); }
"aches"  { return(stem(2,"e","s")); }     
"aped"    { return(stem(2,"e","ed")); }                  /* en */
"axed" { return(stem(2,"","ed")); }                      /* en */
("bias"|"canvas")"es"  { return(stem(2,"","s")); }
("cadd"|"v")"ied"  { return(stem(2,"e","ed")); }         /* en */
("cadd"|"v")"ying"  { return(stem(4,"ie","ing")); }     
"cooees"  { return(stem(2,"e","s")); }
"cooeed"  { return(stem(3,"ee","ed")); }        /* en */
("ey"|"dy")"ed"  { return(stem(2,"e","ed")); }  /* en */
"eyeing"  { return(stem(3,"","ing")); }                 
"eying"  { return(stem(3,"e","ing")); }         /* disprefer */
"dying"  { return(stem(4,"ie","ing")); }       
("geld"|"gild")"ed"  { return(stem(2,"","ed")); }       
("outvi"|"hi")"ed"  { return(stem(2,"e","ed")); }  
"outlay"  { return(stem(2,"ie","ed")); }        /* en */
"rebound"  { return(stem(4,"ind","ed")); }      /* en */
"plummets"  { return(stem(1,"","s")); }                 
"queueing"  { return(stem(3,"","ing")); }               
"stomachs"  { return(stem(1,"","s")); }                 
"trammels"  { return(stem(1,"","s")); }                 
"tarmacked"  { return(stem(3,"","ed")); }       /* en */
"transfixed"  { return(stem(2,"","ed")); }      /* en */
"underlay"  { return(stem(2,"ie","ed")); }     
"overlay"  { return(stem(2,"ie","ed")); }      
"overflown"  { return(stem(3,"y","en")); }     
"relaid"  { return(stem(3,"ay","ed")); }        /* en */
"shat"  { return(stem(3,"hit","ed")); }         /* en */
"bereft"  { return(stem(3,"eave","ed")); }      /* en */
"clave"  { return(stem(3,"eave","ed")); }       /* en */ /* disprefer */
"wrought"  { return(stem(6,"ork","ed")); }      /* en */ /* disprefer */
"durst"  { return(stem(4,"are","ed")); }        /* en */ /* disprefer */
"foreswore"  { return(stem(3,"ear","ed")); }    /* en */
"outfought"  { return(stem(5,"ight","ed")); }   /* en */
"garotting"  { return(stem(3,"e","ing")); }     /* en */
"shorn"  { return(stem(3,"ear","en")); }
"spake"  { return(stem(3,"eak","ed")); }        /* en */ /* disprefer */
("analys"|"paralys"|"cach"|"brows"|"glimps"|"collaps"|"eclips"|"elaps"|"laps"|"traips"|"relaps"|"puls"|"repuls"|"cleans"|"rins"|"recompens"|"condens"|"dispens"|"incens"|"licens"|"sens"|"tens")"es" { return(stem(1,"","s")); }
"cached" { return(stem(2,"e","ed")); }         
"caching" { return(stem(3,"e","ing")); }       
("tun"|"gangren"|"wan"|"grip"|"unit"|"coher"|"comper"|"rever"|"semaphor"|"commun"|"reunit"|"dynamit"|"superven"|"telephon"|"ton"|"aton"|"bon"|"phon"|"plan"|"profan"|"importun"|"enthron"|"elop"|"interlop"|"sellotap"|"sideswip"|"slop"|"scrap"|"mop"|"lop"|"expung"|"lung"|"past"|"premier"|"rang"|"secret"){EDING} { return(semi_reg_stem(0,"e")); }
("unroll"|"unscroll"){EDING} { return(semi_reg_stem(0,"")); }
"unseat"{EDING} { return(semi_reg_stem(0,"")); }        
"whang"{EDING} { return(semi_reg_stem(0,"")); }         
("bath"|"billet"|"collar"|"ballot"|"earth"|"fathom"|"fillet"|"mortar"|"parrot"|"profit"|"ransom"|"slang"){EDING} { return(semi_reg_stem(0,"")); }
("disunit"|"aquaplan"|"enplan"|"reveng"|"ripost"|"sein")"ed" { return(stem(2,"e","ed")); } /* en */
"toping" { return(stem(3,"e","ing")); }                  /* disprefer */
("disti"|"fulfi"|"appa")"lls" { return(stem(2,"","s")); }
("overca"|"misca")"lled" { return(stem(2,"","ed")); }   
"catcalling" { return(stem(3,"","ing")); }              
("catcall"|"squall")"ing" { return(stem(3,"","ing")); } 
("browbeat"|"ax"|"dubbin")"ing" { return(stem(3,"","ing")); }
"summonses" { return(stem(2,"","s")); }        
"putted" { return(stem(2,"","ed")); }          
"summonsed" { return(stem(2,"","ed")); }       
("sugar"|"tarmacadam"|"beggar"|"betroth"|"boomerang"|"chagrin"|"envenom"|"miaou"|"pressgang")"ed" { return(stem(2,"","ed")); }
"abode"  { return(stem(3,"ide","ed")); }        /* en */
"abought"  { return(stem(5,"y","ed")); }        /* en */
"abyes"  { return(stem(2,"","s")); }           
"addrest"  { return(stem(3,"ess","ed")); }      /* en */ /* disprefer */
"ageing"  { return(stem(4,"e","ing")); }       
"agreed"  { return(stem(3,"ee","ed")); }        /* en */
"anted"  { return(stem(3,"te","ed")); }         /* en */
"antes"  { return(stem(2,"e","s")); }          
"arisen"  { return(stem(3,"se","en")); }       
"arose"  { return(stem(3,"ise","ed")); }       
"ate"  { return(stem(3,"eat","ed")); }         
"awoke"  { return(stem(3,"ake","ed")); }       
"awoken"  { return(stem(4,"ake","en")); }      
"backbit"  { return(stem(3,"bite","ed")); }    
"backbiting"  { return(stem(4,"te","ing")); }  
"backbitten"  { return(stem(3,"e","en")); }    
"backslid"  { return(stem(3,"lide","ed")); }   
"backslidden"  { return(stem(3,"e","en")); }   
"bad"  { return(stem(3,"bid","ed")); }          /* disprefer */
"bade"  { return(stem(3,"id","ed")); }         
"bandieds"  { return(stem(4,"y","s")); }       
"became"  { return(stem(3,"ome","ed")); }       /* en */
"befallen"  { return(stem(3,"l","en")); }      
"befalling"  { return(stem(4,"l","ing")); }    
"befell"  { return(stem(3,"all","ed")); }      
"began"  { return(stem(3,"gin","ed")); }       
"begat"  { return(stem(3,"get","ed")); }        /* disprefer */       
"begirt"  { return(stem(3,"ird","ed")); }       /* en */
"begot"  { return(stem(3,"get","ed")); }
"begotten"  { return(stem(5,"et","en")); }     
"begun"  { return(stem(3,"gin","en")); }       
"beheld"  { return(stem(3,"old","ed")); }      
"beholden"  { return(stem(3,"d","en")); }      
"benempt"  { return(stem(4,"ame","ed")); }      /* en */
"bent"  { return(stem(3,"end","ed")); }         /* en */
"besought"  { return(stem(5,"eech","ed")); }    /* en */
"bespoke"  { return(stem(3,"eak","ed")); }     
"bespoken"  { return(stem(4,"eak","en")); }    
"bestrewn"  { return(stem(3,"ew","en")); }     
"bestrid"  { return(stem(3,"ride","ed")); }     /* disprefer */
"bestridden"  { return(stem(3,"e","en")); }    
"bestrode"  { return(stem(3,"ide","ed")); }    
"betaken"  { return(stem(3,"ke","en")); }      
"bethought"  { return(stem(5,"ink","ed")); }    /* en */
"betook"  { return(stem(3,"ake","ed")); }      
"bidden"  { return(stem(3,"","en")); }         
"bit"  { return(stem(3,"bite","ed")); }        
"biting"  { return(stem(4,"te","ing")); }      
"bitten"  { return(stem(3,"e","en")); }        
"bled"  { return(stem(3,"leed","ed")); }        /* en */
"blest"  { return(stem(3,"ess","ed")); }        /* en */ /* disprefer */
"blew"  { return(stem(3,"low","ed")); }        
"blown"  { return(stem(3,"ow","en")); }        
"bogged-down"  { return(stem(8,"-down","ed")); } /* en */
"bogging-down"  { return(stem(9,"-down","ing")); }
"bogs-down"  { return(stem(6,"-down","s")); }  
"boogied"  { return(stem(3,"ie","ed")); }       /* en */
"boogies"  { return(stem(2,"e","s")); }        
"bore"  { return(stem(3,"ear","ed")); }        
"borne"  { return(stem(4,"ear","en")); }        /* disprefer */
"born"  { return(stem(3,"ear","en")); }        
"bought"  { return(stem(5,"uy","ed")); }        /* en */
"bound"  { return(stem(4,"ind","ed")); }        /* en */
"breastfed"  { return(stem(3,"feed","ed")); }   /* en */
"bred"  { return(stem(3,"reed","ed")); }        /* en */
"breid"  { return(stem(3,"ei","ed")); }         /* en */
"bringing"  { return(stem(4,"g","ing")); }     
"broke"  { return(stem(3,"eak","ed")); }       
"broken"  { return(stem(4,"eak","en")); }      
"brought"  { return(stem(5,"ing","ed")); }      /* en */
"built"  { return(stem(3,"ild","ed")); }        /* en */
"burnt"  { return(stem(3,"rn","ed")); }         /* en */ /* disprefer */
"bypast"  { return(stem(3,"ass","ed")); }       /* en */ /* disprefer */
"came"  { return(stem(3,"ome","ed")); }         /* en */
"caught"  { return(stem(4,"tch","ed")); }       /* en */
"chassed"  { return(stem(3,"se","ed")); }       /* en */
"chasseing"  { return(stem(4,"e","ing")); }    
"chasses"  { return(stem(2,"e","s")); }        
"chevied"  { return(stem(5,"ivy","ed")); }      /* en */ /* disprefer */
"chevies"  { return(stem(5,"ivy","s")); }       /* disprefer */
"chevying"  { return(stem(6,"ivy","ing")); }    /* disprefer */
"chid"  { return(stem(3,"hide","ed")); }        /* disprefer */
"chidden"  { return(stem(3,"e","en")); }        /* disprefer */
"chivvied"  { return(stem(4,"y","ed")); }       /* en */
"chivvies"  { return(stem(4,"y","s")); }       
"chivvying"  { return(stem(5,"y","ing")); }    
"chose"  { return(stem(3,"oose","ed")); }      
"chosen"  { return(stem(3,"ose","en")); }      
"clad"  { return(stem(3,"lothe","ed")); }       /* en */
"cleft"  { return(stem(3,"eave","ed")); }       /* en */ /* disprefer */
"clept"  { return(stem(3,"epe","ed")); }        /* en */ /* disprefer */
"clinging"  { return(stem(4,"g","ing")); }     
"clove"  { return(stem(3,"eave","ed")); }      
"cloven"  { return(stem(4,"eave","en")); }     
"clung"  { return(stem(3,"ing","ed")); }        /* en */
"countersank"  { return(stem(3,"ink","ed")); } 
"countersunk"  { return(stem(3,"ink","en")); } 
"crept"  { return(stem(3,"eep","ed")); }        /* en */
"crossbred"  { return(stem(3,"reed","ed")); }   /* en */
"curettes"  { return(stem(3,"","s")); }        
"curst"  { return(stem(3,"rse","ed")); }        /* en */ /* disprefer */
"dealt"  { return(stem(3,"al","ed")); }         /* en */
"decreed"  { return(stem(3,"ee","ed")); }       /* en */
"degases"  { return(stem(2,"","s")); }         
"deleing"  { return(stem(4,"e","ing")); }      
"disagreed"  { return(stem(3,"ee","ed")); }     /* en */
"disenthralls"  { return(stem(2,"","s")); }     /* disprefer */
"disenthrals"  { return(stem(2,"l","s")); }    
"dought"  { return(stem(4,"w","ed")); }         /* en */
"dove"  { return(stem(3,"ive","ed")); }         /* en */ /* disprefer */
"drank"  { return(stem(3,"ink","ed")); }       
"drawn"  { return(stem(3,"aw","en")); }        
"dreamt"  { return(stem(3,"am","ed")); }        /* en */
"dreed"  { return(stem(3,"ee","ed")); }         /* en */
"drew"  { return(stem(3,"raw","ed")); }        
"driven"  { return(stem(3,"ve","en")); }       
"drove"  { return(stem(3,"ive","ed")); }       
"drunk"  { return(stem(3,"ink","en")); }       
"dug"  { return(stem(3,"dig","ed")); }          /* en */
"dwelt"  { return(stem(3,"ell","ed")); }        /* en */
"eaten"  { return(stem(3,"t","en")); }         
"emceed"  { return(stem(3,"ee","ed")); }        /* en */
"enwound"  { return(stem(4,"ind","ed")); }      /* en */
"facsimileing"  { return(stem(4,"e","ing")); } 
"fallen"  { return(stem(3,"l","en")); }        
"fed"  { return(stem(3,"feed","ed")); }         /* en */
"fell"  { return(stem(3,"all","ed")); }        
"felt"  { return(stem(3,"eel","ed")); }         /* en */
"filagreed"  { return(stem(3,"ee","ed")); }     /* en */
"filigreed"  { return(stem(3,"ee","ed")); }     /* en */
"fillagreed"  { return(stem(3,"ee","ed")); }    /* en */
"fled"  { return(stem(3,"lee","ed")); }         /* en */
"flew"  { return(stem(3,"ly","ed")); }         
"flinging"  { return(stem(4,"g","ing")); }     
"floodlit"  { return(stem(3,"light","ed")); }   /* en */
"flown"  { return(stem(3,"y","en")); }         
"flung"  { return(stem(3,"ing","ed")); }        /* en */
"flyblew"  { return(stem(3,"low","ed")); }     
"flyblown"  { return(stem(3,"ow","en")); }     
"forbade"  { return(stem(3,"id","ed")); }
"forbad"  { return(stem(3,"bid","ed")); }       /* disprefer */
"forbidden"  { return(stem(3,"","en")); }      
"forbore"  { return(stem(3,"ear","ed")); }     
"forborne"  { return(stem(4,"ear","en")); }    
"fordid"  { return(stem(3,"do","ed")); }       
"fordone"  { return(stem(3,"o","en")); }       
"foredid"  { return(stem(3,"do","ed")); }      
"foredone"  { return(stem(3,"o","en")); }      
"foregone"  { return(stem(3,"o","en")); }      
"foreknew"  { return(stem(3,"now","ed")); }    
"foreknown"  { return(stem(3,"ow","en")); }    
"foreran"  { return(stem(3,"run","ed")); }      /* en */
"foresaw"  { return(stem(2,"ee","ed")); }     
"foreseen"  { return(stem(3,"ee","en")); }     
"foreshown"  { return(stem(3,"ow","en")); }    
"forespoke"  { return(stem(3,"eak","ed")); }   
"forespoken"  { return(stem(4,"eak","en")); }  
"foretelling"  { return(stem(4,"l","ing")); }  
"foretold"  { return(stem(3,"ell","ed")); }     /* en */
"forewent"  { return(stem(4,"go","ed")); }     
"forgave"  { return(stem(3,"ive","ed")); }     
"forgiven"  { return(stem(3,"ve","en")); }     
"forgone"  { return(stem(3,"o","en")); }       
"forgot"  { return(stem(3,"get","ed")); }      
"forgotten"  { return(stem(5,"et","en")); }    
"forsaken"  { return(stem(3,"ke","en")); }     
"forsook"  { return(stem(3,"ake","ed")); }     
"forspoke"  { return(stem(3,"eak","ed")); }    
"forspoken"  { return(stem(4,"eak","en")); }   
"forswore"  { return(stem(3,"ear","ed")); }    
"forsworn"  { return(stem(3,"ear","en")); }    
"forwent"  { return(stem(4,"go","ed")); }      
"fought"  { return(stem(5,"ight","ed")); }      /* en */
"found"  { return(stem(4,"ind","ed")); }        /* en */
"freed"  { return(stem(3,"ee","ed")); }         /* en */
"fricasseed"  { return(stem(3,"ee","ed")); }    /* en */
"froze"  { return(stem(3,"eeze","ed")); }      
"frozen"  { return(stem(4,"eeze","en")); }     
"gainsaid"  { return(stem(3,"ay","ed")); }      /* en */
"gan"  { return(stem(3,"gin","en")); }         
"garnisheed"  { return(stem(3,"ee","ed")); }    /* en */
"gases"  { return(stem(2,"","s")); }           
"gave"  { return(stem(3,"ive","ed")); }        
"geed"  { return(stem(3,"ee","ed")); }          /* en */
"gelt"  { return(stem(3,"eld","ed")); }         /* en */
"genned-up"  { return(stem(6,"-up","ed")); }    /* en */
"genning-up"  { return(stem(7,"-up","ing")); } 
"gens-up"  { return(stem(4,"-up","s")); }      
"ghostwriting"  { return(stem(4,"te","ing")); }
"ghostwritten"  { return(stem(3,"e","en")); }  
"ghostwrote"  { return(stem(3,"ite","ed")); }  
"gilt"  { return(stem(3,"ild","ed")); }         /* en */ /* disprefer */
"girt"  { return(stem(3,"ird","ed")); }         /* en */ /* disprefer */
"given"  { return(stem(3,"ve","en")); }        
"gnawn"  { return(stem(3,"aw","en")); }        
"gone"  { return(stem(3,"o","en")); }          
"got"  { return(stem(3,"get","ed")); }         
"gotten"  { return(stem(5,"et","en")); }       
"graven"  { return(stem(3,"ve","en")); }       
"greed"  { return(stem(3,"ee","ed")); }         /* en */
"grew"  { return(stem(3,"row","ed")); }        
"gript"  { return(stem(3,"ip","ed")); }         /* en */ /* disprefer */
"ground"  { return(stem(4,"ind","ed")); }       /* en */
"grown"  { return(stem(3,"ow","en")); }        
"guaranteed"  { return(stem(3,"ee","ed")); }    /* en */
"hacksawn"  { return(stem(3,"aw","en")); }     
"hamstringing"  { return(stem(4,"g","ing")); } 
"hamstrung"  { return(stem(3,"ing","ed")); }    /* en */
"handfed"  { return(stem(3,"feed","ed")); }     /* en */
"heard"  { return(stem(3,"ar","ed")); }         /* en */
"held"  { return(stem(3,"old","ed")); }         /* en */
"hewn"  { return(stem(3,"ew","en")); }         
"hid"  { return(stem(3,"hide","ed")); }        
"hidden"  { return(stem(3,"e","en")); }        
"honied"  { return(stem(3,"ey","ed")); }        /* en */
"hove"  { return(stem(3,"eave","ed")); }        /* en */ /* disprefer */
"hung"  { return(stem(3,"ang","ed")); }         /* en */
"impanells"  { return(stem(2,"","s")); }       
"inbred"  { return(stem(3,"reed","ed")); }      /* en */
"indwelling"  { return(stem(4,"l","ing")); }   
"indwelt"  { return(stem(3,"ell","ed")); }      /* en */
"inlaid"  { return(stem(3,"ay","ed")); }        /* en */
"interbred"  { return(stem(3,"reed","ed")); }   /* en */
"interlaid"  { return(stem(3,"ay","ed")); }     /* en */
"interpled"  { return(stem(3,"lead","ed")); }   /* en */ /* disprefer */
"interwove"  { return(stem(3,"eave","ed")); }  
"interwoven"  { return(stem(4,"eave","en")); } 
"inwove"  { return(stem(3,"eave","ed")); }     
"inwoven"  { return(stem(4,"eave","en")); }    
"joint"  { return(stem(3,"in","ed")); }         /* en */ /* disprefer */
"kent"  { return(stem(3,"en","ed")); }          /* en */
"kept"  { return(stem(3,"eep","ed")); }         /* en */
"kneed"  { return(stem(3,"ee","ed")); }         /* en */
"knelt"  { return(stem(3,"eel","ed")); }        /* en */
"knew"  { return(stem(3,"now","ed")); }        
"known"  { return(stem(3,"ow","en")); }        
"laden"  { return(stem(3,"de","en")); }        
"ladyfied"  { return(stem(5,"ify","ed")); }     /* en */
"ladyfies"  { return(stem(5,"ify","s")); }     
"ladyfying"  { return(stem(6,"ify","ing")); }  
"laid"  { return(stem(3,"ay","ed")); }          /* en */
"lain"  { return(stem(3,"ie","en")); }         
"leant"  { return(stem(3,"an","ed")); }         /* en */ /* disprefer */
"leapt"  { return(stem(3,"ap","ed")); }         /* en */
"learnt"  { return(stem(3,"rn","ed")); }        /* en */
"led"  { return(stem(3,"lead","ed")); }         /* en */
"left"  { return(stem(3,"eave","ed")); }        /* en */
"lent"  { return(stem(3,"end","ed")); }         /* en */
"lit"  { return(stem(3,"light","ed")); }        /* en */
"lost"  { return(stem(3,"ose","ed")); }         /* en */
"made"  { return(stem(3,"ake","ed")); }         /* en */
"meant"  { return(stem(3,"an","ed")); }         /* en */
"met"  { return(stem(3,"meet","ed")); }         /* en */
"misbecame"  { return(stem(3,"ome","ed")); }    /* en */
"misdealt"  { return(stem(3,"al","ed")); }      /* en */
"misgave"  { return(stem(3,"ive","ed")); }     
"misgiven"  { return(stem(3,"ve","en")); }     
"misheard"  { return(stem(3,"ar","ed")); }      /* en */
"mislaid"  { return(stem(3,"ay","ed")); }       /* en */
"misled"  { return(stem(3,"lead","ed")); }      /* en */
"mispled"  { return(stem(3,"lead","ed")); }     /* en */ /* disprefer */
"misspelt"  { return(stem(3,"ell","ed")); }     /* en */ /* disprefer */
"misspent"  { return(stem(3,"end","ed")); }     /* en */
"mistaken"  { return(stem(3,"ke","en")); }     
"mistook"  { return(stem(3,"ake","ed")); }      /* en */
"misunderstood"  { return(stem(3,"and","ed")); } /* en */
"molten"  { return(stem(5,"elt","en")); }      
"mown"  { return(stem(3,"ow","en")); }         
"outbidden"  { return(stem(3,"","en")); }       /* disprefer */
"outbred"  { return(stem(3,"reed","ed")); }     /* en */
"outdid"  { return(stem(3,"do","ed")); }       
"outdone"  { return(stem(3,"o","en")); }       
"outgone"  { return(stem(3,"o","en")); }       
"outgrew"  { return(stem(3,"row","ed")); }     
"outgrown"  { return(stem(3,"ow","en")); }     
"outlaid"  { return(stem(3,"ay","ed")); }       /* en */
"outran"  { return(stem(3,"run","ed")); }       /* en */
"outridden"  { return(stem(3,"e","en")); }     
"outrode"  { return(stem(3,"ide","ed")); }     
"outselling"  { return(stem(4,"l","ing")); }   
"outshone"  { return(stem(3,"ine","ed")); }     /* en */
"outshot"  { return(stem(3,"hoot","ed")); }     /* en */
"outsold"  { return(stem(3,"ell","ed")); }      /* en */
"outstood"  { return(stem(3,"and","ed")); }     /* en */
"outthought"  { return(stem(5,"ink","ed")); }   /* en */
"outwent"  { return(stem(4,"go","ed")); }       /* en */
"outwore"  { return(stem(3,"ear","ed")); }     
"outworn"  { return(stem(3,"ear","en")); }     
"overbidden"  { return(stem(3,"","en")); }      /* disprefer */
"overblew"  { return(stem(3,"low","ed")); }    
"overblown"  { return(stem(3,"ow","en")); }    
"overbore"  { return(stem(3,"ear","ed")); }    
"overborne"  { return(stem(4,"ear","en")); }   
"overbuilt"  { return(stem(3,"ild","ed")); }    /* en */
"overcame"  { return(stem(3,"ome","ed")); }     /* en */
"overdid"  { return(stem(3,"do","ed")); }      
"overdone"  { return(stem(3,"o","en")); }      
"overdrawn"  { return(stem(3,"aw","en")); }    
"overdrew"  { return(stem(3,"raw","ed")); }    
"overdriven"  { return(stem(3,"ve","en")); }   
"overdrove"  { return(stem(3,"ive","ed")); }   
"overflew"  { return(stem(3,"ly","ed")); }      /* en */
"overgrew"  { return(stem(3,"row","ed")); }    
"overgrown"  { return(stem(3,"ow","en")); }    
"overhanging"  { return(stem(4,"g","ing")); }  
"overheard"  { return(stem(3,"ar","ed")); }     /* en */
"overhung"  { return(stem(3,"ang","ed")); }     /* en */
"overlaid"  { return(stem(3,"ay","ed")); }      /* en */
"overlain"  { return(stem(3,"ie","en")); }     
"overlies"  { return(stem(2,"e","s")); }       
"overlying"  { return(stem(4,"ie","ing")); }   
"overpaid"  { return(stem(3,"ay","ed")); }      /* en */
"overpast"  { return(stem(3,"ass","ed")); }     /* en */
"overran"  { return(stem(3,"run","ed")); }      /* en */
"overridden"  { return(stem(3,"e","en")); }    
"overrode"  { return(stem(3,"ide","ed")); }    
"oversaw"  { return(stem(3,"see","ed")); }     
"overseen"  { return(stem(3,"ee","en")); }     
"overselling"  { return(stem(4,"l","ing")); }  
"oversewn"  { return(stem(3,"ew","en")); }     
"overshot"  { return(stem(3,"hoot","ed")); }    /* en */
"overslept"  { return(stem(3,"eep","ed")); }    /* en */
"oversold"  { return(stem(3,"ell","ed")); }     /* en */
"overspent"  { return(stem(3,"end","ed")); }    /* en */
"overspilt"  { return(stem(3,"ill","ed")); }    /* en */ /* disprefer */
"overtaken"  { return(stem(3,"ke","en")); }    
"overthrew"  { return(stem(3,"row","ed")); }   
"overthrown"  { return(stem(3,"ow","en")); }   
"overtook"  { return(stem(3,"ake","ed")); }    
"overwound"  { return(stem(4,"ind","ed")); }    /* en */
"overwriting"  { return(stem(4,"te","ing")); } 
"overwritten"  { return(stem(3,"e","en")); }   
"overwrote"  { return(stem(3,"ite","ed")); }   
"paid"  { return(stem(3,"ay","ed")); }          /* en */
"partaken"  { return(stem(3,"ke","en")); }     
"partook"  { return(stem(3,"ake","ed")); }     
"peed"  { return(stem(3,"ee","ed")); }          /* en */
"pent"  { return(stem(3,"en","ed")); }          /* en */ /* disprefer */
"pled"  { return(stem(3,"lead","ed")); }        /* en */ /* disprefer */
"prepaid"  { return(stem(3,"ay","ed")); }       /* en */
"prologs"  { return(stem(2,"gue","s")); }      
"proven"  { return(stem(3,"ve","en")); }       
"pureed"  { return(stem(3,"ee","ed")); }        /* en */
"quartersawn"  { return(stem(3,"aw","en")); }  
"queued"  { return(stem(3,"ue","ed")); }        /* en */
"queues"  { return(stem(2,"e","s")); }         
"queuing"  { return(stem(4,"ue","ing")); }      /* disprefer */
"ran"  { return(stem(3,"run","ed")); }          /* en */
"rang"  { return(stem(3,"ing","ed")); }        
"rarefied"  { return(stem(3,"y","ed")); }       /* en */
"rarefies"  { return(stem(3,"y","s")); }       
"rarefying"  { return(stem(4,"y","ing")); }    
"razeed"  { return(stem(3,"ee","ed")); }       
"rebuilt"  { return(stem(3,"ild","ed")); }      /* en */
"recced"  { return(stem(3,"ce","ed")); }        /* en */
"red"  { return(stem(3,"red","ed")); }          /* en */
"redid"  { return(stem(3,"do","ed")); }        
"redone"  { return(stem(3,"o","en")); }        
"refereed"  { return(stem(3,"ee","ed")); }      /* en */
"reft"  { return(stem(3,"eave","ed")); }        /* en */
"remade"  { return(stem(3,"ake","ed")); }       /* en */
"repaid"  { return(stem(3,"ay","ed")); }        /* en */
"reran"  { return(stem(3,"run","ed")); }        /* en */
"resat"  { return(stem(3,"sit","ed")); }        /* en */
"retaken"  { return(stem(3,"ke","en")); }      
"rethought"  { return(stem(5,"ink","ed")); }    /* en */
"retook"  { return(stem(3,"ake","ed")); }      
"rewound"  { return(stem(4,"ind","ed")); }      /* en */
"rewriting"  { return(stem(4,"te","ing")); }   
"rewritten"  { return(stem(3,"e","en")); }     
"rewrote"  { return(stem(3,"ite","ed")); }     
"ridden"  { return(stem(3,"e","en")); }        
"risen"  { return(stem(3,"se","en")); }        
"riven"  { return(stem(3,"ve","en")); }        
"rode"  { return(stem(3,"ide","ed")); }        
"rose"  { return(stem(3,"ise","ed")); }        
"rove"  { return(stem(3,"eeve","ed")); }        /* en */
"rung"  { return(stem(3,"ing","en")); }        
"said"  { return(stem(3,"ay","ed")); }          /* en */
"sang"  { return(stem(3,"ing","ed")); }        
"sank"  { return(stem(3,"ink","ed")); }        
"sat"  { return(stem(3,"sit","ed")); }          /* en */
"saw"  { return(stem(3,"see","ed")); }         
"sawn"  { return(stem(3,"aw","en")); }         
"seen"  { return(stem(3,"ee","en")); }         
"sent"  { return(stem(3,"end","ed")); }         /* en */
"sewn"  { return(stem(3,"ew","en")); }         
"shaken"  { return(stem(3,"ke","en")); }       
"shaven"  { return(stem(3,"ve","en")); }       
"shent"  { return(stem(3,"end","ed")); }        /* en */
"shewn"  { return(stem(3,"ew","en")); }        
"shod"  { return(stem(3,"hoe","ed")); }         /* en */
"shone"  { return(stem(3,"ine","ed")); }        /* en */
"shook"  { return(stem(3,"ake","ed")); }       
"shot"  { return(stem(3,"hoot","ed")); }        /* en */
"shown"  { return(stem(3,"ow","en")); }        
"shrank"  { return(stem(3,"ink","ed")); }      
"shriven"  { return(stem(3,"ve","en")); }      
"shrove"  { return(stem(3,"ive","ed")); }      
"shrunk"  { return(stem(3,"ink","en")); }      
"shrunken"  { return(stem(5,"ink","en")); }     /* disprefer */
"sightsaw"  { return(stem(3,"see","ed")); }    
"sightseen"  { return(stem(3,"ee","en")); }    
"ski'd"  { return(stem(3,"i","ed")); }          /* en */
"skydove"  { return(stem(3,"ive","ed")); }      /* en */
"slain"  { return(stem(3,"ay","en")); }        
"slept"  { return(stem(3,"eep","ed")); }        /* en */
"slew"  { return(stem(3,"lay","ed")); }        
"slid"  { return(stem(3,"lide","ed")); }       
"slidden"  { return(stem(3,"e","en")); }       
"slinging"  { return(stem(4,"g","ing")); }     
"slung"  { return(stem(3,"ing","ed")); }        /* en */
"slunk"  { return(stem(3,"ink","ed")); }        /* en */
"smelt"  { return(stem(3,"ell","ed")); }        /* en */ /* disprefer */
"smit"  { return(stem(3,"mite","ed")); }       
"smiting"  { return(stem(4,"te","ing")); }     
"smitten"  { return(stem(3,"e","en")); }       
"smote"  { return(stem(3,"ite","ed")); }        /* en */ /* disprefer */
"sold"  { return(stem(3,"ell","ed")); }         /* en */
"soothsaid"  { return(stem(3,"ay","ed")); }     /* en */
"sortied"  { return(stem(3,"ie","ed")); }       /* en */
"sorties"  { return(stem(2,"e","s")); }        
"sought"  { return(stem(5,"eek","ed")); }       /* en */
"sown"  { return(stem(3,"ow","en")); }         
"spat"  { return(stem(3,"pit","ed")); }         /* en */
"sped"  { return(stem(3,"peed","ed")); }        /* en */
"spellbound"  { return(stem(4,"ind","ed")); }   /* en */
"spelt"  { return(stem(3,"ell","ed")); }        /* en */ /* disprefer */
"spent"  { return(stem(3,"end","ed")); }        /* en */
"spilt"  { return(stem(3,"ill","ed")); }        /* en */ /* disprefer */
"spoilt"  { return(stem(3,"il","ed")); }        /* en */
"spoke"  { return(stem(3,"eak","ed")); }       
"spoken"  { return(stem(4,"eak","en")); }      
"spotlit"  { return(stem(3,"light","ed")); }    /* en */
"sprang"  { return(stem(3,"ing","ed")); }      
"springing"  { return(stem(4,"g","ing")); }    
"sprung"  { return(stem(3,"ing","en")); }      
"spun"  { return(stem(3,"pin","ed")); }         /* en */
"squeegeed"  { return(stem(3,"ee","ed")); }     /* en */
"stank"  { return(stem(3,"ink","ed")); }       
"stinging"  { return(stem(4,"g","ing")); }     
"stole"  { return(stem(3,"eal","ed")); }       
"stolen"  { return(stem(4,"eal","en")); }      
"stood"  { return(stem(3,"and","ed")); }        /* en */
"stove"  { return(stem(3,"ave","ed")); }        /* en */
"strewn"  { return(stem(3,"ew","en")); }       
"stridden"  { return(stem(3,"e","en")); }      
"stringing"  { return(stem(4,"g","ing")); }    
"striven"  { return(stem(3,"ve","en")); }      
"strode"  { return(stem(3,"ide","ed")); }      
"strove"  { return(stem(3,"ive","ed")); }      
"strown"  { return(stem(3,"ow","en")); }       
"struck"  { return(stem(3,"ike","ed")); }       /* en */
"strung"  { return(stem(3,"ing","ed")); }       /* en */
"stuck"  { return(stem(3,"ick","ed")); }        /* en */
"stung"  { return(stem(3,"ing","ed")); }        /* en */
"stunk"  { return(stem(3,"ink","en")); }       
"sung"  { return(stem(3,"ing","en")); }        
"sunk"  { return(stem(3,"ink","en")); }        
"sunken"  { return(stem(5,"ink","en")); }       /* disprefer */
"swam"  { return(stem(3,"wim","ed")); }        
"swept"  { return(stem(3,"eep","ed")); }        /* en */
"swinging"  { return(stem(4,"g","ing")); }     
"swollen"  { return(stem(5,"ell","en")); }     
"swore"  { return(stem(3,"ear","ed")); }       
"sworn"  { return(stem(3,"ear","en")); }       
"swum"  { return(stem(3,"wim","en")); }        
"swung"  { return(stem(3,"ing","ed")); }        /* en */
"taken"  { return(stem(3,"ke","en")); }        
"taught"  { return(stem(5,"each","ed")); }      /* en */
"taxying"  { return(stem(4,"i","ing")); }       /* disprefer */
"teed"  { return(stem(3,"ee","ed")); }          /* en */
"thought"  { return(stem(5,"ink","ed")); }      /* en */
"threw"  { return(stem(3,"row","ed")); }       
"thriven"  { return(stem(3,"ve","en")); }       /* disprefer */      
"throve"  { return(stem(3,"ive","ed")); }       /* disprefer */      
"thrown"  { return(stem(3,"ow","en")); }       
"tinged"  { return(stem(3,"ge","ed")); }        /* en */
"tingeing"  { return(stem(4,"e","ing")); }     
"tinging"  { return(stem(4,"ge","ing")); }      /* disprefer */
"told"  { return(stem(3,"ell","ed")); }         /* en */
"took"  { return(stem(3,"ake","ed")); }        
"tore"  { return(stem(3,"ear","ed")); }        
"torn"  { return(stem(3,"ear","en")); }        
"tramels"  { return(stem(3,"mel","s")); }       /* disprefer */
"transfixt"  { return(stem(3,"ix","ed")); }     /* en */ /* disprefer */
"tranship"  { return(stem(3,"ship","ed")); }    /* en */
"trod"  { return(stem(3,"read","ed")); }       
"trodden"  { return(stem(5,"ead","en")); }     
"typewriting"  { return(stem(4,"te","ing")); } 
"typewritten"  { return(stem(3,"e","en")); }   
"typewrote"  { return(stem(3,"ite","ed")); }   
"unbent"  { return(stem(3,"end","ed")); }       /* en */
"unbound"  { return(stem(4,"ind","ed")); }      /* en */
"unclad"  { return(stem(3,"lothe","ed")); }     /* en */
"underbought"  { return(stem(5,"uy","ed")); }   /* en */
"underfed"  { return(stem(3,"feed","ed")); }    /* en */
"undergirt"  { return(stem(3,"ird","ed")); }    /* en */
"undergone"  { return(stem(3,"o","en")); }     
"underlaid"  { return(stem(3,"ay","ed")); }     /* en */
"underlain"  { return(stem(3,"ie","en")); }    
"underlies"  { return(stem(2,"e","s")); }      
"underlying"  { return(stem(4,"ie","ing")); }  
"underpaid"  { return(stem(3,"ay","ed")); }     /* en */
"underselling"  { return(stem(4,"l","ing")); } 
"undershot"  { return(stem(3,"hoot","ed")); }   /* en */
"undersold"  { return(stem(3,"ell","ed")); }    /* en */
"understood"  { return(stem(3,"and","ed")); }   /* en */
"undertaken"  { return(stem(3,"ke","en")); }   
"undertook"  { return(stem(3,"ake","ed")); }   
"underwent"  { return(stem(4,"go","ed")); }    
"underwriting"  { return(stem(4,"te","ing")); }
"underwritten"  { return(stem(3,"e","en")); }  
"underwrote"  { return(stem(3,"ite","ed")); }  
"undid"  { return(stem(3,"do","ed")); }        
"undone"  { return(stem(3,"o","en")); }        
"unfroze"  { return(stem(3,"eeze","ed")); }    
"unfrozen"  { return(stem(4,"eeze","en")); }   
"unlaid"  { return(stem(3,"ay","ed")); }        /* en */
"unlearnt"  { return(stem(3,"rn","ed")); }      /* en */
"unmade"  { return(stem(3,"ake","ed")); }       /* en */
"unrove"  { return(stem(3,"eeve","ed")); }      /* en */
"unsaid"  { return(stem(3,"ay","ed")); }        /* en */
"unslinging"  { return(stem(4,"g","ing")); }   
"unslung"  { return(stem(3,"ing","ed")); }      /* en */
"unspoke"  { return(stem(3,"eak","ed")); }     
"unspoken"  { return(stem(4,"eak","en")); }    
"unstringing"  { return(stem(4,"g","ing")); }  
"unstrung"  { return(stem(3,"ing","ed")); }     /* en */
"unstuck"  { return(stem(3,"ick","ed")); }      /* en */
"unswore"  { return(stem(3,"ear","ed")); }     
"unsworn"  { return(stem(3,"ear","en")); }     
"untaught"  { return(stem(5,"each","ed")); }    /* en */
"unthought"  { return(stem(5,"ink","ed")); }    /* en */
"untrod"  { return(stem(3,"read","ed")); }     
"untrodden"  { return(stem(5,"ead","en")); }   
"unwound"  { return(stem(4,"ind","ed")); }      /* en */
"upbuilt"  { return(stem(3,"ild","ed")); }      /* en */
"upheld"  { return(stem(3,"old","ed")); }       /* en */
"uphove"  { return(stem(3,"eave","ed")); }      /* en */
"upped"  { return(stem(3,"","ed")); }           /* en */
"upping"  { return(stem(4,"","ing")); }        
"uprisen"  { return(stem(3,"se","en")); }      
"uprose"  { return(stem(3,"ise","ed")); }      
"upsprang"  { return(stem(3,"ing","ed")); }    
"upspringing"  { return(stem(4,"g","ing")); }  
"upsprung"  { return(stem(3,"ing","en")); }    
"upswept"  { return(stem(3,"eep","ed")); }      /* en */
"upswinging"  { return(stem(4,"g","ing")); }   
"upswollen"  { return(stem(5,"ell","en")); }    /* disprefer */
"upswung"  { return(stem(3,"ing","ed")); }      /* en */
"visaed"  { return(stem(3,"a","ed")); }         /* en */
"visaing"  { return(stem(4,"a","ing")); }      
"waylaid"  { return(stem(3,"ay","ed")); }      
"waylain"  { return(stem(3,"ay","en")); }      
"went"  { return(stem(4,"go","ed")); }         
"wept"  { return(stem(3,"eep","ed")); }         /* en */
"whipsawn"  { return(stem(3,"aw","en")); }     
"winterfed"  { return(stem(3,"feed","ed")); }   /* en */
"wiredrawn"  { return(stem(3,"aw","en")); }    
"wiredrew"  { return(stem(3,"raw","ed")); }    
"withdrawn"  { return(stem(3,"aw","en")); }    
"withdrew"  { return(stem(3,"raw","ed")); }    
"withheld"  { return(stem(3,"old","ed")); }     /* en */
"withstood"  { return(stem(3,"and","ed")); }    /* en */
"woke"  { return(stem(3,"ake","ed")); }        
"woken"  { return(stem(4,"ake","en")); }       
"won"  { return(stem(3,"win","ed")); }          /* en */
"wore"  { return(stem(3,"ear","ed")); }        
"worn"  { return(stem(3,"ear","en")); }        
"wound"  { return(stem(4,"ind","ed")); }        /* en */
"wove"  { return(stem(3,"eave","ed")); }       
"woven"  { return(stem(4,"eave","en")); }      
"wringing"  { return(stem(4,"g","ing")); }     
"writing"  { return(stem(4,"te","ing")); }     
"written"  { return(stem(3,"e","en")); }       
"wrote"  { return(stem(3,"ite","ed")); }       
"wrung"  { return(stem(3,"ing","ed")); }        /* en */
"ycleped"  { return(stem(7,"clepe","ed")); }    /* en */ /* disprefer */
"yclept"  { return(stem(6,"clepe","ed")); }     /* en */ /* disprefer */
"ABCs"  { return(stem(4,"ABC","s")); }         
"bacteria"  { return(stem(1,"um","s")); }      
"loggias"  { return(stem(1,"","s")); }                  
"bases"    { return(stem(2,"is","s")); }       
"schemata"  { return(stem(2,"","s")); }        
("curi"|"formul"|"vertebr"|"larv"|"uln"|"alumn")"ae"  { return(stem(1,"","s")); }
("beldam"|"boss"|"crux"|"larynx"|"sphinx"|"trellis"|"yes"|"atlas")"es"  { return(stem(2,"","s")); }
("alumn"|"loc"|"thromb"|"tars"|"streptococc"|"stimul"|"solid"|"radi"|"mag"|"cumul"|"bronch"|"bacill")"i"  { return(stem(1,"us","s")); }
("Brahman"|"German"|"dragoman"|"ottoman"|"shaman"|"talisman"|"Norman"|"Pullman"|"Roman")"s"  { return(stem(1,"","s")); }
("Czech"|"diptych"|"Sassenach"|"abdomen"|"alibi"|"aria"|"bandit"|"begonia"|"bikini"|"caryatid"|"colon"|"cornucopia"|"cromlech"|"cupola"|"dryad"|"eisteddfod"|"encyclopaedia"|"epoch"|"eunuch"|"flotilla"|"gardenia"|"gestalt"|"gondola"|"hierarch"|"hose"|"impediment"|"koala"|"loch"|"mania"|"manservant"|"martini"|"matriarch"|"monarch"|"oligarch"|"omen"|"parabola"|"pastorale"|"patriarch"|"pea"|"peninsula"|"pfennig"|"phantasmagoria"|"pibroch"|"poly"|"real"|"safari"|"sari"|"specimen"|"standby"|"stomach"|"swami"|"taxi"|"tech"|"toccata"|"triptych"|"villa"|"yogi"|"zloty")"s" { return(stem(1,"","s")); }
("asyl"|"sanct"|"rect"|"pl"|"pendul"|"mausole"|"hoodl"|"for")"ums"  { return(stem(1,"","s")); }
("Bantu"|"Bengalese"|"Beninese"|"Boche"|"Burmese"|"Chinese"|"Congolese"|"Gabonese"|"Guyanese"|"Japanese"|"Javanese"|"Lebanese"|"Maltese"|"Olympics"|"Portuguese"|"Senegalese"|"Siamese"|"Singhalese"|"Sinhalese"|"Sioux"|"Sudanese"|"Swiss"|"Taiwanese"|"Togolese"|"Vietnamese"|"aircraft"|"anopheles"|"apparatus"|"asparagus"|"barracks"|"bellows"|"bison"|"bluefish"|"bob"|"bourgeois"|"bream"|"brill"|"butterfingers"|"carp"|"catfish"|"chassis"|"chub"|"cod"|"codfish"|"coley"|"contretemps"|"corps"|"crawfish"|"crayfish"|"crossroads"|"cuttlefish"|"dace"|"dice"|"dogfish"|"doings"|"dory"|"downstairs"|"eldest"|"finnan"|"firstborn"|"fish"|"flatfish"|"flounder"|"fowl"|"fry"|"fries"|{A}+"-works"|"gasworks"|"glassworks"|"globefish"|"goldfish"|"grand"|"gudgeon"|"gulden"|"haddock"|"hake"|"halibut"|"headquarters"|"herring"|"hertz"|"horsepower"|"hovercraft"|"hundredweight"|"ironworks"|"jackanapes"|"kilohertz"|"kurus"|"kwacha"|"ling"|"lungfish"|"mackerel"|"means"|"megahertz"|"moorfowl"|"moorgame"|"mullet"|"offspring"|"pampas"|"parr"|"patois"|"pekinese"|"penn'orth"|"perch"|"pickerel"|"pike"|"pince-nez"|"plaice"|"precis"|"quid"|"rand"|"rendezvous"|"revers"|"roach"|"roux"|"salmon"|"samurai"|"series"|"shad"|"sheep"|"shellfish"|"smelt"|"spacecraft"|"species"|"starfish"|"stockfish"|"sunfish"|"superficies"|"sweepstakes"|"swordfish"|"tench"|"tope"|"triceps"|"trout"|"tuna"|"tunafish"|"tunny"|"turbot"|"undersigned"|"veg"|"waterfowl"|"waterworks"|"waxworks"|"whiting"|"wildfowl"|"woodworm"|"yen")  { return(xnull_stem()); }
"Aries" { return(stem(1,"s","s")); }           
"Pisces" { return(stem(1,"s","s")); }          
"Bengali" { return(stem(1,"i","s")); }         
"Somali" { return(stem(1,"i","s")); }          
"cicatrices" { return(stem(3,"x","s")); }      
"cachous" { return(stem(1,"","s")); }          
"confidantes" { return(stem(1,"","s")); }
"weltanschauungen" { return(stem(2,"","s")); } 
"apologetics" { return(stem(1,"","s")); }      
"dues" { return(stem(1,"","s")); }             
"whirrs" { return(stem(2,"","s")); }                    
"emus" { return(stem(1,"","s")); }
"equities" { return(stem(3,"y","s")); }        
"ethics" { return(stem(1,"","s")); }           
"extortions" { return(stem(1,"","s")); }       
"folks" { return(stem(1,"","s")); }            
"fumes" { return(stem(1,"","s")); }            
"fungi" { return(stem(1,"us","s")); }            
"ganglia" { return(stem(1,"on","s")); }        
"gnus" { return(stem(1,"","s")); }
"goings" { return(stem(1,"","s")); }           
"groceries" { return(stem(3,"y","s")); }       
"gurus" { return(stem(1,"","s")); }            
"halfpence" { return(stem(2,"ny","s")); }      
"hostilities" { return(stem(3,"y","s")); }     
"hysterics" { return(stem(1,"","s")); }        
"impromptus" { return(stem(1,"","s")); }       
"incidentals" { return(stem(1,"","s")); }      
"jujus" { return(stem(1,"","s")); }            
"landaus" { return(stem(1,"","s")); }          
"loins" { return(stem(1,"","s")); }            
"mains" { return(stem(1,"","s")); }            
"menus" { return(stem(1,"","s")); }            
"milieus" { return(stem(1,"","s")); }           /* disprefer */
"mockers" { return(stem(1,"","s")); }          
"morals" { return(stem(1,"","s")); }           
"motions" { return(stem(1,"","s")); }          
"mus" { return(stem(1,"","s")); }              
"nibs" { return(stem(1,"","s")); }             
"ninepins" { return(stem(1,"","s")); }         
"nippers" { return(stem(1,"","s")); }          
"oilskins" { return(stem(1,"","s")); }         
"overtones" { return(stem(1,"","s")); }        
"parvenus" { return(stem(1,"","s")); }         
"plastics" { return(stem(1,"","s")); }         
"polemics" { return(stem(1,"","s")); }         
"races" { return(stem(1,"","s")); }            
"refreshments" { return(stem(1,"","s")); }     
"reinforcements" { return(stem(1,"","s")); }   
"reparations" { return(stem(1,"","s")); }      
"returns" { return(stem(1,"","s")); }          
"rheumatics" { return(stem(1,"","s")); }       
"rudiments" { return(stem(1,"","s")); }        
"sadhus" { return(stem(1,"","s")); }           
"shires" { return(stem(1,"","s")); }           
"shivers" { return(stem(1,"","s")); }          
"sis" { return(stem(1,"","s")); }              
"spoils" { return(stem(1,"","s")); }           
"stamens" { return(stem(1,"","s")); }          
"stays" { return(stem(1,"","s")); }            
"subtitles" { return(stem(1,"","s")); }        
"tares" { return(stem(1,"","s")); }            
"thankyous" { return(stem(1,"","s")); }        
"thews" { return(stem(1,"","s")); }            
"toils" { return(stem(1,"","s")); }            
"tongs" { return(stem(1,"","s")); }            
"Hindus" { return(stem(1,"","s")); }           
"ancients" { return(stem(1,"","s")); }         
"bagpipes" { return(stem(1,"","s")); }         
"bleachers" { return(stem(1,"","s")); }        
"buttocks" { return(stem(1,"","s")); }         
"commons" { return(stem(1,"","s")); }          
"Israelis" { return(stem(1,"","s")); }         
"Israeli" { return(stem(1,"i","s")); }          /* disprefer */
"dodgems" { return(stem(1,"","s")); }          
"causeries" { return(stem(1,"","s")); }        
"quiches" { return(stem(1,"","s")); }          
"rations" { return(stem(1,"","s")); }          
"recompenses" { return(stem(1,"","s")); }      
"rinses" { return(stem(1,"","s")); }           
"lieder" { return(stem(2,"","s")); }           
"passers-by" { return(stem(4,"-by","s")); }    
"prolegomena" { return(stem(1,"on","s")); }    
"signore" { return(stem(1,"a","s")); }         
"nepalese" { return(stem(1,"e","s")); }        
"algae" { return(stem(1,"","s")); }            
"clutches" { return(stem(2,"","s")); }         
"continua" { return(stem(1,"um","s")); }       
"diggings" { return(stem(1,"","s")); }         
"K's" { return(stem(2,"","s")); }              
"seychellois" { return(stem(1,"s","s")); }     
"afterlives" { return(stem(3,"fe","s")); }     
"avens" { return(stem(1,"s","s")); }           
"axes" { return(stem(2,"is","s")); }           
"bonsai" { return(stem(1,"i","s")); }          
"coypus" { return(stem(1,"","s")); }
"duodena" { return(stem(1,"um","s")); }        
"genii" { return(stem(1,"e","s")); }           
"leaves" { return(stem(3,"f","s")); }          
"mantelshelves" { return(stem(3,"f","s")); }   
"meninges" { return(stem(3,"x","s")); }        
"moneybags" { return(stem(1,"s","s")); }       
"obbligati" { return(stem(1,"o","s")); }       
"orchises" { return(stem(2,"","s")); }         
"palais" { return(stem(1,"s","s")); }          
"pancreases" { return(stem(2,"","s")); }       
"phalanges" { return(stem(3,"x","s")); }       
"portcullises" { return(stem(2,"","s")); }     
"pubes" { return(stem(1,"s","s")); }           
"pulses" { return(stem(1,"","s")); }           
"ratlines" { return(stem(2,"","s")); }         
"signori" { return(stem(1,"","s")); }          
"spindle-shanks" { return(stem(1,"s","s")); }  
"substrata" { return(stem(1,"um","s")); }      
"woolies" { return(stem(3,"ly","s")); }        
"moggies" { return(stem(3,"y","s")); }         
("ghill"|"group"|"honk"|"mean"|"road"|"short"|"smooth"|"book"|"cabb"|"hank"|"toots"|"tough"|"trann")"ies" { return(stem(2,"e","s")); }
("christmas"|"judas")"es" { return(stem(2,"","s")); }
("flamb"|"plat"|"portmant"|"tabl"|"b"|"bur"|"trouss")"eaus" { return(stem(2,"u","s")); } /* disprefer */
("maharaj"|"raj"|"myn"|"mull")"ahs"  { return(stem(2,"","s")); }
("Boch"|"apocalyps"|"aps"|"ars"|"avalanch"|"backach"|"tens"|"relaps"|"barouch"|"brioch"|"cloch"|"collaps"|"cops"|"crech"|"crevass"|"douch"|"eclips"|"expans"|"expens"|"finess"|"glimps"|"gouach"|"heartach"|"impass"|"impuls"|"laps"|"mans"|"microfich"|"mouss"|"nonsens"|"pastich"|"peliss"|"poss"|"prolaps"|"psych")"es" { return(stem(1,"","s")); }
"addenda"  { return(stem(2,"dum","s")); }      
"adieux"  { return(stem(2,"u","s")); }         
"aides-de-camp"  { return(stem(9,"-de-camp","s")); }
"aliases"  { return(stem(2,"","s")); }         
"alkalies"  { return(stem(2,"","s")); }        
"alti"  { return(stem(2,"to","s")); }     
"amanuenses"  { return(stem(2,"is","s")); }    
"analyses"  { return(stem(2,"is","s")); }      
"anthraces"  { return(stem(3,"x","s")); }      
"antitheses"  { return(stem(2,"is","s")); }    
"aphides"  { return(stem(3,"s","s")); }        
"apices"  { return(stem(4,"ex","s")); }        
"appendices"  { return(stem(3,"x","s")); }     
"arboreta"  { return(stem(2,"tum","s")); }     
"atlantes"  { return(stem(4,"s","s")); }        /* disprefer */
"aurar"  { return(stem(5,"eyrir","s")); }     
"automata"  { return(stem(2,"ton","s")); }     
"axises"  { return(stem(2,"","s")); }           /* disprefer */
"bambini"  { return(stem(2,"no","s")); }       
"bandeaux"  { return(stem(2,"u","s")); }       
"banditti"  { return(stem(2,"","s")); }         /* disprefer */
"bassi"  { return(stem(2,"so","s")); }         
"beaux"  { return(stem(2,"u","s")); }          
"beeves"  { return(stem(3,"f","s")); }         
"bicepses"  { return(stem(2,"","s")); }        
"bijoux"  { return(stem(2,"u","s")); }         
"billets-doux"  { return(stem(6,"-doux","s")); }
"boraces"  { return(stem(3,"x","s")); }        
"bossies"  { return(stem(3,"","s")); }          /* disprefer */
"brainchildren"  { return(stem(3,"","s")); }   
"brothers-in-law"  { return(stem(8,"-in-law","s")); }
"buckteeth"  { return(stem(4,"ooth","s")); }   
"bunde"  { return(stem(2,"d","s")); }          
"bureaux"  { return(stem(2,"u","s")); }        
"cacti"  { return(stem(1,"us","s")); }         
"calves"  { return(stem(3,"f","s")); }         
"calyces"  { return(stem(3,"x","s")); }        
"candelabra"  { return(stem(2,"rum","s")); }   
"capricci"  { return(stem(2,"cio","s")); }      /* disprefer */
"caribous"  { return(stem(2,"u","s")); }
"carides"  { return(stem(4,"yatid","s")); }     /* disprefer */
"catalyses"  { return(stem(2,"is","s")); }     
"cerebra"  { return(stem(2,"rum","s")); }      
"cervices"  { return(stem(3,"x","s")); }       
"chateaux"  { return(stem(2,"u","s")); }       
"children"  { return(stem(3,"","s")); }        
"chillies"  { return(stem(2,"","s")); }        
"chrysalides"  { return(stem(3,"s","s")); }    
"chrysalises"  { return(stem(2,"","s")); }      /* disprefer */
"ciceroni"  { return(stem(2,"ne","s")); }      
"cloverleaves"  { return(stem(3,"f","s")); }   
"coccyges"  { return(stem(3,"x","s")); }       
"codices"  { return(stem(4,"ex","s")); }       
"colloquies"  { return(stem(3,"y","s")); }     
"colones"  { return(stem(2,"","s")); }          /* disprefer */
"concertanti"  { return(stem(2,"te","s")); }   
"concerti"  { return(stem(2,"to","s")); }      
"concertini"  { return(stem(2,"no","s")); }    
"conquistadores"  { return(stem(2,"","s")); }  
"consortia"  { return(stem(1,"um","s")); }     
"contralti"  { return(stem(2,"to","s")); }     
"corpora"  { return(stem(3,"us","s")); }       
"corrigenda"  { return(stem(2,"dum","s")); }   
"cortices"  { return(stem(4,"ex","s")); }      
"crescendi"  { return(stem(2,"do","s")); }      /* disprefer */
"crises"  { return(stem(2,"is","s")); }        
"criteria"  { return(stem(2,"ion","s")); }     
"cruces"  { return(stem(3,"x","s")); }          /* disprefer */
"culs-de-sac"  { return(stem(8,"-de-sac","s")); }
"cyclopes"  { return(stem(2,"s","s")); }       
"cyclopses"  { return(stem(2,"","s")); }        /* disprefer */
"data"  { return(stem(2,"tum","s")); }         
"daughters-in-law"  { return(stem(8,"-in-law","s")); }
"desiderata"  { return(stem(2,"tum","s")); }   
"diaereses"  { return(stem(2,"is","s")); }     
"diaerses"  { return(stem(3,"esis","s")); }     /* disprefer */
"dialyses"  { return(stem(2,"is","s")); }      
"diathses"  { return(stem(3,"esis","s")); }    
"dicta"  { return(stem(2,"tum","s")); }        
"diereses"  { return(stem(2,"is","s")); }      
"dilettantes"  { return(stem(2,"e","s")); }    
"dilettanti"  { return(stem(2,"te","s")); }     /* disprefer */
"divertimenti"  { return(stem(2,"to","s")); }  
"dogteeth"  { return(stem(4,"ooth","s")); }    
"dormice"  { return(stem(3,"ouse","s")); }     
"dryades"  { return(stem(2,"","s")); }          /* disprefer */
"dui"  { return(stem(2,"uo","s")); }            /* disprefer */
"duona"  { return(stem(2,"denum","s")); }       /* disprefer */
"duonas"  { return(stem(3,"denum","s")); }      /* disprefer */
"tutus"  { return(stem(1,"","s")); }                    
"vicissitudes"  { return(stem(1,"","s")); }             
"virginals"  { return(stem(1,"","s")); }                
"volumes"  { return(stem(1,"","s")); }                  
"zebus"  { return(stem(1,"","s")); }                    
"dwarves"  { return(stem(3,"f","s")); }        
"eisteddfodau"  { return(stem(2,"","s")); }     /* disprefer */
"ellipses"  { return(stem(2,"is","s")); }      
"elves"  { return(stem(3,"f","s")); }          
"emphases"  { return(stem(2,"is","s")); }      
"epicentres"  { return(stem(2,"e","s")); }     
"epiglottides"  { return(stem(3,"s","s")); }   
"epiglottises"  { return(stem(2,"","s")); }     /* disprefer */
"errata"  { return(stem(2,"tum","s")); }       
"exegeses"  { return(stem(2,"is","s")); }      
"eyeteeth"  { return(stem(4,"ooth","s")); }    
"fathers-in-law"  { return(stem(8,"-in-law","s")); }
"feet"  { return(stem(3,"oot","s")); }         
"fellaheen"  { return(stem(3,"","s")); }       
"fellahin"  { return(stem(2,"","s")); }         /* disprefer */
"femora"  { return(stem(3,"ur","s")); }        
"flagstaves"  { return(stem(3,"ff","s")); }     /* disprefer */
"flambeaux"  { return(stem(2,"u","s")); }      
"flatfeet"  { return(stem(3,"oot","s")); }     
"fleurs-de-lis"  { return(stem(8,"-de-lis","s")); }
"fleurs-de-lys"  { return(stem(8,"-de-lys","s")); }
"flyleaves"  { return(stem(3,"f","s")); }      
"fora"  { return(stem(2,"rum","s")); }          /* disprefer */
"forcipes"  { return(stem(4,"eps","s")); }     
"forefeet"  { return(stem(3,"oot","s")); }     
"fulcra"  { return(stem(2,"rum","s")); }       
"gallowses"  { return(stem(2,"","s")); }       
"gases"  { return(stem(2,"","s")); }           
"gasses"  { return(stem(3,"","s")); }           /* disprefer */
"gateaux"  { return(stem(2,"u","s")); }        
"geese"  { return(stem(4,"oose","s")); }       
"gemboks"  { return(stem(4,"sbok","s")); }     
"genera"  { return(stem(3,"us","s")); }        
"geneses"  { return(stem(2,"is","s")); }       
"gentlemen-at-arms"  { return(stem(10,"an-at-arms","s")); }
"gestalten"  { return(stem(2,"","s")); }        /* disprefer */
"glissandi"  { return(stem(2,"do","s")); }     
"glottides"  { return(stem(3,"s","s")); }       /* disprefer */
"glottises"  { return(stem(2,"","s")); }       
"godchildren"  { return(stem(3,"","s")); }     
"goings-over"  { return(stem(6,"-over","s")); }
"grandchildren"  { return(stem(3,"","s")); }   
"halves"  { return(stem(3,"f","s")); }         
"hangers-on"  { return(stem(4,"-on","s")); }   
"helices"  { return(stem(3,"x","s")); }        
"hooves"  { return(stem(3,"f","s")); }         
"hosen"  { return(stem(2,"e","s")); }           /* disprefer */
"hypotheses"  { return(stem(2,"is","s")); }    
"iambi"  { return(stem(2,"b","s")); }          
"ibices"  { return(stem(4,"ex","s")); }         /* disprefer */
"ibises"  { return(stem(2,"","s")); }           /* disprefer */
"impedimenta"  { return(stem(2,"t","s")); }     /* disprefer */
"indices"  { return(stem(4,"ex","s")); }       
"intagli"  { return(stem(2,"lio","s")); }       /* disprefer */
"intermezzi"  { return(stem(2,"zo","s")); }    
"interregna"  { return(stem(2,"num","s")); }   
"irides"  { return(stem(3,"s","s")); }          /* disprefer */
"irises"  { return(stem(2,"","s")); }          
"is"  { return(stem(2,"is","s")); }            
"jacks-in-the-box"  { return(stem(12,"-in-the-box","s")); }
"kibbutzim"  { return(stem(2,"","s")); }       
"knives"  { return(stem(3,"fe","s")); }        
"kohlrabies"  { return(stem(2,"","s")); }      
"kronen"  { return(stem(2,"e","s")); }          /* disprefer */
"kroner"  { return(stem(2,"e","s")); }
"kronor"  { return(stem(2,"a","s")); }
"kronur"  { return(stem(2,"a","s")); }          /* disprefer */
"kylikes"  { return(stem(3,"x","s")); }        
"ladies-in-waiting"  { return(stem(14,"y-in-waiting","s")); }
"larynges"  { return(stem(3,"x","s")); }        /* disprefer */
"latices"  { return(stem(4,"ex","s")); }       
"leges"  { return(stem(3,"x","s")); }          
"libretti"  { return(stem(2,"to","s")); }      
"lice"  { return(stem(3,"ouse","s")); }        
"lire"  { return(stem(2,"ra","s")); }          
"lives"  { return(stem(3,"fe","s")); }         
"loaves"  { return(stem(3,"f","s")); }         
"loggie"  { return(stem(2,"ia","s")); }         /* disprefer */
"lustra"  { return(stem(2,"re","s")); }        
"lyings-in"  { return(stem(4,"-in","s")); }    
"macaronies"  { return(stem(2,"","s")); }      
"maestri"  { return(stem(2,"ro","s")); }       
"mantes"  { return(stem(2,"is","s")); }        
"mantises"  { return(stem(2,"","s")); }         /* disprefer */
"markkaa"  { return(stem(2,"a","s")); }        
"marquises"  { return(stem(2,"","s")); }       
"masters-at-arms"  { return(stem(9,"-at-arms","s")); }
"matrices"  { return(stem(3,"x","s")); }       
"matzoth"  { return(stem(2,"","s")); }         
"mausolea"  { return(stem(2,"eum","s")); }      /* disprefer */
"maxima"  { return(stem(2,"mum","s")); }       
"memoranda"  { return(stem(2,"dum","s")); }    
"men-at-arms"  { return(stem(10,"an-at-arms","s")); }
"men-o'-war"  { return(stem(9,"an-of-war","s")); } /* disprefer */
"men-of-war"  { return(stem(9,"an-of-war","s")); }
"menservants"  { return(stem(10,"anservant","s")); } /* disprefer */
"mesdemoiselles"  { return(stem(13,"ademoiselle","s")); }
"messieurs"  { return(stem(8,"onsieur","s")); }
"metadata"  { return(stem(2,"tum","s")); }         
"metatheses"  { return(stem(2,"is","s")); }    
"metropolises"  { return(stem(2,"","s")); }    
"mice"  { return(stem(3,"ouse","s")); }        
"milieux"  { return(stem(2,"u","s")); }        
"minima"  { return(stem(2,"mum","s")); }       
"momenta"  { return(stem(2,"tum","s")); }      
"monies"  { return(stem(3,"ey","s")); }        
"monsignori"  { return(stem(2,"r","s")); }     
"mooncalves"  { return(stem(3,"f","s")); }     
"mothers-in-law"  { return(stem(8,"-in-law","s")); }
"naiades"  { return(stem(2,"","s")); }         
"necropoleis"  { return(stem(3,"is","s")); }    /* disprefer */
"necropolises"  { return(stem(2,"","s")); }    
"nemeses"  { return(stem(2,"is","s")); }       
"novelle"  { return(stem(2,"la","s")); }       
"oases"  { return(stem(2,"is","s")); }         
"obloquies"  { return(stem(3,"y","s")); }      
"octopodes"  { return(stem(4,"us","s")); }
{A}+"hedra"  { return(stem(2,"ron","s")); }    
"optima"  { return(stem(2,"mum","s")); }       
"ora"  { return(stem(2,"s","s")); }            
"osar"  { return(stem(2,"","s")); }             /* disprefer */
"ossa"  { return(stem(2,"","s")); }             /* disprefer */
"ova"  { return(stem(2,"vum","s")); }          
"oxen"  { return(stem(2,"","s")); }            
"paralyses"  { return(stem(2,"is","s")); }     
"parentheses"  { return(stem(2,"is","s")); }   
"paris-mutuels"  { return(stem(9,"-mutuel","s")); }
"pastorali"  { return(stem(2,"le","s")); }      /* disprefer */
"patresfamilias"  { return(stem(11,"erfamilias","s")); }
"pease"  { return(stem(2,"","s")); }            /* disprefer */
"pekingese"  { return(stem(4,"ese","s")); }     /* disprefer */
"pelves"  { return(stem(2,"is","s")); }         /* disprefer */
"pelvises"  { return(stem(2,"","s")); }        
"pence"  { return(stem(2,"ny","s")); }         
"penes"  { return(stem(2,"is","s")); }          /* disprefer */
"penises"  { return(stem(2,"","s")); }         
"penknives"  { return(stem(3,"fe","s")); }     
"perihelia"  { return(stem(2,"ion","s")); }    
"pfennige"  { return(stem(2,"g","s")); }        /* disprefer */
"pharynges"  { return(stem(3,"x","s")); }      
"phenomena"  { return(stem(2,"non","s")); }    
"philodendra"  { return(stem(2,"ron","s")); }  
"pieds-a-terre"  { return(stem(9,"-a-terre","s")); }
"pineta"  { return(stem(2,"tum","s")); }       
"plateaux"  { return(stem(2,"u","s")); }       
"plena"  { return(stem(2,"num","s")); }        
"pocketknives"  { return(stem(3,"fe","s")); }  
"portmanteaux"  { return(stem(2,"u","s")); }   
"potlies"  { return(stem(4,"belly","s")); }    
"praxes"  { return(stem(2,"is","s")); }         /* disprefer */
"praxises"  { return(stem(2,"","s")); }        
"proboscides"  { return(stem(3,"s","s")); }     /* disprefer */
"proboscises"  { return(stem(2,"","s")); }     
"prostheses"  { return(stem(2,"is","s")); }    
"protozoa"  { return(stem(2,"oan","s")); }     
"pudenda"  { return(stem(2,"dum","s")); }      
"putti"  { return(stem(2,"to","s")); }         
"quanta"  { return(stem(2,"tum","s")); }       
"quarterstaves"  { return(stem(3,"ff","s")); } 
"reales"  { return(stem(2,"","s")); }           /* disprefer */
"recta"  { return(stem(2,"tum","s")); }         /* disprefer */
"referenda"  { return(stem(2,"dum","s")); }    
"reis"  { return(stem(2,"al","s")); }           /* disprefer */
"rondeaux"  { return(stem(2,"u","s")); }       
"rostra"  { return(stem(2,"rum","s")); }       
"runners-up"  { return(stem(4,"-up","s")); }   
"sancta"  { return(stem(2,"tum","s")); }        /* disprefer */
"sawboneses"  { return(stem(2,"","s")); }      
"scarves"  { return(stem(3,"f","s")); }        
"scherzi"  { return(stem(2,"zo","s")); }        /* disprefer */
"scrota"  { return(stem(2,"tum","s")); }       
"secretaries-general"  { return(stem(11,"y-general","s")); }
"selves"  { return(stem(3,"f","s")); }         
"sera"  { return(stem(2,"rum","s")); }          /* disprefer */
"seraphim"  { return(stem(2,"","s")); }        
"sheaves"  { return(stem(3,"f","s")); }        
"shelves"  { return(stem(3,"f","s")); }        
"simulacra"  { return(stem(2,"rum","s")); }    
"sisters-in-law"  { return(stem(8,"-in-law","s")); }
"soli"  { return(stem(2,"lo","s")); }           /* disprefer */
"soliloquies"  { return(stem(3,"y","s")); }    
"sons-in-law"  { return(stem(8,"-in-law","s")); }
"spectra"  { return(stem(2,"rum","s")); }      
"sphinges"  { return(stem(3,"x","s")); }        /* disprefer */
"splayfeet"  { return(stem(3,"oot","s")); }    
"sputa"  { return(stem(2,"tum","s")); }        
"stamina"  { return(stem(3,"en","s")); }        /* disprefer */
"stelae"  { return(stem(2,"e","s")); }         
"stepchildren"  { return(stem(3,"","s")); }    
"sterna"  { return(stem(2,"num","s")); }       
"strata"  { return(stem(2,"tum","s")); }       
"stretti"  { return(stem(2,"to","s")); }       
"summonses"  { return(stem(2,"","s")); }       
"swamies"  { return(stem(2,"","s")); }          /* disprefer */
"swathes"  { return(stem(2,"","s")); }         
"synopses"  { return(stem(2,"is","s")); }      
"syntheses"  { return(stem(2,"is","s")); }     
"tableaux"  { return(stem(2,"u","s")); }       
"taxies"  { return(stem(2,"","s")); }           /* disprefer */
"teeth"  { return(stem(4,"ooth","s")); }       
"tempi"  { return(stem(2,"po","s")); }         
"tenderfeet"  { return(stem(3,"oot","s")); }   
"testes"  { return(stem(2,"is","s")); }        
"theses"  { return(stem(2,"is","s")); }        
"thieves"  { return(stem(3,"f","s")); }        
"thoraces"  { return(stem(3,"x","s")); }       
"titmice"  { return(stem(3,"ouse","s")); }     
"tootses"  { return(stem(2,"","s")); }         
"torsi"  { return(stem(2,"so","s")); }          /* disprefer */
"tricepses"  { return(stem(2,"","s")); }        /* disprefer */
"triumviri"  { return(stem(2,"r","s")); }      
"trousseaux"  { return(stem(2,"u","s")); }      /* disprefer */
"turves"  { return(stem(3,"f","s")); }         
"tympana"  { return(stem(2,"num","s")); }      
"ultimata"  { return(stem(2,"tum","s")); }     
"vacua"  { return(stem(2,"uum","s")); }         /* disprefer */      
"vertices"  { return(stem(4,"ex","s")); }      
"vertigines"  { return(stem(4,"o","s")); }     
"virtuosi"  { return(stem(2,"so","s")); }      
"vortices"  { return(stem(4,"ex","s")); }      
"wagons-lits"  { return(stem(6,"-lit","s")); } 
"weirdies"  { return(stem(2,"e","s")); }       
"werewolves"  { return(stem(3,"f","s")); }     
"wharves"  { return(stem(3,"f","s")); }        
"whippers-in"  { return(stem(4,"-in","s")); }  
"wolves"  { return(stem(3,"f","s")); }         
"woodlice"  { return(stem(3,"ouse","s")); }    
"yogin"  { return(stem(2,"i","s")); }           /* disprefer */
"zombies"  { return(stem(2,"e","s")); }        
"cryed"  { return(stem(3,"y","ed")); }          /* en */ /* disprefer */
"forted"  { return(stem(3,"te","ed")); }        /* en */
"forteing"  { return(stem(4,"e","ing")); }     
"picknicks"  { return(stem(2,"","s")); }       
"resold"  { return(stem(3,"ell","ed")); }       /* en */
"retold"  { return(stem(3,"ell","ed")); }       /* en */
"retying"  { return(stem(4,"ie","ing")); }     
"singed"  { return(stem(3,"ge","ed")); }        /* en */
"singeing"  { return(stem(4,"e","ing")); }     
"trecked"  { return(stem(4,"k","ed")); }        /* en */
"trecking"  { return(stem(5,"k","ing")); }     
"canvases"  { return(stem(2,"","s")); }        
"carcases"  { return(stem(1,"","s")); }        
"lenses"  { return(stem(2,"","s")); }          
"buffetts"  { return(stem(2,"","s")); }        
"plummetts"  { return(stem(2,"","s")); }        /* disprefer */
"gunslung"  { return(stem(3,"ing","ed")); }     /* en */
"gunslinging"  { return(stem(4,"g","ing")); }  
"biases"  { return(stem(2,"","s")); }          
"biscotti"  { return(stem(2,"to","s")); }      
"bookshelves"  { return(stem(3,"f","s")); }    
"palazzi"  { return(stem(2,"zo","s")); }       
"daises"  { return(stem(2,"","s")); }          
"reguli"  { return(stem(2,"lo","s")); }        
"steppes"  { return(stem(2,"e","s")); }        
"obsequies"  { return(stem(3,"y","s")); }      
"busses"  { return(stem(3,"","s")); }
"bussed"  { return(stem(3,"","ed")); }          /* en */
"bussing"  { return(stem(4,"","ing")); }       
"hocus-pocusses"  { return(stem(3,"","s")); }
"hocusses"  { return(stem(3,"","s")); }   
"corpses"  { return(stem(1,"","s")); }

"ach"{EDING}    { return(semi_reg_stem(0,"e")); }       
"accustom"{EDING} { return(semi_reg_stem(0,"")); }      
"blossom"{EDING} { return(semi_reg_stem(0,"")); }       
"boycott"{EDING} { return(semi_reg_stem(0,"")); }       
"catalog"{EDING} { return(semi_reg_stem(0,"")); }       
{PRE}*"creat"{EDING} { return(semi_reg_stem(0,"e")); }  
"finess"{ESEDING} { return(semi_reg_stem(0,"e")); }     
"interfer"{EDING} { return(semi_reg_stem(0,"e")); }     
{PRE}*"rout"{EDING} { return(semi_reg_stem(0,"e")); }   
"tast"{ESEDING} { return(semi_reg_stem(0,"e")); }       
"wast"{ESEDING} { return(semi_reg_stem(0,"e")); }       
"acquitt"{EDING} { return(semi_reg_stem(1,"")); }       
"ante"{ESEDING} { return(semi_reg_stem(0,"")); }        
"arc"{EDING} { return(semi_reg_stem(0,"")); }           
"arck"{EDING} { return(semi_reg_stem(1,"")); }           /* disprefer */
"banquet"{EDING} { return(semi_reg_stem(0,"")); }       
"barrel"{EDING} { return(semi_reg_stem(0,"")); }        
"bedevil"{EDING} { return(semi_reg_stem(0,"")); }       
"beguil"{EDING} { return(semi_reg_stem(0,"e")); }       
"bejewel"{EDING} { return(semi_reg_stem(0,"")); }       
"bevel"{EDING} { return(semi_reg_stem(0,"")); }         
"bias"{ESEDING} { return(semi_reg_stem(0,"")); }        
"biass"{EDING} { return(semi_reg_stem(0,"")); }         
"bivouack"{EDING} { return(semi_reg_stem(1,"")); }      
"buckram"{EDING} { return(semi_reg_stem(0,"")); }       
"bushel"{EDING} { return(semi_reg_stem(0,"")); }        
"canal"{EDING} { return(semi_reg_stem(0,"")); }         
"cancel"{EDING} { return(semi_reg_stem(0,"")); }         /* disprefer */
"carol"{EDING} { return(semi_reg_stem(0,"")); }         
"cavil"{EDING} { return(semi_reg_stem(0,"")); }         
"cbel"{EDING} { return(semi_reg_stem(0,"")); }          
"cbell"{EDING} { return(semi_reg_stem(1,"")); }          /* disprefer */
"channel"{EDING} { return(semi_reg_stem(0,"")); }       
"chisel"{EDING} { return(semi_reg_stem(0,"")); }        
"clep"{EDING} { return(semi_reg_stem(0,"e")); }         
"cloth"{ESEDING} { return(semi_reg_stem(0,"e")); }      
"coiff"{ESEDING} { return(semi_reg_stem(1,"")); }         
"concertina"{EDING} { return(semi_reg_stem(0,"")); }    
"conga"{EDING} { return(semi_reg_stem(0,"")); }         
"coquett"{EDING} { return(semi_reg_stem(1,"")); }       
"counsel"{EDING} { return(semi_reg_stem(0,"")); }        /* disprefer */
"croquet"{EDING} { return(semi_reg_stem(0,"")); }       
"cudgel"{EDING} { return(semi_reg_stem(0,"")); }        
"cupel"{EDING} { return(semi_reg_stem(0,"")); }         
"debuss"{ESEDING} { return(semi_reg_stem(1,"")); }      
"degass"{ESEDING} { return(semi_reg_stem(1,"")); }      
"devil"{EDING} { return(semi_reg_stem(0,"")); }         
"diall"{EDING} { return(semi_reg_stem(1,"")); }         
"disembowel"{EDING} { return(semi_reg_stem(0,"")); }    
"dishevel"{EDING} { return(semi_reg_stem(0,"")); }      
"drivel"{EDING} { return(semi_reg_stem(0,"")); }        
"duell"{EDING} { return(semi_reg_stem(1,"")); }         
"embuss"{ESEDING} { return(semi_reg_stem(1,"")); }      
"empanel"{EDING} { return(semi_reg_stem(0,"")); }       
"enamel"{EDING} { return(semi_reg_stem(0,"")); }        
"equal"{EDING} { return(semi_reg_stem(0,"")); }         
"equall"{EDING} { return(semi_reg_stem(1,"")); }         /* disprefer */
"equipp"{EDING} { return(semi_reg_stem(1,"")); }        
"flannel"{EDING} { return(semi_reg_stem(0,"")); }       
"frivol"{EDING} { return(semi_reg_stem(0,"")); }        
"frolick"{EDING} { return(semi_reg_stem(1,"")); }       
"fuell"{EDING} { return(semi_reg_stem(1,"")); }         
"funnel"{EDING} { return(semi_reg_stem(0,"")); }        
"gambol"{EDING} { return(semi_reg_stem(0,"")); }        
"gass"{ESEDING} { return(semi_reg_stem(1,"")); }        
"gell"{EDING} { return(semi_reg_stem(1,"")); }          
"glace"{EDING} { return(semi_reg_stem(0,"")); }         
"gravel"{EDING} { return(semi_reg_stem(0,"")); }        
"grovel"{EDING} { return(semi_reg_stem(0,"")); }        
"gypp"{EDING} { return(semi_reg_stem(1,"")); }          
"hansel"{EDING} { return(semi_reg_stem(0,"")); }        
"hatchel"{EDING} { return(semi_reg_stem(0,"")); }       
"hocus-pocuss"{EDING} { return(semi_reg_stem(1,"")); }  
"hocuss"{EDING} { return(semi_reg_stem(1,"")); }        
"housel"{EDING} { return(semi_reg_stem(0,"")); }        
"hovel"{EDING} { return(semi_reg_stem(0,"")); }         
"impanel"{EDING} { return(semi_reg_stem(0,"")); }       
"initiall"{EDING} { return(semi_reg_stem(1,"")); }      
"jewel"{EDING} { return(semi_reg_stem(0,"")); }         
"kennel"{EDING} { return(semi_reg_stem(0,"")); }        
"kernel"{EDING} { return(semi_reg_stem(0,"")); }        
"label"{EDING} { return(semi_reg_stem(0,"")); }         
"laurel"{EDING} { return(semi_reg_stem(0,"")); }        
"level"{EDING} { return(semi_reg_stem(0,"")); }         
"libel"{EDING} { return(semi_reg_stem(0,"")); }         
"marshal"{EDING} { return(semi_reg_stem(0,"")); }       
"marvel"{EDING} { return(semi_reg_stem(0,"")); }        
"medal"{EDING} { return(semi_reg_stem(0,"")); }         
"metal"{EDING} { return(semi_reg_stem(0,"")); }         
"mimick"{EDING} { return(semi_reg_stem(1,"")); }        
"misspell"{EDING} { return(semi_reg_stem(0,"")); }      
"model"{EDING} { return(semi_reg_stem(0,"")); }          /* disprefer */
"nickel"{EDING} { return(semi_reg_stem(0,"")); }        
"nonpluss"{ESEDING} { return(semi_reg_stem(1,"")); }    
"outgass"{ESEDING} { return(semi_reg_stem(1,"")); }     
"outgeneral"{EDING} { return(semi_reg_stem(0,"")); }    
"overspill"{EDING} { return(semi_reg_stem(0,"")); }     
"pall"{EDING} { return(semi_reg_stem(0,"")); }          
"panel"{EDING} { return(semi_reg_stem(0,"")); }         
"panick"{EDING} { return(semi_reg_stem(1,"")); }        
"parallel"{EDING} { return(semi_reg_stem(0,"")); }      
"parcel"{EDING} { return(semi_reg_stem(0,"")); }        
"pedal"{EDING} { return(semi_reg_stem(0,"")); }         
"pencil"{EDING} { return(semi_reg_stem(0,"")); }        
"physick"{EDING} { return(semi_reg_stem(1,"")); }       
"picnick"{EDING} { return(semi_reg_stem(1,"")); }       
"pistol"{EDING} { return(semi_reg_stem(0,"")); }        
"polka"{EDING} { return(semi_reg_stem(0,"")); }         
"pommel"{EDING} { return(semi_reg_stem(0,"")); }        
"precancel"{EDING} { return(semi_reg_stem(0,"")); }      /* disprefer */
"prolog"{EDING} { return(semi_reg_stem(0,"ue")); }      
"pummel"{EDING} { return(semi_reg_stem(0,"")); }        
"quarrel"{EDING} { return(semi_reg_stem(0,"")); }       
"quipp"{EDING} { return(semi_reg_stem(1,"")); }         
"quitt"{EDING} { return(semi_reg_stem(1,"")); }         
"ravel"{EDING} { return(semi_reg_stem(0,"")); }         
"recce"{EDING} { return(semi_reg_stem(0,"")); }         
"refuell"{EDING} { return(semi_reg_stem(1,"")); }       
"revel"{EDING} { return(semi_reg_stem(0,"")); }         
"rival"{EDING} { return(semi_reg_stem(0,"")); }         
"roquet"{EDING} { return(semi_reg_stem(0,"")); }        
"rowel"{EDING} { return(semi_reg_stem(0,"")); }         
"samba"{EDING} { return(semi_reg_stem(0,"")); }         
"saute"{EDING} { return(semi_reg_stem(0,"")); }         
"shellack"{EDING} { return(semi_reg_stem(1,"")); }      
"shovel"{EDING} { return(semi_reg_stem(0,"")); }        
"shrivel"{EDING} { return(semi_reg_stem(0,"")); }       
"sick"{EDING} { return(semi_reg_stem(1,"")); }          
"signal"{EDING} { return(semi_reg_stem(0,"")); }         /* disprefer */
"ski"{EDING} { return(semi_reg_stem(0,"")); }           
"snafu"{ESEDING} { return(semi_reg_stem(0,"")); }       
"snivel"{EDING} { return(semi_reg_stem(0,"")); }        
"sol-fa"{EDING} { return(semi_reg_stem(0,"")); }        
"spancel"{EDING} { return(semi_reg_stem(0,"")); }       
"spiral"{EDING} { return(semi_reg_stem(0,"")); }        
"squatt"{EDING} { return(semi_reg_stem(1,"")); }        
"squibb"{EDING} { return(semi_reg_stem(1,"")); }        
"squidd"{EDING} { return(semi_reg_stem(1,"")); }        
"stencil"{EDING} { return(semi_reg_stem(0,"")); }       
"subpoena"{EDING} { return(semi_reg_stem(0,"")); }      
"subtotal"{EDING} { return(semi_reg_stem(0,"")); }       /* disprefer */
"swivel"{EDING} { return(semi_reg_stem(0,"")); }        
"symbol"{EDING} { return(semi_reg_stem(0,"")); }        
"symboll"{EDING} { return(semi_reg_stem(1,"")); }        /* disprefer */
"talc"{EDING} { return(semi_reg_stem(0,"")); }          
"talck"{EDING} { return(semi_reg_stem(1,"")); }          /* disprefer */
"tassel"{EDING} { return(semi_reg_stem(0,"")); }        
"taxi"{ESEDING} { return(semi_reg_stem(0,"")); }        
"tinsel"{EDING} { return(semi_reg_stem(0,"")); }        
"total"{EDING} { return(semi_reg_stem(0,"")); }          /* disprefer */
"towel"{EDING} { return(semi_reg_stem(0,"")); }         
"traffick"{EDING} { return(semi_reg_stem(1,"")); }      
"tramel"{EDING} { return(semi_reg_stem(0,"")); }        
"tramell"{EDING} { return(semi_reg_stem(1,"")); }        /* disprefer */
"travel"{EDING} { return(semi_reg_stem(0,"")); }         /* disprefer */
"trowel"{EDING} { return(semi_reg_stem(0,"")); }        
"tunnel"{EDING} { return(semi_reg_stem(0,"")); }        
"uncloth"{ESEDING} { return(semi_reg_stem(0,"e")); }    
"unkennel"{EDING} { return(semi_reg_stem(0,"")); }      
"unravel"{EDING} { return(semi_reg_stem(0,"")); }       
"upswell"{EDING} { return(semi_reg_stem(0,"")); }       
"victuall"{EDING} { return(semi_reg_stem(1,"")); }      
"vitrioll"{EDING} { return(semi_reg_stem(1,"")); }      
"viva"{EDING} { return(semi_reg_stem(0,"")); }          
"yodel"{EDING} { return(semi_reg_stem(0,"")); }         
("di"|"ti"|"li"|"unti"|"beli"|"hogti"|"stymi")"es"  { return(stem(2,"e","s")); } /* en */
("di"|"ti"|"li"|"unti"|"beli"|"hogti"|"stymi")"ed"  { return(stem(2,"e","ed")); } /* en */
("d"|"t"|"l"|"unt"|"bel"|"hogt"|"stym")"ying"  { return(stem(4,"ie","ing")); } /* en */
"bias" { return(cnull_stem()); }                         
"canvas" { return(cnull_stem()); }                       
"canvas"{ESEDING} { return(semi_reg_stem(0,"")); }      
"embed" { return(cnull_stem()); }                         /* disprefer */
"focuss"{ESEDING} { return(semi_reg_stem(1,"")); }      
"gas" { return(cnull_stem()); }
"picknick"{EDING} { return(semi_reg_stem(1,"")); }      
("adher"|"ador"|"attun"|"bast"|"bor"|"can"|"centr"|"cit"|"compet"|"cop"|"complet"|"concret"|"condon"|"contraven"|"conven"|"cran"|"delet"|"delineat"|"dop"|"drap"|"dron"|"escap"|"excit"|"fort"|"gap"|"gazett"|"grop"|"hon"|"hop"|"ignit"|"ignor"|"incit"|"interven"|"inton"|"invit"|"landscap"|"manoeuvr"|"nauseat"|"normalis"|"outmanoeuvr"|"overaw"|"permeat"|"persever"|"pip"|"por"|"postpon"|"prun"|"rap"|"recit"|"reshap"|"rop"|"shap"|"shor"|"snor"|"snip"|"ston"|"tap"|"wip"){ESEDING} { return(semi_reg_stem(0,"e")); }
("ape"|"augur"|"belong"|"berth"|"burr"|"conquer"|"egg"|"forestall"|"froth"|"install"|"lacquer"|"martyr"|"mouth"|"murmur"|"pivot"|"preceed"|"prolong"|"purr"|"quell"|"recall"|"refill"|"remill"|"resell"|"retell"|"smooth"|"throng"|"twang"|"unearth"){EDING} { return(semi_reg_stem(0,"")); }
(({A}*"metr")|({A}*"litr")|({A}+"ett")|"acr"|"Aussi"|"budgi"|"catastroph"|"centr"|"clich"|"commi"|"cooli"|"curi"|"demesn"|"employe"|"evacue"|"fibr"|"headach"|"hord"|"magpi"|"manoeuvr"|"moggi"|"moustach"|"movi"|"nighti"|"programm"|"queu"|"sabr"|"sorti"|"tast"|"theatr"|"timbr"|"titr"|"wiseacr")"es" { return(stem(1,"","s")); }
"burnurns" { return(stem(1,"","s")); }                  
"carriageways" { return(stem(1,"","s")); }              
"cills" { return(stem(1,"","s")); }                     
("umbrell"|"utopi")"as" { return(stem(1,"","s")); }     
(({A}+"itis")|"abdomen"|"acacia"|"achimenes"|"alibi"|"alkali"|"ammonia"|"amnesia"|"anaesthesia"|"anesthesia"|"aria"|"arris"|"asphyxia"|"aspidistra"|"aubrietia"|"axis"|"begonia"|"bias"|"bikini"|"cannula"|"canvas"|"chili"|"chinchilla"|"Christmas"|"cornucopia"|"cupola"|"cyclamen"|"diabetes"|"diphtheria"|"dysphagia"|"encyclopaedia"|"ennui"|"escallonia"|"ferris"|"flotilla"|"forsythia"|"ganglia"|"gas"|"gondola"|"grata"|"guerrilla"|"haemophilia"|"hysteria"|"inertia"|"insignia"|"iris"|"khaki"|"koala"|"lens"|"macaroni"|"manilla"|"mania"|"mantis"|"martini"|"matins"|"memorabilia"|"metropolis"|"moa"|"morphia"|"nostalgia"|"omen"|"pantometria"|"parabola"|"paraphernalia"|"pastis"|"patella"|"patens"|"pelvis"|"peninsula"|"phantasmagoria"|"pneumonia"|"polyuria"|"portcullis"|"pyrexia"|"regalia"|"safari"|"salami"|"sari"|"saturnalia"|"spaghetti"|"specimen"|"subtopia"|"suburbia"|"syphilis"|"taxi"|"toccata"|"trellis"|"tutti"|"umbrella"|"utopia"|"villa"|"zucchini") { return(cnull_stem()); }
("acumen"|"Afrikaans"|"aphis"|"brethren"|"caries"|"confetti"|"contretemps"|"dais"|"debris"|"extremis"|"gallows"|"hors"|"hovis"|"hustings"|"innards"|"isosceles"|"maquis"|"minutiae"|"molasses"|"mortis"|"patois"|"pectoris"|"plumbites"|"series"|"tares"|"tennis"|"turps") { return(xnull_stem()); }
("accoutrements"|"aerodynamics"|"aeronautics"|"aesthetics"|"algae"|"amends"|"annals"|"arrears"|"assizes"|"auspices"|"backwoods"|"bacteria"|"banns"|"battlements"|"bedclothes"|"belongings"|"billiards"|"binoculars"|"bitters"|"blandishments"|"bleachers"|"blinkers"|"blues"|"breeches"|"brussels"|"clothes"|"clutches"|"commons"|"confines"|"contents"|"credentials"|"crossbones"|"damages"|"dealings"|"dentures"|"depths"|"devotions"|"diggings"|"doings"|"downs"|"dues"|"dynamics"|"earnings"|"eatables"|"eaves"|"economics"|"electrodynamics"|"electronics"|"entrails"|"environs"|"equities"|"ethics"|"eugenics"|"filings"|"finances"|"folks"|"footlights"|"fumes"|"furnishings"|"genitals"|"glitterati"|"goggles"|"goods"|"grits"|"groceries"|"grounds"|"handcuffs"|"headquarters"|"histrionics"|"hostilities"|"humanities"|"hydraulics"|"hysterics"|"illuminations"|"italics"|"jeans"|"jitters"|"kinetics"|"knickers"|"latitudes"|"leggings"|"likes"|"linguistics"|"lodgings"|"loggerheads"|"mains"|"manners"|"mathematics"|"means"|"measles"|"media"|"memoirs"|"metaphysics"|"mockers"|"motions"|"multimedia"|"munitions"|"news"|"nutria"|"nylons"|"oats"|"odds"|"oils"|"oilskins"|"optics"|"orthodontics"|"outskirts"|"overalls"|"pants"|"pantaloons"|"papers"|"paras"|"paratroops"|"particulars"|"pediatrics"|"phonemics"|"phonetics"|"physics"|"pincers"|"plastics"|"politics"|"proceeds"|"proceedings"|"prospects"|"pyjamas"|"rations"|"ravages"|"refreshments"|"regards"|"reinforcements"|"remains"|"respects"|"returns"|"riches"|"rights"|"savings"|"scissors"|"seconds"|"semantics"|"shades"|"shallows"|"shambles"|"shorts"|"singles"|"slacks"|"specifics"|"spectacles"|"spoils"|"statics"|"statistics"|"summons"|"supplies"|"surroundings"|"suspenders"|"takings"|"teens"|"telecommunications"|"tenterhooks"|"thanks"|"theatricals"|"thermodynamics"|"tights"|"toils"|"trappings"|"travels"|"troops"|"tropics"|"trousers"|"tweeds"|"underpants"|"vapours"|"vicissitudes"|"vitals"|"wages"|"wanderings"|"wares"|"whereabouts"|"whites"|"winnings"|"withers"|"woollens"|"workings"|"writings"|"yes") { return(xnull_stem()); }
("boati"|"bonhomi"|"clippi"|"creepi"|"deari"|"droppi"|"gendarmeri"|"girli"|"goali"|"haddi"|"kooki"|"kyri"|"lambi"|"lassi"|"mari"|"menageri"|"petti"|"reveri"|"snotti"|"sweeti")"es" { return(stem(1,"","s")); }
("buffet"|"plummet")"t"{EDING} { return(semi_reg_stem(1,"")); }
"gunsling" { return(cnull_stem()); }
"hamstring" { return(cnull_stem()); }
"shred" { return(cnull_stem()); }
"unfocuss"{ESEDING} { return(semi_reg_stem(1,"")); }    
("accret"|"clon"|"deplet"|"dethron"|"dup"|"excret"|"expedit"|"extradit"|"fet"|"finetun"|"gor"|"hing"|"massacr"|"obsolet"|"reconven"|"recreat"|"recus"|"reignit"|"swip"|"videotap"|"zon"){ESEDING} { return(semi_reg_stem(0,"e")); }
("backpedal"|"bankroll"|"bequeath"|"blackball"|"bottom"|"clang"|"debut"|"doctor"|"eyeball"|"factor"|"imperil"|"landfill"|"margin"|"multihull"|"occur"|"overbill"|"pilot"|"prong"|"pyramid"|"reinstall"|"relabel"|"remodel"|"snowball"|"socall"|"squirrel"|"stonewall"|"wrong"){EDING} { return(semi_reg_stem(0,"")); } /* disprefer */
("beasti"|"browni"|"cach"|"cadr"|"calori"|"champagn"|"cologn"|"cooki"|"druggi"|"eateri"|"emigr"|"emigre"|"employe"|"freebi"|"genr"|"kiddi"|"massacr"|"mooni"|"neckti"|"nich"|"prairi"|"softi"|"toothpast"|"willi")"es" { return(stem(1,"","s")); }
(({A}*"phobia")|"accompli"|"aegis"|"alias"|"anorexia"|"anti"|"artemisia"|"ataxia"|"beatlemania"|"blini"|"cafeteria"|"capita"|"cola"|"coli"|"deli"|"dementia"|"downstairs"|"upstairs"|"dyslexia"|"jakes"|"dystopia"|"encyclopedia"|"estancia"|"euphoria"|"euthanasia"|"fracas"|"fuss"|"gala"|"gorilla"|"GI"|"habeas"|"haemophilia"|"hemophilia"|"hoopla"|"hula"|"impatiens"|"informatics"|"intelligentsia"|"jacuzzi"|"kiwi"|"mafia"|"magnolia"|"malaria"|"maquila"|"marginalia"|"megalomania"|"mercedes"|"militia"|"mufti"|"muni"|"olympics"|"pancreas"|"paranoia"|"pastoris"|"pastrami"|"pepperoni"|"pepsi"|"pi"|"piroghi"|"pizzeria"|"pneumocystis"|"potpourri"|"proboscis"|"rabies"|"reggae"|"regimen"|"rigatoni"|"salmonella"|"sarsaparilla"|"semen"|"ski"|"sonata"|"spatula"|"stats"|"subtilis"|"sushi"|"tachyarrhythmia"|"tachycardia"|"tequila"|"tetris"|"thrips"|"timpani"|"tsunami"|"vaccinia"|"vanilla") { return(cnull_stem()); }
("acrobatics"|"athletics"|"basics"|"betters"|"bifocals"|"bowels"|"briefs"|"checkers"|"cognoscenti"|"denims"|"doldrums"|"dramatics"|"dungarees"|"ergonomics"|"genetics"|"gravitas"|"gymnastics"|"hackles"|"haves"|"hubris"|"ides"|"incidentals"|"ironworks"|"jinks"|"leavings"|"leftovers"|"logistics"|"makings"|"microelectronics"|"miniseries"|"mips"|"mores"|"oodles"|"pajamas"|"pampas"|"panties"|"payola"|"pickings"|"plainclothes"|"pliers"|"ravings"|"reparations"|"rudiments"|"scads"|"splits"|"stays"|"subtitles"|"sunglasss"|"sweepstakes"|"tatters"|"toiletries"|"tongs"|"trivia"|"tweezers"|"vibes"|"waterworks"|"woolens") { return(xnull_stem()); }
("biggi"|"bourgeoisi"|"bri"|"camaraderi"|"chinoiseri"|"coteri"|"doggi"|"geni"|"hippi"|"junki"|"lingeri"|"moxi"|"preppi"|"rooki"|"yuppi")"es"  { return(stem(1,"","s")); }
("chor"|"sepulchr"|"silhouett"|"telescop"){ESEDING}  { return(semi_reg_stem(0,"e")); }
("subpena"|"suds"){EDING} { return(semi_reg_stem(0,"")); }
(({A}+"philia")|"fantasia"|"Feis"|"Gras"|"Mardi")  { return(cnull_stem()); }
("calisthenics"|"heroics"|"rheumatics"|"victuals"|"wiles")  { return(xnull_stem()); }
("aunti"|"anomi"|"coosi"|"quicki")"es" { return(stem(1,"","s")); }
("absentia"|"bourgeois"|"pecunia"|"Syntaxis"|"uncia")  { return(cnull_stem()); }
("apologetics"|"goings"|"outdoors")  { return(xnull_stem()); }
"collies"  { return(stem(1,"","s")); }                   
"imbed"  { return(cnull_stem()); }
"precis"  { return(cnull_stem()); }
"precis"{ESEDING} { return(semi_reg_stem(0,"")); }      
("assagai"|"borzoi"|"calla"|"camellia"|"campanula"|"cantata"|"caravanserai"|"cedilla"|"cognomen"|"copula"|"corolla"|"cyclopaedia"|"dahlia"|"dhoti"|"dolmen"|"effendi"|"fibula"|"fistula"|"freesia"|"fuchsia"|"guerilla"|"hadji"|"hernia"|"houri"|"hymen"|"hyperbola"|"hypochondria"|"inamorata"|"kepi"|"kukri"|"mantilla"|"monomania"|"nebula"|"ovata"|"pergola"|"petunia"|"pharmacopoeia"|"phi"|"poinsettia"|"primula"|"rabbi"|"scapula"|"sequoia"|"sundae"|"tarantella"|"tarantula"|"tibia"|"tombola"|"topi"|"tortilla"|"uvula"|"viola"|"wisteria"|"zinnia")  { return(cnull_stem()); }
("tibi"|"nebul"|"uvul")"ae"  { return(stem(1,"","s")); } /* disprefer */
("arras"|"clitoris"|"muggins")"es" { return(stem(2,"","s")); }
("alms"|"biceps"|"calends"|"elevenses"|"eurhythmics"|"faeces"|"forceps"|"jimjams"|"jodhpurs"|"menses"|"secateurs"|"shears"|"smithereens"|"spermaceti"|"suds"|"trews"|"triceps"|"underclothes"|"undies"|"vermicelli")  { return(xnull_stem()); }
("albumen"|"alopecia"|"ambergris"|"amblyopia"|"ambrosia"|"analgesia"|"aphasia"|"arras"|"asbestos"|"asia"|"assegai"|"astrophysics"|"aubrietia"|"aula"|"avoirdupois"|"beriberi"|"bitumen"|"broccoli"|"cadi"|"callisthenics"|"collywobbles"|"curia"|"cybernetics"|"cyclops"|"cyclopedia"|"dickens"|"dietetics"|"dipsomania"|"dyspepsia"|"epidermis"|"epiglottis"|"erysipelas"|"fascia"|"finis"|"fives"|"fleur-de-lis"|"geophysics"|"geriatrics"|"glottis"|"haggis"|"hara-kiri"|"herpes"|"hoop-la"|"ibis"|"insomnia"|"kleptomania"|"kohlrabi"|"kris"|"kumis"|"litchi"|"litotes"|"loggia"|"magnesia"|"man-at-arms"|"manila"|"marquis"|"master-at-arms"|"mattins"|"melancholia"|"minutia"|"muggins"|"mumps"|"mi"|"myopia"|"necropolis"|"neuralgia"|"nibs"|"numismatics"|"nymphomania"|"obstetrics"|"okapi"|"onomatopoeia"|"ophthalmia"|"paraplegia"|"patchouli"|"paterfamilias"|"penis"|"piccalilli"|"praxis"|"precis"|"prophylaxis"|"pyrites"|"raffia"|"revers"|"rickets"|"rounders"|"rubella"|"saki"|"salvia"|"sassafras"|"sawbones"|"scabies"|"schnapps"|"scintilla"|"scrofula"|"sepia"|"stamen"|"si"|"swami"|"testis"|"therapeutics"|"tiddlywinks"|"verdigris"|"wadi"|"wapiti"|"yogi")  { return(cnull_stem()); }
("aeri"|"birdi"|"bogi"|"caddi"|"cock-a-leeki"|"colli"|"corri"|"cowri"|"dixi"|"eyri"|"faeri"|"gaucheri"|"gilli"|"knobkerri"|"laddi"|"mashi"|"meali"|"menageri"|"organdi"|"patisseri"|"pinki"|"pixi"|"stymi"|"talki")"es" { return(stem(1,"","s")); }
"humans"                  { return(stem(1,"","s")); }   
"slums"                   { return(stem(1,"","s")); }
(({A}*"-us")|"abus"|"accus"|"amus"|"arous"|"bemus"|"carous"|"contus"|"disabus"|"disus"|"dous"|"enthus"|"excus"|"grous"|"misus"|"mus"|"overus"|"perus"|"reus"|"rous"|"sous"|"us"|({A}*[hlmpHLMP]"ous")|({A}*[afAF]"us")){ESEDING} { return(semi_reg_stem(0,"e")); }
(({A}*"-abus")|({A}*"-us")|"abus"|"burnous"|"cayus"|"chanteus"|"chartreus"|"chauffeus"|"crus"|"disus"|"excus"|"grous"|"hypotenus"|"masseus"|"misus"|"mus"|"Ous"|"overus"|"poseus"|"reclus"|"reus"|"rus"|"us"|({A}*[hlmpHLMP]"ous")|({A}*[afAF]"us"))"es" { return(stem(1,"","s")); }
("ablutions"|"adenoids"|"aerobatics"|"afters"|"astronautics"|"atmospherics"|"bagpipes"|"ballistics"|"bell-bottoms"|"belles-lettres"|"blinders"|"bloomers"|"butterfingers"|"buttocks"|"bygones"|"cahoots"|"castanets"|"clappers"|"dodgems"|"dregs"|"duckboards"|"edibles"|"eurythmics"|"externals"|"extortions"|"falsies"|"fisticuffs"|"fleshings"|"fleur-de-lys"|"fours"|"gentleman-at-arms"|"geopolitics"|"giblets"|"gleanings"|"handlebars"|"heartstrings"|"homiletics"|"housetops"|"hunkers"|"hydroponics"|"kalends"|"knickerbockers"|"lees"|"lei"|"lieder"|"literati"|"loins"|"meanderings"|"meths"|"muniments"|"necessaries"|"nines"|"ninepins"|"nippers"|"nuptials"|"orthopaedics"|"paediatrics"|"phonics"|"polemics"|"pontificals"|"prelims"|"pyrotechnics"|"ravioli"|"rompers"|"ructions"|"scampi"|"scrapings"|"serjeant-at-arms"|"shires"|"smalls"|"steelworks"|"sweepings"|"vespers"|"virginals"|"waxworks") { return(xnull_stem()); }
("cannabis"|"corgi"|"envoi"|"hi-fi"|"kwela"|"lexis"|"muesli"|"sheila"|"ti"|"yeti") { return(cnull_stem()); }

("mounti"|"brasseri"|"granni"|"koppi"|"rotisseri")"es" { return(stem(1,"","s")); }

"cantharis"    { return(stem(1,"de","s")); }
"chamois"      { return(stem(1,"x","s")); }
"submatrices"  { return(stem(3,"x","s")); }
"mafiosi"      { return(stem(1,"o","s")); }
"pleura"       { return(stem(1,"on","s")); } 
"vasa"         { return(stem(1,"","s")); } 
"antipasti"    { return(stem(1,"o","s")); }

  /* -o / -oe */

("bastinado"|"bunco"|"bunko"|"carbonado"|"contango"|"crescendo"|"ditto"|"echo"|"embargo"|"fresco"|"hallo"|"halo"|"lasso"|"niello"|"radio"|"solo"|"stiletto"|"stucco"|"tally-ho"|"tango"|"torpedo"|"veto"|"zero")"ed"  { return(stem(2,"","ed")); }    /* en */
"ko'd"  { return(stem(3,"o","ed")); }           /* en */
"ko'ing"  { return(stem(4,"","ing")); }        
"ko's"  { return(stem(2,"","s")); }            
"tally-ho'd"  { return(stem(3,"","ed")); }     /* en */ /* disprefer */
("co"|"do"|"ko"|"no")"'s"   { return(stem(2,"","s")); }

("aloe"|"archfoe"|"canoe"|"doe"|"felloe"|"floe"|"foe"|"hammertoe"|"hoe"|"icefloe"|"mistletoe"|"oboe"|"roe"|({A}*"shoe")|"sloe"|"throe"|"tiptoe"|"toe"|"voe"|"woe")"s"  { return(stem(1,"","s")); }
("canoe"|"hoe"|"outwoe"|"rehoe"|({A}*"shoe")|"tiptoe"|"toe")"s"  { return(stem(1,"","s")); }

("tornedos"|"throes")  { return(xnull_stem()); }

  /* redundant in analysis; but in generation e.g. buffalo+s -> buffaloes */

("antihero"|"buffalo"|"dingo"|"domino"|"echo"|"go"|"grotto"|"hero"|"innuendo"|"mango"|"mato"|"mosquito"|"mulatto"|"potato"|"peccadillo"|"pentomino"|"superhero"|"tomato"|"tornado"|"torpedo"|"veto"|"volcano")"es" { return(stem(2,"","s")); }
("echo"|"forego"|"forgo"|"go"|"outdo"|"overdo"|"redo"|"torpedo"|"undergo"|"undo"|"veto")"es"  { return(stem(2,"","s")); }            

  /* -os / -oses */
  
("bathos"|"cross-purposes"|"kudos")  { return(xnull_stem()); }
"cos"                                { return(cnull_stem()); }

("chaos"|"cosmos"|"ethos"|"parados"|"pathos"|"rhinoceros"|"tripos"|"thermos"|"OS"|"reredos") { return(cnull_stem()); }
("chaos"|"cosmos"|"ethos"|"parados"|"pathos"|"rhinoceros"|"tripos"|"thermos"|"OS"|"reredos")"es"  { return(stem(2,"","s")); }

("anastomos"|"apotheos"|"arterioscleros"|"asbestos"|"cellulos"|"dermatos"|"diagnos"|"diverticulos"|"exostos"|"hemicellulos"|"histocytos"|"hypnos"|"meios"|"metamorphos"|"metempsychos"|"mitos"|"neuros"|"prognos"|"psychos"|"salmonellos"|"symbios"|"scleros"|"stenos"|"symbios"|"synchondros"|"treponematos"|"zoonos")"es"  { return(stem(2,"is","s")); }     

"pharoses"   { return(stem(4,"isee","s")); }  /* disprefer */

  /* -zes */

("adze"|"bronze")"s"        { return(stem(1,"","s")); } 
("fez"|"quiz")"zes"         { return(stem(3,"","s")); }
("fez"|"quiz")"es"          { return(stem(2,"","s")); }      /* disprefer */
("adz"|"bronz"){ESEDING}    { return(semi_reg_stem(0,"e")); }         
("quiz"|"whiz")"z"{ESEDING} { return(semi_reg_stem(1,"")); }
("quiz"|"whiz"){ESEDING}    { return(semi_reg_stem(0,"")); } /* disprefer */

{A}+"uses"                { return(stem(2,"","s")); }
{A}+"used"                     { return(stem(2,"","ed")); } /* en */
{A}+"using"                    { return(stem(3,"","ing")); }

"pp." { return(stem(2,".","s")); }             
"m.p.s." { return(stem(6,"m.p.","s")); }       
("cons"|"miss"|"mrs"|"ms"|"n-s"|"pres"|"ss")"." { return(cnull_stem()); }
({A}|".")+".s."                { return(cnull_stem()); }
({A}|".")+".'s."               { return(stem(4,".","s")); } /* disprefer */
({A}|".")+"s."                 { return(stem(2,".","s")); }

{A}*"men"                 { return(stem(2,"an","s")); }
{A}*"wives"               { return(stem(3,"fe","s")); } 
{A}+"zoa"                 { return(stem(1,"on","s")); }
{A}+"iia"                 { return(stem(2,"um","s")); } /* disprefer */
{A}+"e"[mnMN]"ia"           { return(cnull_stem()); }
{A}+"ia"                  { return(stem(1,"um","s")); } /* disprefer */
{A}+"la"                  { return(stem(1,"um","s")); }
[DdMmCcLlXxVvIi]+i	    { return cnull_stem(); }	/* cdm: don't lemmatize roman numerals, even if tagged as NN by mistake */
{A}+"i"                   { return(stem(1,"us","s")); } /* disprefer */
{A}+"ae"                  { return(stem(2,"a","s")); } /* disprefer */
{A}+"ata"                 { return(stem(3,"a","s")); } /* disprefer */

("his"|"hers"|"theirs"|"ours"|"yours"|"as"|"its"|"this"|"during"|"something"|"nothing"|"anything"|"everything") { return(cnull_stem()); }
{A}*("us"|"ss"|"sis"|"eed") { return(cnull_stem()); }
{A}*{V}"ses"            { return(stem(1,"","s")); }
{A}+{CXY}"zes"          { return(stem(2,"","s")); }
{A}*{VY}"zes"           { return(stem(1,"","s")); }
{A}+{S2}"es"            { return(stem(2,"","s")); }
{A}+{V}"rses"           { return(stem(1,"","s")); }
{A}+"onses"             { return(stem(1,"","s")); }
{A}+{S}"es"             { return(stem(2,"","s")); }
{A}+"thes"              { return(stem(1,"","s")); }
{A}+{CXY}[cglsvCGLSV]"es"    { return(stem(1,"","s")); }
{A}+"ettes"             { return(stem(1,"","s")); }
{A}+{C}"ies"            { return(stem(3,"y","s")); }
{A}*{CXY}"oes"          { return(stem(2,"","s")); }  /* disprefer */
{A}+"s"                 { return(stem(1,"","s")); }

{A}+{CXY}"zed"          { return(stem(2,"","ed")); }     /* en */
{A}*{VY}"zed"           { return(stem(1,"","ed")); }     /* en */
{A}+{S2}"ed"            { return(stem(2,"","ed")); }     /* en */
{A}+{CXY}"zing"         { return(stem(3,"","ing")); }
{A}*{VY}"zing"          { return(stem(3,"e","ing")); }
{A}+{S2}"ing"           { return(stem(3,"","ing")); } 
{C}+{V}"lled"           { return(stem(2,"","ed")); }     /* en */
{C}+{V}"lling"          { return(stem(3,"","ing")); } 
{A}*{C}{V}{CXY2}"ed"    { return(condub_stem(2,"","ed")); } /* en */
{A}*{C}{V}{CXY2}"ing"   { return(condub_stem(3,"","ing")); }

{CXY}+"ed"                { return(cnull_stem()); }
{PRE}*{C}{V}"nged"        { return(stem(2,"","ed")); }   /* en */
{A}+"icked"               { return(stem(2,"","ed")); }   /* en */
{A}*{C}"ined"             { return(stem(2,"e","ed")); }  /* en */
{A}*{C}{V}[npwxNPWX]"ed"      { return(stem(2,"","ed")); }   /* en */ /* disprefer */
{PRE}*{C}+"ored"          { return(stem(2,"e","ed")); }  /* en */
{A}+"ctored"              { return(stem(2,"","ed")); }   /* en */ /* disprefer */
{A}*{C}[clntCLNT]"ored"       { return(stem(2,"e","ed")); }  /* en */
{A}+[eoEO]"red"             { return(stem(2,"","ed")); }   /* en */
{A}+{C}"ied"              { return(stem(3,"y","ed")); }  /* en */
{A}*"qu"{V}{C}"ed"        { return(stem(2,"e","ed")); }  /* en */
{A}+"u"{V}"ded"           { return(stem(2,"e","ed")); }  /* en */
{A}*{C}"leted"            { return(stem(2,"e","ed")); }  /* en */
{PRE}*{C}+[eiEI]"ted"       { return(stem(2,"e","ed")); }  /* en */
{A}+[eiEI]"ted"             { return(stem(2,"","ed")); }   /* en */
{PRE}({CXY}{2})"eated"    { return(stem(2,"","ed")); }   /* en */
{A}*{V}({CXY}{2})"eated"  { return(stem(2,"e","ed")); }  /* en */
{A}+[eoEO]"ated"            { return(stem(2,"","ed")); }   /* en */
{A}+{V}"ated"             { return(stem(2,"e","ed")); }  /* en */
{A}*({V}{2})[cgsvCGSV]"ed"    { return(stem(2,"e","ed")); }  /* en */
{A}*({V}{2}){C}"ed"       { return(stem(2,"","ed")); }   /* en */
{A}+[rwRW]"led"             { return(stem(2,"","ed")); }   /* en */
{A}+"thed"                { return(stem(2,"e","ed")); }  /* en */
{A}+"ued"                 { return(stem(2,"e","ed")); }  /* en */
{A}+{CXY}[cglsvCGLSV]"ed"  { return(stem(2,"e","ed")); }  /* en */
{A}+({CXY}{2})"ed"        { return(stem(2,"","ed")); }   /* en */
{A}+({VY}{2})"ed"         { return(stem(2,"","ed")); }   /* en */
{A}+"ed"                  { return(stem(2,"e","ed")); }  /* en */

{CXY}+"ing"                  { return(cnull_stem()); }
{PRE}*{C}{V}"nging"          { return(stem(3,"","ing")); } 
{A}+"icking"                 { return(stem(3,"","ing")); } 
{A}*{C}"ining"               { return(stem(3,"e","ing")); }
{A}*{C}{V}[npwxNPWX]"ing"        { return(stem(3,"","ing")); }  /* disprefer */
{A}*"qu"{V}{C}"ing"          { return(stem(3,"e","ing")); }
{A}+"u"{V}"ding"             { return(stem(3,"e","ing")); }
{A}*{C}"leting"              { return(stem(3,"e","ing")); }
{PRE}*{C}+[eiEI]"ting"         { return(stem(3,"e","ing")); }
{A}+[eiEI]"ting"               { return(stem(3,"","ing")); } 
{A}*{PRE}({CXY}{2})"eating"  { return(stem(3,"","ing")); }
{A}*{V}({CXY}{2})"eating"    { return(stem(3,"e","ing")); }
{A}+[eoEO]"ating"              { return(stem(3,"","ing")); } 
{A}+{V}"ating"               { return(stem(3,"e","ing")); }
{A}*({V}{2})[cgsvCGSV]"ing"      { return(stem(3,"e","ing")); }
{A}*({V}{2}){C}"ing"         { return(stem(3,"","ing")); } 
{A}+[rwRW]"ling"               { return(stem(3,"","ing")); } 
{A}+"thing"                  { return(stem(3,"e","ing")); }
{A}+{CXY}[cglsvCGLSV]"ing"        { return(stem(3,"e","ing")); }
{A}+({CXY}{2})"ing"          { return(stem(3,"","ing")); } 
{A}+"uing"                   { return(stem(3,"e","ing")); }
{A}+({VY}{2})"ing"           { return(stem(3,"","ing")); } 
{A}+"ying"                   { return(stem(3,"","ing")); } 
{A}*{CXY}"oing"              { return(stem(3,"","ing")); } 
{PRE}*{C}+"oring"            { return(stem(3,"e","ing")); }
{A}+"ctoring"                { return(stem(3,"","ing")); }  /* disprefer */
{A}*{C}[cltCLT]"oring"          { return(stem(3,"e","ing")); }
{A}+[eoEO]"ring"               { return(stem(3,"","ing")); } 
{A}+"ing"                    { return(stem(3,"e","ing")); }

{GM}*"-"   { // The first word isn't stemmed separately, but the second half can be
                            String stem = common_noun_stem();
                            String n = next();
                            if (n == null) {
                              return stem; 
                            } else {
                              return stem.concat(n);
                            }
                          } 
{GM}+      { return(common_noun_stem()); }

"were"/_VBDR  { return(stem(4,"be","ed")); }
"was"/_VBDZ   { return(stem(3,"be","ed")); }
"am"/_VBM     { return(stem(2,"be","")); }      
"are"/_VBR    { return(stem(3,"be","")); }      
"were"/_VBD  { return(stem(4,"be","ed")); }
"was"/_VBD   { return(stem(3,"be","ed")); }
"am"/_VBP     { return(stem(2,"be","")); }      
"are"/_VBP    { return(stem(3,"be","")); }      
"is"/_VBZ     { return(stem(2,"be","s")); }     
"'d"/_VH      { return(stem(2,"have","ed")); }    /* disprefer */
"'d"/_VBD      { return(stem(2,"have","ed")); }    /* disprefer */
"'d"/_VM      { return(stem(2,"would","")); }
"'d"/_MD      { return(stem(2,"would","")); }
"'s"/_VBZ     { return(stem(2,"be","s")); }       /* disprefer */ /* could really be have */
"'s"/_VDZ     { return(stem(2,"do","s")); }       /* disprefer */
"'s"/_VHZ     { return(stem(2,"have","s")); }     /* disprefer */
"'s"/_"$"     { return(stem(2,"'s","")); }             
"'s"/_POS     { return(stem(2,"'s","")); }             
"'s"/_CSA     { return(stem(2,"as","")); }             
"'s"/_CJS     { return(stem(2,"as","")); }             
"not"/_XX     { return(stem(3,"not","")); }            
"ai"/_VB      { return(stem(2,"be","")); }        /* disprefer */
"ai"/_VH      { return(stem(2,"have","")); }      /* disprefer */
"ca"/_VM      { return(stem(2,"can","")); }
"ca"/_MD      { return(stem(2,"can","")); }
"sha"/_VM     { return(stem(3,"shall","")); }          
"sha"/_MD     { return(stem(3,"shall","")); }          
"wo"/_VM      { return(stem(2,"will","")); }      /* disprefer */
"wo"/_MD      { return(stem(2,"will","")); }      /* disprefer */
"n't"/_XX     { return(stem(3,"not","")); }       /* disprefer */
"n't"/_RB     { return(stem(3,"not","")); }      /* cdm add; disprefer */
"him"/_P  { return(stem(3,"he","")); }          
"her"/_P  { return(stem(3,"she","")); }         
"them"/_P   { return(stem(1,"y","")); }         
"me"/_P   { return(stem(2,"I","")); }            
"us"/_P   { return(stem(2,"we","")); }           
"I"/_P    { return(proper_name_stem()); }
"their"/_P   { return(stem(2,"y","")); }         
"my"/_P   { return(stem(1,"y","")); }         
"your"/_P   { return(stem(1,"","")); }         
"his"/_P   { return(stem(2,"e","")); }         
"our"/_P   { return(stem(3,"we","")); }         
"me"/_P     { return(stem(2,"I","")); }              
"us"/_P     { return(stem(2,"we","")); }             
"I"/_P      { return(proper_name_stem()); }
"an"/_[AD]     { return(stem(1, "", "n")); }
{G}+/_N{1,2}[^P] { yybegin(noun); yypushback(yylength()); return(next()); }
{G}+/_N{1,2}P    { return(proper_name_stem()); }
{G}+/_V     { yybegin(verb); yypushback(yylength()); return(next()); }
{G}+/_      { return(common_noun_stem()); }
_{G}+       { yybegin(scan); if (option(tag_output)) return yytext(); }
{SKIP}      { return yytext(); }
.		{ String str = yytext();
                                  int first = str.charAt(0);
	                          String msg = String.format("Untokenizable: %s (U+%s, decimal: %s) - this may be because your text isn't using _ as a tag delimiter", yytext(), Integer.toHexString(first).toUpperCase(), Integer.toString(first));
                  LOGGER.warning(msg);
		}
<> { return null; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy