de-compromise 0.0.10 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/builds/de-compromise.cjs +2354 -1687
- package/builds/de-compromise.min.js +1 -1
- package/builds/de-compromise.mjs +1 -1
- package/package.json +21 -14
- package/src/01-one/lexicon/_data.js +32 -0
- package/src/01-one/lexicon/compute/root.js +55 -0
- package/src/01-one/lexicon/lexicon.js +95 -0
- package/src/01-one/lexicon/methods/_data.js +193 -0
- package/src/01-one/lexicon/methods/adjectives/_test-back.js +29 -0
- package/src/01-one/lexicon/methods/adjectives/_test.js +49 -0
- package/src/01-one/lexicon/methods/adjectives/inflect.js +27 -0
- package/src/01-one/lexicon/methods/adjectives/model.js +126 -0
- package/src/01-one/lexicon/methods/adjectives/new/adjective.js +8 -0
- package/src/01-one/lexicon/methods/adjectives/new/comparative.js +7 -0
- package/src/01-one/lexicon/methods/adjectives/new/superlative.js +159 -0
- package/src/01-one/lexicon/methods/adjectives/toRoot.js +47 -0
- package/src/01-one/lexicon/methods/index.js +56 -0
- package/src/01-one/lexicon/methods/models.js +10 -0
- package/src/01-one/lexicon/methods/nouns/_test-back.js +45 -0
- package/src/01-one/lexicon/methods/nouns/new.js +56 -0
- package/src/01-one/lexicon/methods/nouns/toPlural.js +49 -0
- package/src/01-one/lexicon/methods/nouns/toSingular.js +46 -0
- package/src/01-one/lexicon/methods/verbs/conjugate.js +87 -0
- package/src/01-one/lexicon/methods/verbs/custom/_test-from.js +53 -0
- package/src/01-one/lexicon/methods/verbs/custom/_test-to.js +50 -0
- package/src/01-one/lexicon/methods/verbs/custom/fromPastParticiple.js +37 -0
- package/src/01-one/lexicon/methods/verbs/custom/rules.js +182 -0
- package/src/01-one/lexicon/methods/verbs/custom/toPastParticiple.js +54 -0
- package/src/01-one/lexicon/methods/verbs/irregulars.js +202 -0
- package/src/01-one/lexicon/methods/verbs/toRoot.js +55 -0
- package/src/01-one/lexicon/misc.js +78 -0
- package/src/01-one/lexicon/plugin.js +14 -0
- package/src/01-one/splitter/build.js +20 -0
- package/src/01-one/splitter/compute/splitter.js +54 -0
- package/src/01-one/splitter/model/index.js +20 -0
- package/src/01-one/splitter/plugin.js +10 -0
- package/src/01-one/splitter/trie.js +40 -0
- package/src/01-one/tagset/plugin.js +11 -0
- package/src/01-one/tagset/tags/dates.js +45 -0
- package/src/01-one/tagset/tags/misc.js +70 -0
- package/src/01-one/tagset/tags/nouns.js +116 -0
- package/src/01-one/tagset/tags/values.js +47 -0
- package/src/01-one/tagset/tags/verbs.js +64 -0
- package/src/01-one/tokenizer/contractions.js +40 -0
- package/src/01-one/tokenizer/is-sentence.js +37 -0
- package/src/01-one/tokenizer/plugin.js +11 -0
- package/src/01-one/tokenizer/unicode.js +55 -0
- package/src/02-two/postTagger/matches.js +47 -0
- package/src/02-two/postTagger/plugin.js +8 -0
- package/src/02-two/preTagger/compute/1st-pass/regex.js +43 -0
- package/src/02-two/preTagger/compute/1st-pass/titlecase.js +21 -0
- package/src/02-two/preTagger/compute/1st-pass/year.js +54 -0
- package/src/02-two/preTagger/compute/2nd-pass/acronym.js +82 -0
- package/src/02-two/preTagger/compute/2nd-pass/fallback.js +27 -0
- package/src/02-two/preTagger/compute/2nd-pass/prefix-lookup.js +33 -0
- package/src/02-two/preTagger/compute/2nd-pass/suffix-lookup.js +44 -0
- package/src/02-two/preTagger/compute/index.js +42 -0
- package/src/02-two/preTagger/model/index.js +14 -0
- package/src/02-two/preTagger/model/prefixes.js +46 -0
- package/src/02-two/preTagger/model/regex/regex-normal.js +25 -0
- package/src/02-two/preTagger/model/regex/regex-numbers.js +62 -0
- package/src/02-two/preTagger/model/regex/regex-text.js +17 -0
- package/src/02-two/preTagger/model/suffixes.js +171 -0
- package/src/02-two/preTagger/plugin.js +12 -0
- package/src/03-three/adjectives/api.js +34 -0
- package/src/03-three/adjectives/plugin.js +5 -0
- package/src/03-three/nouns/api.js +74 -0
- package/src/03-three/nouns/plugin.js +5 -0
- package/src/03-three/numbers/api.js +259 -0
- package/src/03-three/numbers/data.js +77 -0
- package/src/03-three/numbers/format/index.js +27 -0
- package/src/03-three/numbers/format/toText.js +118 -0
- package/src/03-three/numbers/parse/fromText.js +52 -0
- package/src/03-three/numbers/parse/index.js +63 -0
- package/src/03-three/numbers/plugin.js +5 -0
- package/src/03-three/verbs/api.js +41 -0
- package/src/03-three/verbs/plugin.js +5 -0
- package/src/_lib.js +4 -0
- package/src/_version.js +1 -0
- package/src/index.js +53 -0
- package/types/index.d.ts +46 -0
- package/types/misc.ts +92 -0
- package/types/view/de.ts +61 -0
- package/types/view/one.ts +235 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { convert, reverse } from 'suffix-thumb'
|
|
2
|
+
import model from '../models.js'
|
|
3
|
+
|
|
4
|
+
let pluralRev = model.nouns && model.nouns.plural ? reverse(model.nouns.plural) : null
|
|
5
|
+
|
|
6
|
+
// fallback rules, when no trained model is available
|
|
7
|
+
const leave = [
|
|
8
|
+
'tion',
|
|
9
|
+
'sion',
|
|
10
|
+
'tent',
|
|
11
|
+
'rant',
|
|
12
|
+
'hine',
|
|
13
|
+
'ppen',
|
|
14
|
+
'ene',
|
|
15
|
+
'nne',
|
|
16
|
+
'zen',
|
|
17
|
+
'in',
|
|
18
|
+
'an',
|
|
19
|
+
'is',
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
const suffixes = [
|
|
23
|
+
'ns',
|
|
24
|
+
'ne',
|
|
25
|
+
'n',
|
|
26
|
+
's',
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const toSingular = function (str) {
|
|
30
|
+
if (pluralRev) {
|
|
31
|
+
return convert(str, pluralRev)
|
|
32
|
+
}
|
|
33
|
+
for (let i = 0; i < leave.length; i += 1) {
|
|
34
|
+
if (str.endsWith(leave[i])) {
|
|
35
|
+
return str
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (let i = 0; i < suffixes.length; i += 1) {
|
|
39
|
+
let suff = suffixes[i]
|
|
40
|
+
if (str.endsWith(suff)) {
|
|
41
|
+
return str.substring(0, str.length - suff.length)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return str
|
|
45
|
+
}
|
|
46
|
+
export default toSingular
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { convert } from 'suffix-thumb'
|
|
2
|
+
import model from '../models.js'
|
|
3
|
+
import getIrregular from './irregulars.js'
|
|
4
|
+
import ppRules from './custom/toPastParticiple.js'
|
|
5
|
+
let { presentTense, pastTense, subjunctive1, subjunctive2, imperative, presentParticiple, pastParticiple } = model
|
|
6
|
+
|
|
7
|
+
const doEach = function (str, m, tense) {
|
|
8
|
+
let irr = getIrregular(str, tense)
|
|
9
|
+
if (irr) {
|
|
10
|
+
return {
|
|
11
|
+
first: irr[0],
|
|
12
|
+
second: irr[1],
|
|
13
|
+
third: irr[2],
|
|
14
|
+
firstPlural: irr[3],
|
|
15
|
+
secondPlural: irr[4],
|
|
16
|
+
thirdPlural: irr[5],
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
first: convert(str, m.first),
|
|
21
|
+
second: convert(str, m.second),
|
|
22
|
+
third: convert(str, m.third),
|
|
23
|
+
firstPlural: convert(str, m.firstPlural),
|
|
24
|
+
secondPlural: convert(str, m.secondPlural),
|
|
25
|
+
thirdPlural: convert(str, m.thirdPlural),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const toPresent = (str) => doEach(str, presentTense, 'present')
|
|
30
|
+
const toPast = (str) => doEach(str, pastTense, 'past')
|
|
31
|
+
const toSubjunctive1 = (str) => doEach(str, subjunctive1, 'subj1')
|
|
32
|
+
const toSubjunctive2 = (str) => doEach(str, subjunctive2, 'subj2')
|
|
33
|
+
|
|
34
|
+
const toPresentParticiple = (str) => {
|
|
35
|
+
return getIrregular(str, 'presentParticiple') || convert(str, presentParticiple.presentParticiple)
|
|
36
|
+
}
|
|
37
|
+
const toPastParticiple = (str) => {
|
|
38
|
+
let irr = getIrregular(str, 'pastParticiple')
|
|
39
|
+
if (irr) {
|
|
40
|
+
return irr
|
|
41
|
+
}
|
|
42
|
+
if (pastParticiple) {
|
|
43
|
+
return convert(str, pastParticiple.pastParticiple)
|
|
44
|
+
}
|
|
45
|
+
return ppRules(str)
|
|
46
|
+
}
|
|
47
|
+
const toImperative = (str) => {
|
|
48
|
+
let irr = getIrregular(str, 'imperative')
|
|
49
|
+
if (irr) {
|
|
50
|
+
return { secondSingular: irr[0], secondPlural: irr[1] }
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
secondSingular: convert(str, imperative.singular),
|
|
54
|
+
secondPlural: convert(str, imperative.plural),
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// an array of every inflection, for '{inf}' syntax
|
|
59
|
+
const all = function (str) {
|
|
60
|
+
let res = [str].concat(
|
|
61
|
+
Object.values(toPresent(str)),
|
|
62
|
+
Object.values(toPast(str)),
|
|
63
|
+
Object.values(toSubjunctive1(str)),
|
|
64
|
+
Object.values(toSubjunctive2(str)),
|
|
65
|
+
Object.values(toImperative(str)),
|
|
66
|
+
toPresentParticiple(str),
|
|
67
|
+
toPastParticiple(str),
|
|
68
|
+
).filter(s => s)
|
|
69
|
+
res = new Set(res)
|
|
70
|
+
return Array.from(res)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
export {
|
|
76
|
+
all,
|
|
77
|
+
toPresent,
|
|
78
|
+
toPast,
|
|
79
|
+
toSubjunctive1,
|
|
80
|
+
toSubjunctive2,
|
|
81
|
+
toImperative,
|
|
82
|
+
toPresentParticiple,
|
|
83
|
+
toPastParticiple
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// console.log(toImperative('schwimmen'))
|
|
87
|
+
// console.log(all('tanzen'))
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import pairs from '/Users/spencer/mountain/de-compromise/data/models/verbs/past-participle.js'
|
|
3
|
+
import fromPastParticiple from './fromPastParticiple.js'
|
|
4
|
+
// import fs from 'fs'
|
|
5
|
+
|
|
6
|
+
const inspect = ''
|
|
7
|
+
|
|
8
|
+
const topk = function (arr) {
|
|
9
|
+
let obj = {}
|
|
10
|
+
arr.forEach(a => {
|
|
11
|
+
obj[a] = obj[a] || 0
|
|
12
|
+
obj[a] += 1
|
|
13
|
+
})
|
|
14
|
+
let res = Object.keys(obj).map(k => [k, obj[k]])
|
|
15
|
+
return res.sort((a, b) => (a[1] > b[1] ? -1 : 0))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const percent = (part, total) => {
|
|
19
|
+
let num = (part / total) * 100;
|
|
20
|
+
num = Math.round(num * 10) / 10;
|
|
21
|
+
return num;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// collect errors to look at
|
|
25
|
+
let right = 0
|
|
26
|
+
let bads = []
|
|
27
|
+
pairs.forEach(a => {
|
|
28
|
+
let [inf, prt] = a
|
|
29
|
+
let have = fromPastParticiple(prt)
|
|
30
|
+
if (have === inf) {
|
|
31
|
+
right += 1
|
|
32
|
+
} else {
|
|
33
|
+
// if (prt.endsWith(inspect)) {
|
|
34
|
+
bads.push([a[0], a[1], have])
|
|
35
|
+
// }
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
// let suffs = bads.map(a => a[1].substring(a[1].length - inspect.length, a[1].length))
|
|
40
|
+
let suffs = bads.map(a => a[1].substring(a[1].length - inspect.length - 4, a[1].length))
|
|
41
|
+
// bads = bads.filter(a => a[2].startsWith('ge') && !a[1].startsWith('ge'))
|
|
42
|
+
// let suffs = bads.map(a => a[0].substring(0, 3))
|
|
43
|
+
console.log(topk(suffs))
|
|
44
|
+
// console.log(bads.filter(a => a[0].startsWith('au')))
|
|
45
|
+
// console.log(bads.filter(a => a[0].endsWith('ren')))
|
|
46
|
+
// console.log(bads.filter(a => a[1].endsWith('gen')))
|
|
47
|
+
// fs.writeFileSync('./tmp.json', JSON.stringify(bads, null, 2))
|
|
48
|
+
|
|
49
|
+
console.log(bads.length, 'errors')
|
|
50
|
+
console.log(percent(right, pairs.length) + '%')
|
|
51
|
+
// console.log('\n\n', toPastParticiple("enthalten"))
|
|
52
|
+
// console.log(bads)
|
|
53
|
+
// 85.8%
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* eslint-disable no-console, no-unused-vars */
|
|
2
|
+
import pairs from '/Users/spencer/mountain/de-compromise/data/models/verbs/past-participle.js'
|
|
3
|
+
import toPastParticiple from './toPastParticiple.js'
|
|
4
|
+
import fs from 'fs'
|
|
5
|
+
|
|
6
|
+
const inspect = ''
|
|
7
|
+
|
|
8
|
+
const topk = function (arr) {
|
|
9
|
+
let obj = {}
|
|
10
|
+
arr.forEach(a => {
|
|
11
|
+
obj[a] = obj[a] || 0
|
|
12
|
+
obj[a] += 1
|
|
13
|
+
})
|
|
14
|
+
let res = Object.keys(obj).map(k => [k, obj[k]])
|
|
15
|
+
return res.sort((a, b) => (a[1] > b[1] ? -1 : 0))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const percent = (part, total) => {
|
|
19
|
+
let num = (part / total) * 100;
|
|
20
|
+
num = Math.round(num * 10) / 10;
|
|
21
|
+
return num;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// collect errors to look at
|
|
25
|
+
let right = 0
|
|
26
|
+
let bads = []
|
|
27
|
+
pairs.forEach(a => {
|
|
28
|
+
let [inf, prt] = a
|
|
29
|
+
let have = toPastParticiple(inf)
|
|
30
|
+
if (have === prt) {
|
|
31
|
+
right += 1
|
|
32
|
+
} else {
|
|
33
|
+
if (prt.endsWith(inspect)) {
|
|
34
|
+
bads.push([a[0], a[1], have])
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
// let suffs = bads.map(a => a[1].substring(a[1].length - inspect.length, a[1].length))
|
|
40
|
+
let suffs = bads.map(a => a[2].substring(a[2].length - inspect.length - 4, a[2].length))
|
|
41
|
+
bads = bads.filter(a => a[2].match(/ssen$/) && !a[1].match(/ssen$/))
|
|
42
|
+
// let suffs = bads.map(a => a[0].substring(0, 4))
|
|
43
|
+
// console.log(bads)
|
|
44
|
+
// console.log(topk(suffs))
|
|
45
|
+
fs.writeFileSync('./tmp.json', JSON.stringify(bads, null, 2))
|
|
46
|
+
|
|
47
|
+
console.log(bads.length, 'errors')
|
|
48
|
+
console.log(percent(right, pairs.length) + '%')
|
|
49
|
+
console.log('\n\n', toPastParticiple("schwimmen"), "geschwommen")
|
|
50
|
+
// 82%
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { prefixes, suffixes } from './rules.js'
|
|
2
|
+
|
|
3
|
+
const doSuffix = function (str) {
|
|
4
|
+
for (let i = 0; i < suffixes.length; i += 1) {
|
|
5
|
+
let [inf, prt] = suffixes[i]
|
|
6
|
+
if (str.endsWith(prt)) {
|
|
7
|
+
return str.substring(0, str.length - prt.length) + inf
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
str = str.replace(/t$/, 'en')
|
|
11
|
+
return str
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const doPrefix = function (str) {
|
|
15
|
+
// remove 'ge-' off the front
|
|
16
|
+
for (let i = 0; i < prefixes.length; i += 1) {
|
|
17
|
+
if (str.startsWith(prefixes[i] + 'ge')) {
|
|
18
|
+
return prefixes[i] + str.substring(prefixes[i].length + 2)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
str = str.replace(/^ge/, '')
|
|
22
|
+
return str
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const fromPastParticiple = function (str) {
|
|
26
|
+
// always weak - ieren
|
|
27
|
+
if (str.endsWith('iert')) {
|
|
28
|
+
str = str.replace(/iert$/, 'ieren')
|
|
29
|
+
return str //no 'ge-'
|
|
30
|
+
}
|
|
31
|
+
str = doSuffix(str)
|
|
32
|
+
str = doPrefix(str)
|
|
33
|
+
return str
|
|
34
|
+
}
|
|
35
|
+
export default fromPastParticiple
|
|
36
|
+
|
|
37
|
+
// console.log(fromPastParticiple('ereifert'))
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
let prefixes = [
|
|
2
|
+
'dazwischen',
|
|
3
|
+
'zusammen',
|
|
4
|
+
'entgegen',
|
|
5
|
+
'zwangsum',
|
|
6
|
+
'daneben',
|
|
7
|
+
'dagegen',
|
|
8
|
+
'schwarz',
|
|
9
|
+
'hierher',
|
|
10
|
+
'kaputt',
|
|
11
|
+
'hinein',
|
|
12
|
+
'zurück',
|
|
13
|
+
'weiter',
|
|
14
|
+
'gleich',
|
|
15
|
+
'allein',
|
|
16
|
+
'wieder',
|
|
17
|
+
'schief',
|
|
18
|
+
'fertig',
|
|
19
|
+
'hinter',
|
|
20
|
+
'hängen',
|
|
21
|
+
'kleben',
|
|
22
|
+
'nieder',
|
|
23
|
+
'herbei',
|
|
24
|
+
'hervor',
|
|
25
|
+
'falsch',
|
|
26
|
+
'gesund',
|
|
27
|
+
'wider',
|
|
28
|
+
'breit',
|
|
29
|
+
'krumm',
|
|
30
|
+
'heran',
|
|
31
|
+
'herab',
|
|
32
|
+
'herum',
|
|
33
|
+
'unter',
|
|
34
|
+
'offen',
|
|
35
|
+
'drauf',
|
|
36
|
+
'dahin',
|
|
37
|
+
'klein',
|
|
38
|
+
'durch',
|
|
39
|
+
'davon',
|
|
40
|
+
'daher',
|
|
41
|
+
'dahin',
|
|
42
|
+
'dahin',
|
|
43
|
+
'flach',
|
|
44
|
+
'dabei',
|
|
45
|
+
'drein',
|
|
46
|
+
'davor',
|
|
47
|
+
'krank',
|
|
48
|
+
'knapp',
|
|
49
|
+
'dafür',
|
|
50
|
+
'glatt',
|
|
51
|
+
'nach',
|
|
52
|
+
'rück',
|
|
53
|
+
'dazu',
|
|
54
|
+
'bloß',
|
|
55
|
+
'wahr',
|
|
56
|
+
'weis',
|
|
57
|
+
'hohn',
|
|
58
|
+
'lieb',
|
|
59
|
+
'acht',
|
|
60
|
+
'groß',
|
|
61
|
+
'wach',
|
|
62
|
+
'drin',
|
|
63
|
+
'hoch',
|
|
64
|
+
'voll',
|
|
65
|
+
'hier',
|
|
66
|
+
'hops',
|
|
67
|
+
'lahm',
|
|
68
|
+
'quer',
|
|
69
|
+
'klar',
|
|
70
|
+
'fern',
|
|
71
|
+
'fein',
|
|
72
|
+
'fehl',
|
|
73
|
+
'nach',
|
|
74
|
+
'blau',
|
|
75
|
+
'dran',
|
|
76
|
+
'fest',
|
|
77
|
+
'fort',
|
|
78
|
+
'heim',
|
|
79
|
+
'nahe',
|
|
80
|
+
'rein',
|
|
81
|
+
'leer',
|
|
82
|
+
'hops',
|
|
83
|
+
'kurz',
|
|
84
|
+
'kahl',
|
|
85
|
+
'frei',
|
|
86
|
+
'dar',
|
|
87
|
+
'auf',
|
|
88
|
+
'bei',
|
|
89
|
+
'ein',
|
|
90
|
+
'her',
|
|
91
|
+
'tot',
|
|
92
|
+
'alt',
|
|
93
|
+
'eis',
|
|
94
|
+
'aus',
|
|
95
|
+
'hin',
|
|
96
|
+
'los',
|
|
97
|
+
'mit',
|
|
98
|
+
'vor',
|
|
99
|
+
'weg',
|
|
100
|
+
'zu',
|
|
101
|
+
'um',
|
|
102
|
+
'ab',
|
|
103
|
+
'an'
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
let suffixes = [
|
|
107
|
+
'bringen|bracht',
|
|
108
|
+
'leichen|lichen',
|
|
109
|
+
'riechen|rochen',
|
|
110
|
+
'lassen|lassen',
|
|
111
|
+
'teigen|tiegen',
|
|
112
|
+
'chauen|chaut',
|
|
113
|
+
'fahren|fahren',
|
|
114
|
+
'färben|färbt',
|
|
115
|
+
'hängen|hangen',
|
|
116
|
+
'sitzen|sessen',
|
|
117
|
+
'riegen|riegt',
|
|
118
|
+
'laufen|laufen',
|
|
119
|
+
'neiden|nitten',
|
|
120
|
+
'fallen|fallen',
|
|
121
|
+
'tragen|tragen',
|
|
122
|
+
'saufen|soffen',
|
|
123
|
+
'braten|braten',
|
|
124
|
+
'auchen|aucht',
|
|
125
|
+
'mieren|miert',
|
|
126
|
+
'reiten|ritten',
|
|
127
|
+
'gehen|gangen',
|
|
128
|
+
'alten|alten',
|
|
129
|
+
'raten|raten',
|
|
130
|
+
'ennen|annt',
|
|
131
|
+
'eißen|issen',
|
|
132
|
+
'ulden|uldet',
|
|
133
|
+
'chnen|chnet',
|
|
134
|
+
'chsen|chsen',
|
|
135
|
+
'chten|chtet',
|
|
136
|
+
'echen|ochen',
|
|
137
|
+
'immen|ommen',
|
|
138
|
+
'ehmen|ommen',
|
|
139
|
+
'eiben|ieben',
|
|
140
|
+
'eißen|issen',
|
|
141
|
+
'elzen|olzen',
|
|
142
|
+
'elfen|olfen',
|
|
143
|
+
'rufen|rufen',
|
|
144
|
+
'erben|orben',
|
|
145
|
+
'hauen|hauen',
|
|
146
|
+
'ießen|ossen',
|
|
147
|
+
'ilden|ildet',
|
|
148
|
+
'inden|unden',
|
|
149
|
+
'ingen|ungen',
|
|
150
|
+
'inken|unken',
|
|
151
|
+
'innen|onnen',
|
|
152
|
+
'lagen|lagen',
|
|
153
|
+
'ommen|ommen',
|
|
154
|
+
'achen|acht',
|
|
155
|
+
'annen|annt',
|
|
156
|
+
'assen|asst',
|
|
157
|
+
'mühen|müht',
|
|
158
|
+
'reien|rien',
|
|
159
|
+
'ählen|ählt',
|
|
160
|
+
'enden|andt',
|
|
161
|
+
'tehen|tanden',
|
|
162
|
+
'enken|acht',
|
|
163
|
+
'iegen|ogen',
|
|
164
|
+
'iehen|ogen',
|
|
165
|
+
'reden|redet',
|
|
166
|
+
'rehen|reht',
|
|
167
|
+
'reten|reten',
|
|
168
|
+
'schen|scht',
|
|
169
|
+
'sehen|sehen',
|
|
170
|
+
'toßen|toßen',
|
|
171
|
+
'ünden|ündet',
|
|
172
|
+
'ssen|ssen',
|
|
173
|
+
'tten|ttet',
|
|
174
|
+
'ören|ört',
|
|
175
|
+
'ehen|anden',
|
|
176
|
+
'dnen|dnet',
|
|
177
|
+
'eln|elt',
|
|
178
|
+
'ten|tet',
|
|
179
|
+
'ern|ert',
|
|
180
|
+
].map(s => s.split('|'))
|
|
181
|
+
|
|
182
|
+
export { prefixes, suffixes }
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { prefixes, suffixes } from './rules.js'
|
|
2
|
+
const inseperable = /^(be|emp|ent|er|ge|miss|ver|zer|wiederer)/
|
|
3
|
+
|
|
4
|
+
const doPrefix = function (str) {
|
|
5
|
+
if (/^auss/.test(str)) {
|
|
6
|
+
str = str.replace(/^auss/, 'ausges')
|
|
7
|
+
return str
|
|
8
|
+
}
|
|
9
|
+
if (/^ansch/.test(str)) {
|
|
10
|
+
str = str.replace(/^ansch/, 'angesch')
|
|
11
|
+
return str
|
|
12
|
+
}
|
|
13
|
+
// put a 'ge' somewhere
|
|
14
|
+
for (let i = 0; i < prefixes.length; i += 1) {
|
|
15
|
+
if (str.startsWith(prefixes[i])) {
|
|
16
|
+
return prefixes[i] + 'ge' + str.substring(prefixes[i].length)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (inseperable.test(str)) {
|
|
20
|
+
// str = str.replace(/en$/, 't')
|
|
21
|
+
return str
|
|
22
|
+
}
|
|
23
|
+
// otherwse, add 'ge-'
|
|
24
|
+
if (!str.match(/^(über|unt|v|au|miß)/)) {
|
|
25
|
+
str = 'ge' + str
|
|
26
|
+
}
|
|
27
|
+
return str
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const doSuffix = function (str) {
|
|
31
|
+
for (let i = 0; i < suffixes.length; i += 1) {
|
|
32
|
+
let [from, to] = suffixes[i]
|
|
33
|
+
if (str.endsWith(from)) {
|
|
34
|
+
return str.substring(0, str.length - from.length) + to
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
str = str.replace(/en$/, 't')
|
|
38
|
+
return str
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// this one is strange, and doesn't compress well
|
|
42
|
+
const toPastParticiple = function (str) {
|
|
43
|
+
// always weak
|
|
44
|
+
if (str.endsWith('ieren')) {
|
|
45
|
+
str = str.replace(/en$/, 't')
|
|
46
|
+
return str //no 'ge-'
|
|
47
|
+
}
|
|
48
|
+
str = doSuffix(str)
|
|
49
|
+
str = doPrefix(str)
|
|
50
|
+
return str
|
|
51
|
+
}
|
|
52
|
+
export default toPastParticiple
|
|
53
|
+
|
|
54
|
+
// console.log( toPastParticiple("schwimmen"), "geschwommen")
|