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.Collections;
import java.util.Set;
import java.util.StringTokenizer;

import edu.stanford.nlp.util.Generics;
import edu.stanford.nlp.util.logging.Redwood;

%%

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

%{

  /** A logger for this class */
  private static final Redwood.RedwoodChannels logger = Redwood.channels(Morphology.class);

  /** These are constants for the position of options in array.
   *  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 static final Set verbStemSet = loadVerbStemSet(verbStems);

  /**
   * Loads a list of words from the array and stores them in a HashSet.
   */
  private static Set loadVerbStemSet(String[] verbStems) {
    Set set = Generics.newHashSet(verbStems.length);
    Collections.addAll(set, verbStems);
    return Collections.unmodifiableSet(set);
  }

%}


%init{
  options = new boolean[NUM_OPTIONS];
  for (int j=0;j 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. */
  private String xnull_stem() {
    return common_noun_stem();
  }

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


  /** the +ed/+en form is the same as the stem */
  private 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 */
"re"  { return(stem(2,"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(1,"ve","ed")); }         /* en */
"has"  { return(stem(1,"ve","s")); }
"hath"  { return(stem(2,"ve","s")); }         /* disprefer */
"does"  { return(stem(2,"","s")); }
"du"  { return(stem(1,"o","")); }   /* for dunno */
"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 */
"m"  { return(stem(1,"be","")); }              /* disprefer */
"'re"  { return(stem(3,"be","")); }             /* disprefer */
"r"  { return(stem(1,"be","")); }             /* disprefer */
"'ve"  { return(stem(3,"have","")); }
"ve"  { return(stem(2,"have","")); }
"v"  { return(stem(1,"have","")); }
"no"  { return(stem(2,"know","")); }

("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")); }
"topoi"  { return(stem(1,"s","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","")); }
"d"/_MD      { return(stem(1,"would","")); }
"'s"/_VBZ     { return(stem(2,"be","s")); }       /* disprefer */ /* could really be have */
"s"/_VBZ     { return(stem(1,"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 */
"'ll"/_MD      { return(stem(3,"will","")); }
"ll"/_MD      { return(stem(2,"will","")); }
"wilt"/_MD      { return(stem(4,"will","")); }
"n't"/_XX     { return(stem(3,"not","")); }       /* disprefer */
"n't"/_RB     { return(stem(3,"not","")); }      /* cdm add; disprefer */
"n"/_RB     { return(stem(1,"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}+/_NN[^P] { yybegin(noun); yypushback(yylength()); return(next()); }
{G}+/_NNP    { 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);
	                        logger.warning(String.format("Untokenizable: %s (U+%X, decimal: %d) - this may be because your text isn't using _ as a tag delimiter", yytext(), first, first));
		}
<> { return null; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy