Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
edu.stanford.nlp.process.Morpha.flex Maven / Gradle / Ivy
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 java.util.logging.Logger;
import edu.stanford.nlp.util.Generics;
%%
%class Morpha
%unicode
%function next
%type String
%caseless
%{
private static final Logger LOGGER = Logger.getLogger(Morphology.class.getName());
/** 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")); }