From 55246252c2db45dbd16111e9b2c13734934591ab Mon Sep 17 00:00:00 2001 From: upstream Date: Wed, 23 Sep 2026 12:33:23 +0200 Subject: [PATCH] Upstream spencermountain/compromise state of the touched files before 432068a0f8 --- .../transform/verbs/conjugate/index.js | 61 +++ tests/three/verbs/toPastParticiple.test.js | 360 ++++++++++++++++++ 2 files changed, 421 insertions(+) create mode 100644 src/2-two/preTagger/methods/transform/verbs/conjugate/index.js create mode 100644 tests/three/verbs/toPastParticiple.test.js diff --git a/src/2-two/preTagger/methods/transform/verbs/conjugate/index.js b/src/2-two/preTagger/methods/transform/verbs/conjugate/index.js new file mode 100644 index 0000000..7a265fc --- /dev/null +++ b/src/2-two/preTagger/methods/transform/verbs/conjugate/index.js @@ -0,0 +1,61 @@ +// import { toPast, toPresent, toGerund, toParticiple } from '../../../../model/models/index.js' +import { convert } from 'suffix-thumb' + +// pull-apart phrasal verb 'fall over' +const parse = (inf) => { + if (/ /.test(inf)) { + return inf.split(/ /) + } + return [inf, ''] +} + +//we run this on every verb in the lexicon, so please keep it fast +//we assume the input word is a proper infinitive +const conjugate = function (inf, model) { + const { toPast, toPresent, toGerund, toParticiple } = model.two.models + // ad-hoc Copula response + if (inf === 'be') { + return { + Infinitive: inf, + Gerund: 'being', + PastTense: 'was', + PresentTense: 'is', + } + } + const [str, particle] = parse(inf) + const found = { + Infinitive: str, + PastTense: convert(str, toPast), + PresentTense: convert(str, toPresent), + Gerund: convert(str, toGerund), + FutureTense: 'will ' + str + } + // add past-participle if it's interesting + // drive -> driven (not drove) + let pastPrt = convert(str, toParticiple) + if (pastPrt !== inf && pastPrt !== found.PastTense) { + // ensure it's a known participle + const lex = model.one.lexicon || {} + if (lex[pastPrt] === 'Participle' || lex[pastPrt] === 'Adjective') { + // one exception + if (inf === 'play') { + pastPrt = 'played' + } + found.Participle = pastPrt + } + } + // put phrasal-verbs back together again + if (particle) { + Object.keys(found).forEach(k => { + found[k] += ' ' + particle + }) + } + return found +} + + +export default conjugate + +// console.log(toPresent.rules.y) +// console.log(convert('buy', toPresent)) + diff --git a/tests/three/verbs/toPastParticiple.test.js b/tests/three/verbs/toPastParticiple.test.js new file mode 100644 index 0000000..bb7e1dc --- /dev/null +++ b/tests/three/verbs/toPastParticiple.test.js @@ -0,0 +1,360 @@ +import test from 'tape' +import nlp from '../_lib.js' +const here = '[three/verb-toPastParticiple] ' + +test('toPastParticiple:', function (t) { + const arr = [ + [`I eat breakfast every morning.`, `I have eaten breakfast every morning.`], + [`She reads a book before bed.`, `She has read a book before bed.`], + [`He teaches math to high school students.`, `He has taught math to high school students.`], + [`They walk their dog in the park.`, `They have walked their dog in the park.`], + [`We watch a movie on Friday nights.`, `We have watched a movie on Friday nights.`], + [`I eat pizza.`, `I have eaten pizza.`], + [`He reads books.`, `He has read books.`], + [`She sings songs.`, `She has sung songs.`], + [`We write letters.`, `We have written letters.`], + [`You speak Spanish.`, `You have spoken Spanish.`], + // [`He swims laps.`, `He has swum laps.`], + [`They climb mountains.`, `They have climbed mountains.`], + [`She dances ballet.`, `She has danced ballet.`], + [`We paint pictures.`, `We have painted pictures.`], + [`I play soccer.`, `I have played soccer.`], + [`They study history.`, `They have studied history.`], + [`He cooks dinner.`, `He has cooked dinner.`], + [`She designs websites.`, `She has designed websites.`], + [`We watch movies.`, `We have watched movies.`], + [`You listen to music.`, `You have listened to music.`], + [`They build houses.`, `They have built houses.`], + [`I plant flowers.`, `I have planted flowers.`], + [`He fixes cars.`, `He has fixed cars.`], + [`She teaches math.`, `She has taught math.`], + [`We clean the house.`, `We have cleaned the house.`], + [`You drive a car.`, `You have driven a car.`], + [`They ride bikes.`, `They have ridden bikes.`], + [`I take photos.`, `I have taken photos.`], + [`Spencer does yoga.`, `Spencer has done yoga.`], + [`We sing in the choir.`, `We have sung in the choir.`], + [`You draw pictures.`, `You have drawn pictures.`], + [`They make cookies.`, `They have made cookies.`], + [`He surfs the internet.`, `He has surfed the internet.`], + [`She plays the guitar.`, `She has played the guitar.`], + [`We travel the world.`, `We have travelled the world.`], + [`You speak to friends.`, `You have spoken to friends.`], + [`They fish in the river.`, `They have fished in the river.`], + [`I write stories.`, `I have written stories.`], + [`He takes a shower.`, `He has taken a shower.`], + [`She sews clothes.`, `She has sewn clothes.`], + [`We play board games.`, `We have played board games.`], + [`You exercise at the gym.`, `You have exercised at the gym.`], + [`They fly airplanes.`, `They have flown airplanes.`], + [`He studies science.`, `He has studied science.`], + ["I sing in the shower.", "I have sung in the shower."], + ["The sun shines brightly.", "The sun has shone brightly."], + ["He eats a lot of vegetables.", "He has eaten a lot of vegetables."], + ["We write a letter to our grandparents.", "We have written a letter to our grandparents."], + ["The dog barks loudly.", "The dog has barked loudly."], + ["They play soccer every weekend.", "They have played soccer every weekend."], + ["She speaks Spanish fluently.", "She has spoken Spanish fluently."], + ["He teaches math at the local college.", "He has taught math at the local college."], + ["The tree grows tall.", "The tree has grown tall."], + ["The bird chirps early in the morning.", "The bird has chirped early in the morning."], + ["The flower smells sweet.", "The flower has smelled sweet."], + ["I play the guitar.", "I have played the guitar."], + ["The wind blows gently.", "The wind has blown gently."], + // ["the tree will grow", "the tree has grown"], + ["the tree grows quickly", "the tree has grown quickly"], + ["She will have eaten", "She has eaten"], + ["They will have finished", "They have finished"], + ["He will have written", "He has written"], + ["We will have seen", "We have seen"], + ["You will have spoken", "You have spoken"], + + ["She reads a book every night.", "She has read a book every night."], + // ["I always forget my keys.", "I have always forgotten my keys"], + ["She paints beautiful pictures.", "She has painted beautiful pictures."], + ["He drives a fast car.", "He has driven a fast car."], + ["I clean the house every weekend.", "I have cleaned the house every weekend."], + ["She dances gracefully.", "She has danced gracefully."], + ["He flies to New York for business.", "He has flown to New York for business."], + ["We swim in the pool on hot days.", "We have swum in the pool on hot days."], + // ["They run a marathon every year.", "They have run a marathon every year."], + ["She sews her own clothes", "She has sewn her own clothes"], + ["He builds houses for a living.", "He has built houses for a living."], + ["We drink coffee every morning.", "We have drunk coffee every morning."], + ["They watch movies on Friday nights.", "They have watched movies on Friday nights."], + ["She designs jewelry for a living.", "She has designed jewelry for a living."], + ["He studies biology in college.", "He has studied biology in college."], + // ["We take walks in the park.", "We have taken walks in the park."], + // ["They listen to music on their way to work.", "They have listened to music on their way to work."], + ["She cooks dinner for her family", "She has cooked dinner for her family"], + + + ['i take', 'i have taken'], + ['i write', 'i have written'], + ['i make', 'i have made'], + ['i agree', 'i have agreed'], + ['i catch', 'i have caught'], + ['i do', 'i have done'], + ['i break', 'i have broken'], + ['i forget', 'i have forgotten'], + ['i move', 'i have moved'], + ['i understand', 'i have understood'], + ['i open', 'i have opened'], + ['i fill', 'i have filled'], + ['i speak', 'i have spoken'], + ['i put', 'i have put'], + ['i walk', 'i have walked'], + ['i meet', 'i have met'], + ['i fly', 'i have flown'], + ['i keep', 'i have kept'], + ['i show', 'i have shown'], + ['i hear', 'i have heard'], + ['i trust', 'i have trusted'], + ['i turn', 'i have turned'], + ['i fall', 'i have fallen'], + ['i find', 'i have found'], + ['i give', 'i have given'], + ['i cause', 'i have caused'], + ['i stand', 'i have stood'], + ['i sit', 'i have sat'], + ['i leave', 'i have left'], + ['i stop', 'i have stopped'], + ['i plan', 'i have planned'], + ['i live', 'i have lived'], + ['i build', 'i have built'], + ['i suggest', 'i have suggested'], + ['i hold', 'i have held'], + ['i look', 'i have looked'], + ['i lie', 'i have lied'], + ['i hope', 'i have hoped'], + ['i bring', 'i have brought'], + ['i ask', 'i have asked'], + ['i seem', 'i have seemed'], + ['i include', 'i have included'], + ['i understand', 'i have understood'], + ['i consider', 'i have considered'], + ['i realize', 'i have realized'], + ['i follow', 'i have followed'], + ['i bring', 'i have brought'], + ['i think', 'i have thought'], + ['i explain', 'i have explained'], + ['i explain', 'i have explained'], + ['i point', 'i have pointed'], + ['i choose', 'i have chosen'], + ['i play', 'i have played'], + ['i try', 'i have tried'], + ['i study', 'i have studied'], + // ['i wear', 'i have worn'], + ['i act', 'i have acted'], + ['i help', 'i have helped'], + ['i remember', 'i have remembered'], + ['i call', 'i have called'], + ['i remove', 'i have removed'], + ['i accept', 'i have accepted'], + ['i prepare', 'i have prepared'], + ['i prepare', 'i have prepared'], + ['i support', 'i have supported'], + ['i increase', 'i have increased'], + ['i mean', 'i have meant'], + ['i meet', 'i have met'], + ['i add', 'i have added'], + ['i lose', 'i have lost'], + ['i appear', 'i have appeared'], + ['i develop', 'i have developed'], + ['i reach', 'i have reached'], + ['i use', 'i have used'], + ['i like', 'i have liked'], + ['i choose', 'i have chosen'], + ['i continue', 'i have continued'], + ['i create', 'i have created'], + ['i deal', 'i have dealt'], + ['i cause', 'i have caused'], + ['i set', 'i have set'], + ['i allow', 'i have allowed'], + ['i notice', 'i have noticed'], + ['i take', 'i have taken'], + ['i save', 'i have saved'], + ['i spend', 'i have spent'], + ['i suffer', 'i have suffered'], + ['i provide', 'i have provided'], + ['i reach', 'i have reached'], + ['i contain', 'i have contained'], + ['i include', 'i have included'], + ['i finish', 'i have finished'], + ['i face', 'i have faced'], + ['i explain', 'i have explained'], + ['i mention', 'i have mentioned'], + ['i form', 'i have formed'], + ['i examine', 'i have examined'], + ['i consider', 'i have considered'], + ['i cost', 'i have cost'], + ['i determine', 'i have determined'], + ['i require', 'i have required'], + ['i exist', 'i have existed'], + ['i remain', 'i have remained'], + ['i involve', 'i have involved'], + ['i reduce', 'i have reduced'], + ['i establish', 'i have established'], + ['i protect', 'i have protected'], + ['i cause', 'i have caused'], + ['i represent', 'i have represented'], + ['i indicate', 'i have indicated'], + ['i determine', 'i have determined'], + ['i apply', 'i have applied'], + ['i increase', 'i have increased'], + ['i base', 'i have based'], + ['i answer', 'i have answered'], + ['i cover', 'i have covered'], + ['i show', 'i have shown'], + ['i involve', 'i have involved'], + ['i notice', 'i have noticed'], + ['i understand', 'i have understood'], + ['i pass', 'i have passed'], + ['i permit', 'i have permitted'], + ['i prefer', 'i have preferred'], + ['i contain', 'i have contained'], + ['i represent', 'i have represented'], + ['i change', 'i have changed'], + ['i recognize', 'i have recognized'], + ['i refer', 'i have referred'], + ['i decide', 'i have decided'], + ['i estimate', 'i have estimated'], + ['i discuss', 'i have discussed'], + ['i observe', 'i have observed'], + ['i receive', 'i have received'], + ['i include', 'i have included'], + ['i consider', 'i have considered'], + ['i affect', 'i have affected'], + ['i agree', 'i have agreed'], + ['i understand', 'i have understood'], + ['i happen', 'i have happened'], + ['i produce', 'i have produced'], + ['i perform', 'i have performed'], + ['i connect', 'i have connected'], + ['i resist', 'i have resisted'], + ['i consider', 'i have considered'], + ['i regard', 'i have regarded'], + ['i occur', 'i have occurred'], + ['i relate', 'i have related'], + ] + arr.forEach(a => { + const doc = nlp(a[0]) + doc.verbs().toPastParticiple() + t.equal(doc.text(), a[1], here + ' ' + a[0]) + }) + t.end() +}) + + +test('past vs past-participle:', function (t) { + const arr = [ + ['arise', 'arose', 'arisen'], + ['awake', 'awoke', 'awoken'], + // ['bear', 'bore', 'born'], + ['beat', 'beat', 'beaten'], + // ['become', 'became', 'become'], + ['bet', 'bet', 'bet'], + ['bid', 'bid', 'bid'], + ['bind', 'bound', 'bound'], + ['bleed', 'bled', 'bled'], + ['blow', 'blew', 'blown'], + ['break', 'broke', 'broken'], + ['breed', 'bred', 'bred'], + ['bring', 'brought', 'brought'], + ['build', 'built', 'built'], + ['burst', 'burst', 'burst'], + ['catch', 'caught', 'caught'], + ['choose', 'chose', 'chosen'], + ['cling', 'clung', 'clung'], + // ['come', 'came', 'come'], + ['cost', 'cost', 'cost'], + ['creep', 'crept', 'crept'], + ['deal', 'dealt', 'dealt'], + ['dig', 'dug', 'dug'], + ['do', 'did', 'done'], + ['draw', 'drew', 'drawn'], + ['drink', 'drank', 'drunk'], + ['drive', 'drove', 'driven'], + ['eat', 'ate', 'eaten'], + ['fall', 'fell', 'fallen'], + ['feed', 'fed', 'fed'], + ['fight', 'fought', 'fought'], + ['find', 'found', 'found'], + ['flee', 'fled', 'fled'], + ['fling', 'flung', 'flung'], + ['fly', 'flew', 'flown'], + ['forget', 'forgot', 'forgotten'], + ['forgive', 'forgave', 'forgiven'], + ['forsake', 'forsook', 'forsaken'], + // ['freeze', 'froze', 'frozen'], + ['give', 'gave', 'given'], + ['go', 'went', 'gone'], + ['grow', 'grew', 'grown'], + ['hang', 'hung', 'hung'], + ['have', 'had', 'had'], + ['hide', 'hid', 'hidden'], + ['hold', 'held', 'held'], + ['keep', 'kept', 'kept'], + ['know', 'knew', 'known'], + ['leave', 'left', 'left'], + ['lend', 'lent', 'lent'], + ['light', 'lit', 'lit'], + ['make', 'made', 'made'], + ['meet', 'met', 'met'], + ['prove', 'proved', 'proven'], + ['read', 'read', 'read'], + ['ride', 'rode', 'ridden'], + ['ring', 'rang', 'rung'], + ['rise', 'rose', 'risen'], + // ['run', 'ran', 'run'], + ['say', 'said', 'said'], + ['see', 'saw', 'seen'], + ['seek', 'sought', 'sought'], + ['set', 'set', 'set'], + ['shake', 'shook', 'shaken'], + ['shine', 'shone', 'shone'], + ['shoot', 'shot', 'shot'], + ['show', 'showed', 'shown'], + ['sing', 'sang', 'sung'], + ['sink', 'sank', 'sunk'], + ['sit', 'sat', 'sat'], + ['sleep', 'slept', 'slept'], + ['speak', 'spoke', 'spoken'], + ['spend', 'spent', 'spent'], + ['spread', 'spread', 'spread'], + ['stand', 'stood', 'stood'], + ['steal', 'stole', 'stolen'], + ['stick', 'stuck', 'stuck'], + ['strike', 'struck', 'struck'], + ['swear', 'swore', 'sworn'], + ['swim', 'swam', 'swum'], + ['take', 'took', 'taken'], + ['teach', 'taught', 'taught'], + ['tear', 'tore', 'torn'], + ['tell', 'told', 'told'], + ['think', 'thought', 'thought'], + ['throw', 'threw', 'thrown'], + ['understand', 'understood', 'understood'], + ['wake', 'woke', 'woken'], + // ['wear', 'wore', 'worn'], + ['win', 'won', 'won'], + ['write', 'wrote', 'written'], + ] + arr.forEach(a => { + const [present, past, participle] = a + const doc = nlp(present).tag('#Infinitive') + const obj = doc.verbs().conjugate()[0] || {} + if (present === 'wake') { + t.ok(['woke', 'waked'].includes(obj.PastTense), here + ' wake: valid past tense') + } else { + t.equal(obj.PastTense, past, here + ' ' + a[0]) + } + + let prt = obj.Participle || obj.PastTense || '' + prt = prt.replace(/^had /, '') + t.equal(prt, participle, here + ' ' + a[0]) + }) + t.end() +}) + +