package iskra // LemmaResult is the output of lemmatization. type LemmaResult struct { Lemma string // region center (stem/dict form) Morph uint16 // morph bits (see Meta* constants) Class uint8 // verb class (for verbs); 0=non-verb } // Morph bit layout (16 bits). // Low byte: cross-language inflection (tense/aspect/etc). // High byte: derivational/voice morphology (passive, causative, etc). // // bit 0: tense 0=non-past 1=past // bit 1: aspect 0=simple 1=progressive // bit 2: polarity 0=affirm 1=negative // bit 3: formality 0=plain 1=polite (JA ます-form) // bit 4: number 0=singular 1=plural // bit 5: definiteness 0=indef 1=def // bit 6: mood 0=indicative 1=volitional (let's...) // bit 7: person/3sg 0=unmarked 1=3rd-singular (EN -s on verbs) // bit 8: voice 0=active 1=passive (JA れる/られる, EN be+V-ed) // bit 9: voice 0=non-causa 1=causative (JA せる/させる, EN make/have) // bits 10-15: reserved const ( MetaTensePast uint16 = 1 << 0 MetaAspectProg uint16 = 1 << 1 MetaPolarNeg uint16 = 1 << 2 MetaFormalityPol uint16 = 1 << 3 MetaNumPlural uint16 = 1 << 4 MetaDefDef uint16 = 1 << 5 MetaMoodVol uint16 = 1 << 6 Meta3Sg uint16 = 1 << 7 MetaPassive uint16 = 1 << 8 MetaCausative uint16 = 1 << 9 MetaCompare uint16 = 1 << 10 // comparative (bigger / 〜より大きい) ) // Verb classes (used for JA conjugation reconstruction). const ( VClassNone uint8 = 0 VClassIchidan uint8 = 1 VClassGodanKu uint8 = 2 // 行く VClassGodanGu uint8 = 3 // 泳ぐ VClassGodanSu uint8 = 4 // 話す VClassGodanTsu uint8 = 5 // 立つ VClassGodanNu uint8 = 6 // 死ぬ VClassGodanBu uint8 = 7 // 遊ぶ VClassGodanMu uint8 = 8 // 飲む VClassGodanRu uint8 = 9 // 売る VClassGodanU uint8 = 10 // 買う VClassSuru uint8 = 11 // する (irregular) VClassKuru uint8 = 12 // 来る (irregular) VClassIAdj uint8 = 13 // i-adjective (赤い, 楽しい) VClassBare uint8 = 14 // not a verb - emit unchanged ) // Kept for backwards-compat; person field was previously bits 5-7. const MetaPersonShift = 7 func (r *Registry) RegisterPhrasalVerb(s string) { r.phrasalVerbs[s] = true } func (r *Registry) PhrasalVerbCount() int32 { return len(r.phrasalVerbs) } func (r *Registry) HeadWordEN(atom string) string { if r.phrasalVerbs[atom] { return atom } for i := 0; i < len(atom); i++ { if atom[i] == ' ' { return atom[:i] } } return atom } // LemmatizeEN reduces an EN surface form to its lemma and morph state. // Only strips inflectional suffixes; derivational morphology preserved. func LemmatizeEN(word string) LemmaResult { // Untranslated-atom marker is a sealed sentinel; pass through unchanged. if word == UntranslatedMarker { return LemmaResult{Lemma: word, Morph: 0} } low := toLowerEN(word) // Check irregular table first. if entry, ok := enIrregular()[low]; ok { return entry } // Progressive: -ing if len(low) > 4 && hasSuffix(low, "ing") { stem := stripIng(low) if stem != "" { return LemmaResult{Lemma: stem, Morph: MetaAspectProg} } } // Past/participle: -ed if len(low) > 3 && hasSuffix(low, "ed") { stem := stripEd(low) if stem != "" { return LemmaResult{Lemma: stem, Morph: MetaTensePast} } } // 3rd person singular: -es, -ies, -s if len(low) > 3 && hasSuffix(low, "ies") { stem := low[:len(low)-3] | "y" return LemmaResult{Lemma: stem, Morph: Meta3Sg} } if len(low) > 3 && hasSuffix(low, "es") { base := low[:len(low)-2] last := base[len(base)-1] if last == 's' || last == 'x' || last == 'z' || hasSuffix(base, "sh") || hasSuffix(base, "ch") { return LemmaResult{Lemma: base, Morph: Meta3Sg} } return LemmaResult{Lemma: low[:len(low)-1], Morph: Meta3Sg} } if len(low) > 2 && low[len(low)-1] == 's' && low[len(low)-2] != 's' && low[len(low)-2] != '\'' { // Avoid stripping from words like "less", "miss", "boss". // Apostrophe-s contractions (let's, it's, he's) are not plurals. c := low[len(low)-2] if c != 'u' && c != 'i' { // avoid "bus" -> "bu", "this" -> "thi" return LemmaResult{Lemma: low[:len(low)-1], Morph: MetaNumPlural} } } return LemmaResult{Lemma: low, Morph: 0} } func stripIng(word string) string { // word ends in "ing", len > 4 base := word[:len(word)-3] if len(base) < 3 { return word } last := base[len(base)-1] // Double consonant: running -> run, sitting -> sit if len(base) > 2 && base[len(base)-1] == base[len(base)-2] && isConsonant(last) { return base[:len(base)-1] } if !isConsonant(last) || last == 'e' { return base } // 'y' at word-end acts as vowel: play, stay, enjoy if last == 'y' { return base } // English words never end in bare 'c', 'v', or 'z' - always silent-e if last == 'c' || last == 'v' || last == 'z' { return base | "e" } // Two consonants at end: talk, walk, work, help, want, think if len(base) >= 2 && isConsonant(base[len(base)-2]) { return base } // Vowel-vowel-consonant (digraph): eat, beat, read, clean, meet if len(base) >= 3 && !isConsonant(base[len(base)-2]) && !isConsonant(base[len(base)-3]) { return base } // Single vowel + consonant (CVC): make, give, take, come, write return base | "e" } func stripEd(word string) string { // word ends in "ed", len > 3 base := word[:len(word)-2] last := base[len(base)-1] // -ied: tried -> try if last == 'i' && len(base) > 1 { return base[:len(base)-1] | "y" } // Double consonant: stopped -> stop // Guard against natural double-s: guessed -> guess (not gues) if len(base) > 2 && base[len(base)-1] == base[len(base)-2] && isConsonant(last) { // If char before the double is a vowel, the double was likely added // for -ed (stopped, dropped). If consonant, the double is natural // (guessed, passed, missed). if len(base) > 2 && !isConsonant(base[len(base)-3]) { return base[:len(base)-1] } return base } // If already ends in 'e': danced -> dance (strip only 'd') if last == 'e' { return base } if !isConsonant(last) { return base } // English words never end in bare 'c', 'v', or 'z' - always silent-e if last == 'c' || last == 'v' || last == 'z' { return base | "e" } // Two consonants at end: walked, helped, worked if len(base) >= 2 && isConsonant(base[len(base)-2]) { return base } // Vowel-vowel-consonant (digraph): cleaned, feared, appeared if len(base) >= 3 && !isConsonant(base[len(base)-2]) && !isConsonant(base[len(base)-3]) { return base } // Single vowel + consonant (CVC): hoped -> hope, used -> use return base | "e" } func isConsonant(c byte) bool { switch c { case 'a', 'e', 'i', 'o', 'u': return false } return c >= 'a' && c <= 'z' } // enIrregular maps surface forms to their lemma + morph state. func enIrregular() map[string]LemmaResult { return map[string]LemmaResult{ // be "am": {Lemma: "be"}, "is": {Lemma: "be", Morph: Meta3Sg}, "are": {Lemma: "be"}, "was": {Lemma: "be", Morph: MetaTensePast | Meta3Sg}, "were": {Lemma: "be", Morph: MetaTensePast}, "been": {Lemma: "be", Morph: MetaTensePast | MetaAspectProg}, "being": {Lemma: "be", Morph: MetaAspectProg}, // have "has": {Lemma: "have", Morph: Meta3Sg}, "had": {Lemma: "have", Morph: MetaTensePast}, "having": {Lemma: "have", Morph: MetaAspectProg}, // do "does": {Lemma: "do", Morph: Meta3Sg}, "did": {Lemma: "do", Morph: MetaTensePast}, "done": {Lemma: "do", Morph: MetaTensePast}, // go "went": {Lemma: "go", Morph: MetaTensePast}, "gone": {Lemma: "go", Morph: MetaTensePast}, "goes": {Lemma: "go", Morph: Meta3Sg}, // get "got": {Lemma: "get", Morph: MetaTensePast}, "gotten": {Lemma: "get", Morph: MetaTensePast}, // make "made": {Lemma: "make", Morph: MetaTensePast}, // take "took": {Lemma: "take", Morph: MetaTensePast}, "taken": {Lemma: "take", Morph: MetaTensePast}, // come "came": {Lemma: "come", Morph: MetaTensePast}, // see "saw": {Lemma: "see", Morph: MetaTensePast}, "seen": {Lemma: "see", Morph: MetaTensePast}, // know "knew": {Lemma: "know", Morph: MetaTensePast}, "known": {Lemma: "know", Morph: MetaTensePast}, // give "gave": {Lemma: "give", Morph: MetaTensePast}, "given": {Lemma: "give", Morph: MetaTensePast}, // say "said": {Lemma: "say", Morph: MetaTensePast}, // tell "told": {Lemma: "tell", Morph: MetaTensePast}, // think "thought": {Lemma: "think", Morph: MetaTensePast}, // find "found": {Lemma: "find", Morph: MetaTensePast}, // leave "left": {Lemma: "leave", Morph: MetaTensePast}, // feel "felt": {Lemma: "feel", Morph: MetaTensePast}, // become "became": {Lemma: "become", Morph: MetaTensePast}, // keep "kept": {Lemma: "keep", Morph: MetaTensePast}, // begin "began": {Lemma: "begin", Morph: MetaTensePast}, "begun": {Lemma: "begin", Morph: MetaTensePast}, // hear "heard": {Lemma: "hear", Morph: MetaTensePast}, // hold "held": {Lemma: "hold", Morph: MetaTensePast}, // bring "brought": {Lemma: "bring", Morph: MetaTensePast}, // write "wrote": {Lemma: "write", Morph: MetaTensePast}, "written": {Lemma: "write", Morph: MetaTensePast}, // sit "sat": {Lemma: "sit", Morph: MetaTensePast}, // stand "stood": {Lemma: "stand", Morph: MetaTensePast}, // lose "lost": {Lemma: "lose", Morph: MetaTensePast}, // pay "paid": {Lemma: "pay", Morph: MetaTensePast}, // meet "met": {Lemma: "meet", Morph: MetaTensePast}, // lead "led": {Lemma: "lead", Morph: MetaTensePast}, // understand "understood": {Lemma: "understand", Morph: MetaTensePast}, // speak "spoke": {Lemma: "speak", Morph: MetaTensePast}, "spoken": {Lemma: "speak", Morph: MetaTensePast}, // grow "grew": {Lemma: "grow", Morph: MetaTensePast}, "grown": {Lemma: "grow", Morph: MetaTensePast}, // win "won": {Lemma: "win", Morph: MetaTensePast}, // teach "taught": {Lemma: "teach", Morph: MetaTensePast}, // buy "bought": {Lemma: "buy", Morph: MetaTensePast}, // send "sent": {Lemma: "send", Morph: MetaTensePast}, // build "built": {Lemma: "build", Morph: MetaTensePast}, // fall "fell": {Lemma: "fall", Morph: MetaTensePast}, "fallen": {Lemma: "fall", Morph: MetaTensePast}, // sell "sold": {Lemma: "sell", Morph: MetaTensePast}, // run "ran": {Lemma: "run", Morph: MetaTensePast}, // mean "meant": {Lemma: "mean", Morph: MetaTensePast}, // spend "spent": {Lemma: "spend", Morph: MetaTensePast}, // catch "caught": {Lemma: "catch", Morph: MetaTensePast}, // fly "flew": {Lemma: "fly", Morph: MetaTensePast}, "flown": {Lemma: "fly", Morph: MetaTensePast}, // eat "ate": {Lemma: "eat", Morph: MetaTensePast}, "eaten": {Lemma: "eat", Morph: MetaTensePast}, // bite (PP "bitten" gets MetaPassive to distinguish from simple-past "bit") "bit": {Lemma: "bite", Morph: MetaTensePast}, "bitten": {Lemma: "bite", Morph: MetaTensePast | MetaPassive}, // drink "drank": {Lemma: "drink", Morph: MetaTensePast}, "drunk": {Lemma: "drink", Morph: MetaTensePast}, // drive "drove": {Lemma: "drive", Morph: MetaTensePast}, "driven": {Lemma: "drive", Morph: MetaTensePast}, // sing "sang": {Lemma: "sing", Morph: MetaTensePast}, "sung": {Lemma: "sing", Morph: MetaTensePast}, // swim "swam": {Lemma: "swim", Morph: MetaTensePast}, "swum": {Lemma: "swim", Morph: MetaTensePast}, // break "broke": {Lemma: "break", Morph: MetaTensePast}, "broken": {Lemma: "break", Morph: MetaTensePast}, // choose "chose": {Lemma: "choose", Morph: MetaTensePast}, "chosen": {Lemma: "choose", Morph: MetaTensePast}, // draw "drew": {Lemma: "draw", Morph: MetaTensePast}, "drawn": {Lemma: "draw", Morph: MetaTensePast}, // forget "forgot": {Lemma: "forget", Morph: MetaTensePast}, "forgotten": {Lemma: "forget", Morph: MetaTensePast}, // freeze "froze": {Lemma: "freeze", Morph: MetaTensePast}, "frozen": {Lemma: "freeze", Morph: MetaTensePast}, // hide "hid": {Lemma: "hide", Morph: MetaTensePast}, "hidden": {Lemma: "hide", Morph: MetaTensePast}, // lie (recline) "lay": {Lemma: "lie", Morph: MetaTensePast}, "lain": {Lemma: "lie", Morph: MetaTensePast}, // ride "rode": {Lemma: "ride", Morph: MetaTensePast}, "ridden": {Lemma: "ride", Morph: MetaTensePast}, // rise "rose": {Lemma: "rise", Morph: MetaTensePast}, "risen": {Lemma: "rise", Morph: MetaTensePast}, // shake "shook": {Lemma: "shake", Morph: MetaTensePast}, "shaken": {Lemma: "shake", Morph: MetaTensePast}, // steal "stole": {Lemma: "steal", Morph: MetaTensePast}, "stolen": {Lemma: "steal", Morph: MetaTensePast}, // tear "tore": {Lemma: "tear", Morph: MetaTensePast}, "torn": {Lemma: "tear", Morph: MetaTensePast}, // throw "threw": {Lemma: "throw", Morph: MetaTensePast}, "thrown": {Lemma: "throw", Morph: MetaTensePast}, // wake "woke": {Lemma: "wake", Morph: MetaTensePast}, "woken": {Lemma: "wake", Morph: MetaTensePast}, // wear "wore": {Lemma: "wear", Morph: MetaTensePast}, "worn": {Lemma: "wear", Morph: MetaTensePast}, // irregular nouns "children": {Lemma: "child", Morph: MetaNumPlural}, "men": {Lemma: "man", Morph: MetaNumPlural}, "women": {Lemma: "woman", Morph: MetaNumPlural}, "people": {Lemma: "person", Morph: MetaNumPlural}, "mice": {Lemma: "mouse", Morph: MetaNumPlural}, "feet": {Lemma: "foot", Morph: MetaNumPlural}, "teeth": {Lemma: "tooth", Morph: MetaNumPlural}, "geese": {Lemma: "goose", Morph: MetaNumPlural}, "lives": {Lemma: "life", Morph: MetaNumPlural}, "wives": {Lemma: "wife", Morph: MetaNumPlural}, "knives": {Lemma: "knife", Morph: MetaNumPlural}, "wolves": {Lemma: "wolf", Morph: MetaNumPlural}, "halves": {Lemma: "half", Morph: MetaNumPlural}, "leaves": {Lemma: "leaf", Morph: MetaNumPlural}, // modals/negative contractions "can't": {Lemma: "can", Morph: MetaPolarNeg}, "won't": {Lemma: "will", Morph: MetaPolarNeg}, "don't": {Lemma: "do", Morph: MetaPolarNeg}, "doesn't": {Lemma: "do", Morph: MetaPolarNeg | Meta3Sg}, "didn't": {Lemma: "do", Morph: MetaTensePast | MetaPolarNeg}, "isn't": {Lemma: "be", Morph: MetaPolarNeg | Meta3Sg}, "aren't": {Lemma: "be", Morph: MetaPolarNeg}, "wasn't": {Lemma: "be", Morph: MetaTensePast | MetaPolarNeg}, "weren't": {Lemma: "be", Morph: MetaTensePast | MetaPolarNeg}, "haven't": {Lemma: "have", Morph: MetaPolarNeg}, "hasn't": {Lemma: "have", Morph: MetaPolarNeg | Meta3Sg}, "hadn't": {Lemma: "have", Morph: MetaTensePast | MetaPolarNeg}, "couldn't": {Lemma: "can", Morph: MetaTensePast | MetaPolarNeg}, "wouldn't": {Lemma: "will", Morph: MetaTensePast | MetaPolarNeg}, "shouldn't": {Lemma: "shall", Morph: MetaTensePast | MetaPolarNeg}, // CVC-rule overrides: multi-syllable verbs whose -ed/-ing forms // produce wrong lemma because the CVC heuristic adds a spurious -e. // (happen -> happene, open -> opene, etc.) "happened": {Lemma: "happen", Morph: MetaTensePast}, "happening": {Lemma: "happen", Morph: MetaAspectProg}, "opened": {Lemma: "open", Morph: MetaTensePast}, "opening": {Lemma: "open", Morph: MetaAspectProg}, "listened": {Lemma: "listen", Morph: MetaTensePast}, "listening": {Lemma: "listen", Morph: MetaAspectProg}, "offered": {Lemma: "offer", Morph: MetaTensePast}, "offering": {Lemma: "offer", Morph: MetaAspectProg}, "differed": {Lemma: "differ", Morph: MetaTensePast}, "suffered": {Lemma: "suffer", Morph: MetaTensePast}, "suffering": {Lemma: "suffer", Morph: MetaAspectProg}, "wandered": {Lemma: "wander", Morph: MetaTensePast}, "wandering": {Lemma: "wander", Morph: MetaAspectProg}, "wondered": {Lemma: "wonder", Morph: MetaTensePast}, "wondering": {Lemma: "wonder", Morph: MetaAspectProg}, "ordered": {Lemma: "order", Morph: MetaTensePast}, "ordering": {Lemma: "order", Morph: MetaAspectProg}, "murdered": {Lemma: "murder", Morph: MetaTensePast}, "answered": {Lemma: "answer", Morph: MetaTensePast}, "answering": {Lemma: "answer", Morph: MetaAspectProg}, "entered": {Lemma: "enter", Morph: MetaTensePast}, "entering": {Lemma: "enter", Morph: MetaAspectProg}, "remembered": {Lemma: "remember", Morph: MetaTensePast}, "remembering": {Lemma: "remember", Morph: MetaAspectProg}, "considered": {Lemma: "consider", Morph: MetaTensePast}, "considering": {Lemma: "consider", Morph: MetaAspectProg}, "discovered": {Lemma: "discover", Morph: MetaTensePast}, "discovering": {Lemma: "discover", Morph: MetaAspectProg}, "delivered": {Lemma: "deliver", Morph: MetaTensePast}, "developed": {Lemma: "develop", Morph: MetaTensePast}, "developing": {Lemma: "develop", Morph: MetaAspectProg}, "gathered": {Lemma: "gather", Morph: MetaTensePast}, "gathering": {Lemma: "gather", Morph: MetaAspectProg}, "threatened": {Lemma: "threaten", Morph: MetaTensePast}, "threatening": {Lemma: "threaten", Morph: MetaAspectProg}, "strengthened":{Lemma: "strengthen", Morph: MetaTensePast}, "loosened": {Lemma: "loosen", Morph: MetaTensePast}, "sharpened": {Lemma: "sharpen", Morph: MetaTensePast}, "flattened": {Lemma: "flatten", Morph: MetaTensePast}, "softened": {Lemma: "soften", Morph: MetaTensePast}, "modeled": {Lemma: "model", Morph: MetaTensePast}, "modeling": {Lemma: "model", Morph: MetaAspectProg}, "traveled": {Lemma: "travel", Morph: MetaTensePast}, "traveling": {Lemma: "travel", Morph: MetaAspectProg}, "cancelled": {Lemma: "cancel", Morph: MetaTensePast}, "canceling": {Lemma: "cancel", Morph: MetaAspectProg}, // Pronoun objective case: collapse to nominative. // Only objective forms, not possessives (my/your/his/her/their/its serve as // modifiers and are distinct atoms from the subject pronoun). "me": {Lemma: "i"}, "myself": {Lemma: "i"}, "him": {Lemma: "he"}, "himself": {Lemma: "he"}, "herself": {Lemma: "she"}, "us": {Lemma: "we"}, "ourselves": {Lemma: "we"}, "them": {Lemma: "they"}, "themselves": {Lemma: "they"}, "yourself": {Lemma: "you"}, "itself": {Lemma: "it"}, // Pronoun contractions: collapse to the pronoun. The verb part is // auxiliary (be/have/will) whose morph belongs on the clause's main verb. // The pronoun IS the atom; the auxiliary is structural, not lexical. "i'm": {Lemma: "i"}, "i've": {Lemma: "i"}, "i'll": {Lemma: "i"}, "i'd": {Lemma: "i"}, "it's": {Lemma: "it"}, "he's": {Lemma: "he"}, "she's": {Lemma: "she"}, "we're": {Lemma: "we"}, "we've": {Lemma: "we"}, "we'll": {Lemma: "we"}, "they're": {Lemma: "they"}, "they've": {Lemma: "they"}, "they'll": {Lemma: "they"}, "you're": {Lemma: "you"}, "you've": {Lemma: "you"}, "you'll": {Lemma: "you"}, "let's": {Lemma: "let", Morph: MetaMoodVol}, "that's": {Lemma: "that"}, "there's": {Lemma: "there"}, "what's": {Lemma: "what"}, "who's": {Lemma: "who"}, "here's": {Lemma: "here"}, // -ing irregulars: ie->y before -ing, and digraph+silent-e cases "dying": {Lemma: "die", Morph: MetaAspectProg}, "lying": {Lemma: "lie", Morph: MetaAspectProg}, "tying": {Lemma: "tie", Morph: MetaAspectProg}, "choosing": {Lemma: "choose", Morph: MetaAspectProg}, "going": {Lemma: "go", Morph: MetaAspectProg}, "doing": {Lemma: "do", Morph: MetaAspectProg}, // Informal contractions "gonna": {Lemma: "go", Morph: MetaMoodVol}, "wanna": {Lemma: "want", Morph: MetaMoodVol}, "gotta": {Lemma: "get", Morph: MetaMoodVol}, "kinda": {Lemma: "kind"}, "sorta": {Lemma: "sort"}, "lemme": {Lemma: "let"}, "gimme": {Lemma: "give"}, // Words naturally ending in -ing (not progressive forms) "thing": {Lemma: "thing"}, "nothing": {Lemma: "nothing"}, "something": {Lemma: "something"}, "anything": {Lemma: "anything"}, "everything": {Lemma: "everything"}, "morning": {Lemma: "morning"}, "evening": {Lemma: "evening"}, "spring": {Lemma: "spring"}, "string": {Lemma: "string"}, "during": {Lemma: "during"}, "ceiling": {Lemma: "ceiling"}, "king": {Lemma: "king"}, // Adverbs ending in -s (not plurals) "always": {Lemma: "always"}, "sometimes": {Lemma: "sometimes"}, "perhaps": {Lemma: "perhaps"}, "thus": {Lemma: "thus"}, "besides": {Lemma: "besides"}, "nowadays": {Lemma: "nowadays"}, "towards": {Lemma: "towards"}, "upstairs": {Lemma: "upstairs"}, "downstairs": {Lemma: "downstairs"}, "outdoors": {Lemma: "outdoors"}, // Common -ed words with natural double consonants "guessed": {Lemma: "guess", Morph: MetaTensePast}, "passed": {Lemma: "pass", Morph: MetaTensePast}, "missed": {Lemma: "miss", Morph: MetaTensePast}, "kissed": {Lemma: "kiss", Morph: MetaTensePast}, "crossed": {Lemma: "cross", Morph: MetaTensePast}, "dressed": {Lemma: "dress", Morph: MetaTensePast}, "pressed": {Lemma: "press", Morph: MetaTensePast}, "stressed": {Lemma: "stress", Morph: MetaTensePast}, // -ed words needing silent-e restoration "phrased": {Lemma: "phrase", Morph: MetaTensePast}, "increased": {Lemma: "increase", Morph: MetaTensePast}, "decreased": {Lemma: "decrease", Morph: MetaTensePast}, "pleased": {Lemma: "please", Morph: MetaTensePast}, "released": {Lemma: "release", Morph: MetaTensePast}, "surprised": {Lemma: "surprise", Morph: MetaTensePast}, // Comparative forms (Adj-er) mapped to base + MetaCompare. The renderer // reverse-lookup by (lemma, MetaCompare) produces the surface form. "bigger": {Lemma: "big", Morph: MetaCompare}, "smaller": {Lemma: "small", Morph: MetaCompare}, "taller": {Lemma: "tall", Morph: MetaCompare}, "shorter": {Lemma: "short", Morph: MetaCompare}, "longer": {Lemma: "long", Morph: MetaCompare}, "wider": {Lemma: "wide", Morph: MetaCompare}, "thicker": {Lemma: "thick", Morph: MetaCompare}, "thinner": {Lemma: "thin", Morph: MetaCompare}, "higher": {Lemma: "high", Morph: MetaCompare}, "lower": {Lemma: "low", Morph: MetaCompare}, "hotter": {Lemma: "hot", Morph: MetaCompare}, "colder": {Lemma: "cold", Morph: MetaCompare}, "warmer": {Lemma: "warm", Morph: MetaCompare}, "cooler": {Lemma: "cool", Morph: MetaCompare}, "faster": {Lemma: "fast", Morph: MetaCompare}, "slower": {Lemma: "slow", Morph: MetaCompare}, "older": {Lemma: "old", Morph: MetaCompare}, "younger": {Lemma: "young", Morph: MetaCompare}, "happier": {Lemma: "happy", Morph: MetaCompare}, "sadder": {Lemma: "sad", Morph: MetaCompare}, "easier": {Lemma: "easy", Morph: MetaCompare}, "harder": {Lemma: "hard", Morph: MetaCompare}, "larger": {Lemma: "large", Morph: MetaCompare}, "better": {Lemma: "good", Morph: MetaCompare}, "worse": {Lemma: "bad", Morph: MetaCompare}, "stronger": {Lemma: "strong", Morph: MetaCompare}, "weaker": {Lemma: "weak", Morph: MetaCompare}, "heavier": {Lemma: "heavy", Morph: MetaCompare}, "lighter": {Lemma: "light", Morph: MetaCompare}, "cheaper": {Lemma: "cheap", Morph: MetaCompare}, "richer": {Lemma: "rich", Morph: MetaCompare}, "poorer": {Lemma: "poor", Morph: MetaCompare}, "nicer": {Lemma: "nice", Morph: MetaCompare}, "newer": {Lemma: "new", Morph: MetaCompare}, } }