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,29 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import toRoot from './toRoot.js'
|
|
3
|
+
import model from '/Users/spencer/mountain/de-compromise/data/models/adjectives/adjectives.js'
|
|
4
|
+
|
|
5
|
+
// let all = []
|
|
6
|
+
// let suff = ''
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const percent = (part, total) => {
|
|
10
|
+
let num = (part / total) * 100;
|
|
11
|
+
num = Math.round(num * 10) / 10;
|
|
12
|
+
return num;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
let correct = 0
|
|
17
|
+
let total = 0
|
|
18
|
+
Object.keys(model).forEach(inf => {
|
|
19
|
+
model[inf].forEach(str => {
|
|
20
|
+
let have = toRoot(str)
|
|
21
|
+
total += 1
|
|
22
|
+
if (have === inf) {
|
|
23
|
+
correct += 1
|
|
24
|
+
} else {
|
|
25
|
+
console.log(inf, have)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
console.log(percent(correct, total))
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import model from '/Users/spencer/mountain/de-compromise/data/models/adjectives/adjectives.js'
|
|
3
|
+
import convert from './inflect.js'
|
|
4
|
+
|
|
5
|
+
let all = []
|
|
6
|
+
let suff = ''
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const percent = (part, total) => {
|
|
10
|
+
let num = (part / total) * 100;
|
|
11
|
+
num = Math.round(num * 10) / 10;
|
|
12
|
+
return num;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// const topk = function (arr) {
|
|
16
|
+
// let obj = {}
|
|
17
|
+
// arr.forEach(a => {
|
|
18
|
+
// obj[a] = obj[a] || 0
|
|
19
|
+
// obj[a] += 1
|
|
20
|
+
// })
|
|
21
|
+
// let res = Object.keys(obj).map(k => [k, obj[k]])
|
|
22
|
+
// return res.sort((a, b) => (a[1] > b[1] ? -1 : 0))
|
|
23
|
+
// }
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
let tests = [
|
|
28
|
+
{ prop: 'one', n: 0 },
|
|
29
|
+
{ prop: 'two', n: 1 },
|
|
30
|
+
{ prop: 'three', n: 2 },
|
|
31
|
+
{ prop: 'four', n: 3 },
|
|
32
|
+
]
|
|
33
|
+
tests.forEach(obj => {
|
|
34
|
+
let good = 0
|
|
35
|
+
Object.keys(model).forEach(inf => {
|
|
36
|
+
let have = convert(inf)[obj.prop]
|
|
37
|
+
if (have === model[inf][obj.n]) {
|
|
38
|
+
good += 1
|
|
39
|
+
} else {
|
|
40
|
+
if (inf.endsWith(suff)) {
|
|
41
|
+
all.push(inf.substring(inf.length - (suff.length + 1)))
|
|
42
|
+
// console.log(inf.padEnd(12), model[inf][n])
|
|
43
|
+
// console.log(inf, model[inf][0], have,)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
console.log(obj.prop, percent(good, Object.keys(model).length))
|
|
48
|
+
})
|
|
49
|
+
// console.log(topk(all))
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import model from './model.js'
|
|
2
|
+
|
|
3
|
+
const inflectAdj = function (inf) {
|
|
4
|
+
const keys = Object.keys(model)
|
|
5
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
6
|
+
let suff = keys[i]
|
|
7
|
+
if (inf.endsWith(suff)) {
|
|
8
|
+
return {
|
|
9
|
+
one: inf + model[suff][0],
|
|
10
|
+
two: inf + model[suff][1],
|
|
11
|
+
three: inf + model[suff][2],
|
|
12
|
+
four: inf + model[suff][3],
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
one: inf + 'er',
|
|
18
|
+
two: inf + 'en',
|
|
19
|
+
three: inf + 'e',
|
|
20
|
+
four: inf + 'es',
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export default inflectAdj
|
|
24
|
+
|
|
25
|
+
// console.log(inflectAdj('skandalös'))
|
|
26
|
+
|
|
27
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// greedy adjective suffixes
|
|
2
|
+
// learned from spencermountain/suffix-thumb @ March 2023
|
|
3
|
+
const r = 'ster'
|
|
4
|
+
const n = 'sten'
|
|
5
|
+
const e = 'ste'
|
|
6
|
+
const s = 'stes'
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
'böse': [r, n, e, s],
|
|
10
|
+
chener: ['erer', 'eren', 'ere', 'eres'],
|
|
11
|
+
agisch: [r, n, e, s],
|
|
12
|
+
ppisch: [r, n, e, s],
|
|
13
|
+
ragend: [r, n, e, s],
|
|
14
|
+
idisch: [r, n, e, s],
|
|
15
|
+
ichbar: [r, n, e, s],
|
|
16
|
+
eladen: [r, n, e, s],
|
|
17
|
+
ietend: [r, n, e, s],
|
|
18
|
+
orativ: [r, n, e, s],
|
|
19
|
+
ankbar: [r, n, e, s],
|
|
20
|
+
'übisch': [r, n, e, s],
|
|
21
|
+
lgisch: [r, n, e, s],
|
|
22
|
+
fangen: [r, n, e, s],
|
|
23
|
+
yrisch: [r, n, e, s],
|
|
24
|
+
nkisch: [r, n, e, s],
|
|
25
|
+
rrisch: [r, n, e, s],
|
|
26
|
+
llisch: [r, n, e, s],
|
|
27
|
+
ichend: [r, n, e, s],
|
|
28
|
+
gerade: ['r', 'n', '', 's'],
|
|
29
|
+
ragbar: [r, n, e, s],
|
|
30
|
+
ellbar: [r, n, e, s],
|
|
31
|
+
assend: [r, n, e, s],
|
|
32
|
+
ypisch: [r, n, e, s],
|
|
33
|
+
otisch: [r, n, e, s],
|
|
34
|
+
thisch: [r, n, e, s],
|
|
35
|
+
iebend: [r, n, e, s],
|
|
36
|
+
tional: [r, n, e, s],
|
|
37
|
+
regend: [r, n, e, s],
|
|
38
|
+
erisch: [r, n, e, s],
|
|
39
|
+
hener: ['erer', 'eren', 'ere', 'eres'],
|
|
40
|
+
ocken: [r, n, e, s],
|
|
41
|
+
iisch: [r, n, e, s],
|
|
42
|
+
htern: [r, n, e, s],
|
|
43
|
+
stern: [r, n, e, s],
|
|
44
|
+
egial: [r, n, e, s],
|
|
45
|
+
abend: [r, n, e, s],
|
|
46
|
+
ifend: [r, n, e, s],
|
|
47
|
+
efend: [r, n, e, s],
|
|
48
|
+
nitiv: [r, n, e, s],
|
|
49
|
+
nnend: [r, n, e, s],
|
|
50
|
+
vativ: [r, n, e, s],
|
|
51
|
+
erade: ['r', 'n', '', 's'],
|
|
52
|
+
igend: [r, n, e, s],
|
|
53
|
+
iden: [r, n, e, s],
|
|
54
|
+
stiv: [r, n, e, s],
|
|
55
|
+
mein: [r, n, e, s],
|
|
56
|
+
ubar: [r, n, e, s],
|
|
57
|
+
ikal: [r, n, e, s],
|
|
58
|
+
zend: [r, n, e, s],
|
|
59
|
+
rade: ['r', 'n', '', 's'],
|
|
60
|
+
gnet: [r, n, e, s],
|
|
61
|
+
tral: [r, n, e, s],
|
|
62
|
+
fbar: [r, n, e, s],
|
|
63
|
+
rmal: [r, n, e, s],
|
|
64
|
+
eden: [r, n, e, s],
|
|
65
|
+
hren: [r, n, e, s],
|
|
66
|
+
'ßbar': [r, n, e, s],
|
|
67
|
+
zbar: [r, n, e, s],
|
|
68
|
+
chen: [r, n, e, s],
|
|
69
|
+
ogen: [r, n, e, s],
|
|
70
|
+
nbar: [r, n, e, s],
|
|
71
|
+
egen: [r, n, e, s],
|
|
72
|
+
rsch: [r, n, e, s],
|
|
73
|
+
tbar: [r, n, e, s],
|
|
74
|
+
rbar: [r, n, e, s],
|
|
75
|
+
ktiv: [r, n, e, s],
|
|
76
|
+
'öse': [r, n, e, s],
|
|
77
|
+
eal: [r, n, e, s],
|
|
78
|
+
ade: ['r', 'n', '', 's'],
|
|
79
|
+
men: [r, n, e, s],
|
|
80
|
+
ten: [r, n, e, s],
|
|
81
|
+
sen: [r, n, e, s],
|
|
82
|
+
siv: [r, n, e, s],
|
|
83
|
+
ich: [r, n, e, s],
|
|
84
|
+
'üm': [r, n, e, s],
|
|
85
|
+
'än': [r, n, e, s],
|
|
86
|
+
xy: [r, n, e, s],
|
|
87
|
+
'ül': [r, n, e, s],
|
|
88
|
+
uh: [r, n, e, s],
|
|
89
|
+
be: [r, n, e, s],
|
|
90
|
+
pf: [r, n, e, s],
|
|
91
|
+
of: [r, n, e, s],
|
|
92
|
+
ic: [r, n, e, s],
|
|
93
|
+
he: ['r', 'n', '', 's'],
|
|
94
|
+
om: [r, n, e, s],
|
|
95
|
+
ik: [r, n, e, s],
|
|
96
|
+
ym: [r, n, e, s],
|
|
97
|
+
ff: [r, n, e, s],
|
|
98
|
+
'üb': [r, n, e, s],
|
|
99
|
+
hn: [r, n, e, s],
|
|
100
|
+
pp: [r, n, e, s],
|
|
101
|
+
ir: [r, n, e, s],
|
|
102
|
+
av: [r, n, e, s],
|
|
103
|
+
im: [r, n, e, s],
|
|
104
|
+
rb: [r, n, e, s],
|
|
105
|
+
ge: [r, n, e, s],
|
|
106
|
+
ul: [r, n, e, s],
|
|
107
|
+
rr: [r, n, e, s],
|
|
108
|
+
em: [r, n, e, s],
|
|
109
|
+
ck: [r, n, e, s],
|
|
110
|
+
'ön': [r, n, e, s],
|
|
111
|
+
hm: [r, n, e, s],
|
|
112
|
+
te: ['r', 'n', '', 's'],
|
|
113
|
+
hl: [r, n, e, s],
|
|
114
|
+
mm: [r, n, e, s],
|
|
115
|
+
au: [r, n, e, s],
|
|
116
|
+
if: [r, n, e, s],
|
|
117
|
+
eu: [r, n, e, s],
|
|
118
|
+
de: [r, n, e, s],
|
|
119
|
+
il: [r, n, e, s],
|
|
120
|
+
se: ['r', 'n', '', 's'],
|
|
121
|
+
'är': [r, n, e, s],
|
|
122
|
+
am: [r, n, e, s],
|
|
123
|
+
er: [r, n, e, s],
|
|
124
|
+
ll: [r, n, e, s],
|
|
125
|
+
ig: [r, n, e, s]
|
|
126
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
let models = [
|
|
3
|
+
{
|
|
4
|
+
fallback: 'ster',
|
|
5
|
+
rules: [
|
|
6
|
+
['eerend', 'eerendester'],
|
|
7
|
+
['morsch', 'morschester'],
|
|
8
|
+
['öchern', 'öchernester'],
|
|
9
|
+
['behend', 'behendester'],
|
|
10
|
+
['sscheu', 'sscheuester'],
|
|
11
|
+
['elend', 'elendester'],
|
|
12
|
+
['tsch', 'tschester'],
|
|
13
|
+
['grau', 'grauester'],
|
|
14
|
+
['lsch', 'lschester'],
|
|
15
|
+
['pur', 'purester'],
|
|
16
|
+
['ind', 'indester'],
|
|
17
|
+
['änd', 'ändester'],
|
|
18
|
+
['ond', 'ondester'],
|
|
19
|
+
['und', 'undester'],
|
|
20
|
+
['äh', 'ähester'],
|
|
21
|
+
['mp', 'mpester'],
|
|
22
|
+
['sk', 'skester'],
|
|
23
|
+
['üh', 'ühester'],
|
|
24
|
+
['ad', 'adester'],
|
|
25
|
+
['rd', 'rdester'],
|
|
26
|
+
['äß', 'äßester'],
|
|
27
|
+
['öd', 'ödester'],
|
|
28
|
+
['üß', 'üßester'],
|
|
29
|
+
['md', 'mdester'],
|
|
30
|
+
['ld', 'ldester'],
|
|
31
|
+
['iß', 'ißester'],
|
|
32
|
+
['oh', 'ohester'],
|
|
33
|
+
['id', 'idester'],
|
|
34
|
+
['nk', 'nkester'],
|
|
35
|
+
['z', 'zester'],
|
|
36
|
+
['x', 'xester'],
|
|
37
|
+
['i', 'iester'],
|
|
38
|
+
['s', 'sester'],
|
|
39
|
+
['t', 'tester']
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
fallback: 'sten',
|
|
44
|
+
rules: [
|
|
45
|
+
['eerend', 'eerendesten'],
|
|
46
|
+
['morsch', 'morschesten'],
|
|
47
|
+
['öchern', 'öchernesten'],
|
|
48
|
+
['behend', 'behendesten'],
|
|
49
|
+
['sscheu', 'sscheuesten'],
|
|
50
|
+
['elend', 'elendesten'],
|
|
51
|
+
['tsch', 'tschesten'],
|
|
52
|
+
['grau', 'grauesten'],
|
|
53
|
+
['lsch', 'lschesten'],
|
|
54
|
+
['pur', 'puresten'],
|
|
55
|
+
['ind', 'indesten'],
|
|
56
|
+
['änd', 'ändesten'],
|
|
57
|
+
['ond', 'ondesten'],
|
|
58
|
+
['und', 'undesten'],
|
|
59
|
+
['äh', 'ähesten'],
|
|
60
|
+
['mp', 'mpesten'],
|
|
61
|
+
['sk', 'skesten'],
|
|
62
|
+
['üh', 'ühesten'],
|
|
63
|
+
['ad', 'adesten'],
|
|
64
|
+
['rd', 'rdesten'],
|
|
65
|
+
['äß', 'äßesten'],
|
|
66
|
+
['öd', 'ödesten'],
|
|
67
|
+
['üß', 'üßesten'],
|
|
68
|
+
['md', 'mdesten'],
|
|
69
|
+
['ld', 'ldesten'],
|
|
70
|
+
['iß', 'ißesten'],
|
|
71
|
+
['oh', 'ohesten'],
|
|
72
|
+
['id', 'idesten'],
|
|
73
|
+
['nk', 'nkesten'],
|
|
74
|
+
['z', 'zesten'],
|
|
75
|
+
['x', 'xesten'],
|
|
76
|
+
['i', 'iesten'],
|
|
77
|
+
['s', 'sesten'],
|
|
78
|
+
['t', 'testen']
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
fallback: 'ste',
|
|
83
|
+
rules: [
|
|
84
|
+
['eerend', 'eerendeste'],
|
|
85
|
+
['morsch', 'morscheste'],
|
|
86
|
+
['öchern', 'öcherneste'],
|
|
87
|
+
['behend', 'behendeste'],
|
|
88
|
+
['sscheu', 'sscheueste'],
|
|
89
|
+
['elend', 'elendeste'],
|
|
90
|
+
['tsch', 'tscheste'],
|
|
91
|
+
['grau', 'graueste'],
|
|
92
|
+
['lsch', 'lscheste'],
|
|
93
|
+
['pur', 'pureste'],
|
|
94
|
+
['ind', 'indeste'],
|
|
95
|
+
['änd', 'ändeste'],
|
|
96
|
+
['ond', 'ondeste'],
|
|
97
|
+
['und', 'undeste'],
|
|
98
|
+
['äh', 'äheste'],
|
|
99
|
+
['mp', 'mpeste'],
|
|
100
|
+
['sk', 'skeste'],
|
|
101
|
+
['üh', 'üheste'],
|
|
102
|
+
['ad', 'adeste'],
|
|
103
|
+
['rd', 'rdeste'],
|
|
104
|
+
['äß', 'äßeste'],
|
|
105
|
+
['öd', 'ödeste'],
|
|
106
|
+
['üß', 'üßeste'],
|
|
107
|
+
['md', 'mdeste'],
|
|
108
|
+
['ld', 'ldeste'],
|
|
109
|
+
['iß', 'ißeste'],
|
|
110
|
+
['oh', 'oheste'],
|
|
111
|
+
['id', 'ideste'],
|
|
112
|
+
['nk', 'nkeste'],
|
|
113
|
+
['z', 'zeste'],
|
|
114
|
+
['x', 'xeste'],
|
|
115
|
+
['i', 'ieste'],
|
|
116
|
+
['s', 'seste'],
|
|
117
|
+
['t', 'teste']
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
fallback: 'stes',
|
|
122
|
+
rules: [
|
|
123
|
+
['eerend', 'eerendestes'],
|
|
124
|
+
['morsch', 'morschestes'],
|
|
125
|
+
['öchern', 'öchernestes'],
|
|
126
|
+
['behend', 'behendestes'],
|
|
127
|
+
['sscheu', 'sscheuestes'],
|
|
128
|
+
['elend', 'elendestes'],
|
|
129
|
+
['tsch', 'tschestes'],
|
|
130
|
+
['grau', 'grauestes'],
|
|
131
|
+
['lsch', 'lschestes'],
|
|
132
|
+
['pur', 'purestes'],
|
|
133
|
+
['ind', 'indestes'],
|
|
134
|
+
['änd', 'ändestes'],
|
|
135
|
+
['ond', 'ondestes'],
|
|
136
|
+
['und', 'undestes'],
|
|
137
|
+
['äh', 'ähestes'],
|
|
138
|
+
['mp', 'mpestes'],
|
|
139
|
+
['sk', 'skestes'],
|
|
140
|
+
['üh', 'ühestes'],
|
|
141
|
+
['ad', 'adestes'],
|
|
142
|
+
['rd', 'rdestes'],
|
|
143
|
+
['äß', 'äßestes'],
|
|
144
|
+
['öd', 'ödestes'],
|
|
145
|
+
['üß', 'üßestes'],
|
|
146
|
+
['md', 'mdestes'],
|
|
147
|
+
['ld', 'ldestes'],
|
|
148
|
+
['iß', 'ißestes'],
|
|
149
|
+
['oh', 'ohestes'],
|
|
150
|
+
['id', 'idestes'],
|
|
151
|
+
['nk', 'nkestes'],
|
|
152
|
+
['z', 'zestes'],
|
|
153
|
+
['x', 'xestes'],
|
|
154
|
+
['i', 'iestes'],
|
|
155
|
+
['s', 'sestes'],
|
|
156
|
+
['t', 'testes']
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const abel = /able[rns]$/
|
|
2
|
+
const auer = /aure[rns]$/
|
|
3
|
+
const usst = /sste[rns]$/
|
|
4
|
+
const wisse = /wisse[rns]$/
|
|
5
|
+
const weise = /weise[rns]$/
|
|
6
|
+
|
|
7
|
+
const suffixes = [
|
|
8
|
+
'ester',
|
|
9
|
+
'esten',
|
|
10
|
+
'estes',
|
|
11
|
+
'este',
|
|
12
|
+
'ster',
|
|
13
|
+
'sten',
|
|
14
|
+
'stes',
|
|
15
|
+
'ste',
|
|
16
|
+
'er',
|
|
17
|
+
'en',
|
|
18
|
+
'es',
|
|
19
|
+
'e',
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
const toRoot = function (str) {
|
|
23
|
+
if (abel.test(str)) {
|
|
24
|
+
return str.replace(abel, 'abel')
|
|
25
|
+
}
|
|
26
|
+
if (auer.test(str)) {
|
|
27
|
+
return str.replace(auer, 'auer')
|
|
28
|
+
}
|
|
29
|
+
if (usst.test(str)) {
|
|
30
|
+
return str.replace(usst, 'usst')
|
|
31
|
+
}
|
|
32
|
+
if (wisse.test(str)) {
|
|
33
|
+
return str.replace(wisse, 'wiß')
|
|
34
|
+
}
|
|
35
|
+
if (weise.test(str)) {
|
|
36
|
+
return str.replace(weise, 'weise')
|
|
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 toRoot
|
|
47
|
+
// console.log(toRoot('saurerer'))
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import {
|
|
2
|
+
all,
|
|
3
|
+
toPresent,
|
|
4
|
+
toPast,
|
|
5
|
+
toSubjunctive1,
|
|
6
|
+
toSubjunctive2,
|
|
7
|
+
toImperative,
|
|
8
|
+
toPastParticiple,
|
|
9
|
+
toPresentParticiple
|
|
10
|
+
} from './verbs/conjugate.js'
|
|
11
|
+
import {
|
|
12
|
+
fromPresent,
|
|
13
|
+
fromPast,
|
|
14
|
+
fromSubjunctive1,
|
|
15
|
+
fromSubjunctive2,
|
|
16
|
+
fromImperative,
|
|
17
|
+
fromPresentParticiple,
|
|
18
|
+
fromPastParticiple
|
|
19
|
+
} from './verbs/toRoot.js'
|
|
20
|
+
import inflectAdj from './adjectives/inflect.js'
|
|
21
|
+
import adjToRoot from './adjectives/toRoot.js'
|
|
22
|
+
import toPlural from './nouns/toPlural.js'
|
|
23
|
+
import toSingular from './nouns/toSingular.js'
|
|
24
|
+
|
|
25
|
+
const allAdj = (inf) => Object.values(inflectAdj(inf))
|
|
26
|
+
const allNoun = (sing) => [sing, toPlural(sing).one]
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
verb: {
|
|
30
|
+
all,
|
|
31
|
+
toPresent,
|
|
32
|
+
toPast,
|
|
33
|
+
toSubjunctive1,
|
|
34
|
+
toSubjunctive2,
|
|
35
|
+
toImperative,
|
|
36
|
+
toPastParticiple,
|
|
37
|
+
toPresentParticiple,
|
|
38
|
+
fromPresent,
|
|
39
|
+
fromPast,
|
|
40
|
+
fromSubjunctive1,
|
|
41
|
+
fromSubjunctive2,
|
|
42
|
+
fromImperative,
|
|
43
|
+
fromPresentParticiple,
|
|
44
|
+
fromPastParticiple
|
|
45
|
+
},
|
|
46
|
+
adjective: {
|
|
47
|
+
inflect: inflectAdj,
|
|
48
|
+
toRoot: adjToRoot,
|
|
49
|
+
all: allAdj
|
|
50
|
+
},
|
|
51
|
+
noun: {
|
|
52
|
+
toPlural,
|
|
53
|
+
toSingular,
|
|
54
|
+
all: allNoun
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* eslint-disable no-console, no-unused-vars */
|
|
2
|
+
import toRoot from './toRoot.js'
|
|
3
|
+
import model from '/Users/spencer/mountain/de-compromise/data/models/nouns.js'
|
|
4
|
+
|
|
5
|
+
let all = []
|
|
6
|
+
let suff = ''
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const topk = function (arr) {
|
|
10
|
+
let obj = {}
|
|
11
|
+
arr.forEach(a => {
|
|
12
|
+
obj[a] = obj[a] || 0
|
|
13
|
+
obj[a] += 1
|
|
14
|
+
})
|
|
15
|
+
let res = Object.keys(obj).map(k => [k, obj[k]])
|
|
16
|
+
return res.sort((a, b) => (a[1] > b[1] ? -1 : 0))
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const percent = (part, total) => {
|
|
20
|
+
let num = (part / total) * 100;
|
|
21
|
+
num = Math.round(num * 10) / 10;
|
|
22
|
+
return num;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
let ends = []
|
|
27
|
+
let correct = 0
|
|
28
|
+
let total = 0
|
|
29
|
+
Object.keys(model).forEach(inf => {
|
|
30
|
+
model[inf].s.forEach(str => {
|
|
31
|
+
let have = toRoot(str)
|
|
32
|
+
total += 1
|
|
33
|
+
if (have === inf) {
|
|
34
|
+
correct += 1
|
|
35
|
+
} else {
|
|
36
|
+
ends.push(str.substring(str.length - 4, str.length))
|
|
37
|
+
if (str.endsWith('ist')) {
|
|
38
|
+
|
|
39
|
+
console.log(inf, str, have)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
console.log(percent(correct, total))
|
|
45
|
+
console.log(topk(ends))
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
let models = [
|
|
3
|
+
{
|
|
4
|
+
fallback: 'n',
|
|
5
|
+
rules: [
|
|
6
|
+
['en', 'en'], ['é', 'és'],
|
|
7
|
+
['c', 'cs'], ['w', 'ws'],
|
|
8
|
+
['v', 've'], ['y', 'ys'],
|
|
9
|
+
['u', 'uen'], ['b', 'be'],
|
|
10
|
+
['p', 'ps'], ['z', 'zen'],
|
|
11
|
+
['o', 'os'], ['a', 'as'],
|
|
12
|
+
['f', 'fe'], ['s', 'se'],
|
|
13
|
+
['i', 'ien'], ['m', 'me'],
|
|
14
|
+
['k', 'ke'], ['h', 'he'],
|
|
15
|
+
['d', 'de'], ['l', 'l'],
|
|
16
|
+
['g', 'gen'], ['t', 'ten'],
|
|
17
|
+
['r', 'r'], ['n', 'nnen']
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
fallback: 'n',
|
|
22
|
+
rules: [
|
|
23
|
+
['en', 'ens'], ['é', 'és'],
|
|
24
|
+
['c', 'cs'], ['w', 'ws'],
|
|
25
|
+
['x', 'x'], ['v', 'vs'],
|
|
26
|
+
['y', 'ys'], ['u', 'u'],
|
|
27
|
+
['b', 'bs'], ['p', 'ps'],
|
|
28
|
+
['z', 'z'], ['o', 'os'],
|
|
29
|
+
['a', 'a'], ['f', 'fs'],
|
|
30
|
+
['s', 's'], ['i', 'i'],
|
|
31
|
+
['m', 'ms'], ['k', 'ks'],
|
|
32
|
+
['h', 'hs'], ['d', 'ds'],
|
|
33
|
+
['l', 'ls'], ['g', 'g'],
|
|
34
|
+
['t', 'ts'], ['r', 'rs'],
|
|
35
|
+
['n', 'n']
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
fallback: 'n',
|
|
40
|
+
rules: [
|
|
41
|
+
['nt', 'nten'], ['é', 'é'],
|
|
42
|
+
['c', 'c'], ['w', 'w'],
|
|
43
|
+
['x', 'x'], ['v', 've'],
|
|
44
|
+
['y', 'y'], ['u', 'u'],
|
|
45
|
+
['b', 'be'], ['p', 'p'],
|
|
46
|
+
['ß', 'ß'], ['z', 'z'],
|
|
47
|
+
['o', 'o'], ['a', 'a'],
|
|
48
|
+
['f', 'fe'], ['s', 's'],
|
|
49
|
+
['i', 'i'], ['m', 'me'],
|
|
50
|
+
['k', 'ke'], ['h', 'he'],
|
|
51
|
+
['d', 'de'], ['l', 'l'],
|
|
52
|
+
['g', 'g'], ['t', 'te'],
|
|
53
|
+
['r', 'r'], ['n', 'n']
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { convert } from 'suffix-thumb'
|
|
2
|
+
import model from '../models.js'
|
|
3
|
+
|
|
4
|
+
// fallback rules, when no trained model is available
|
|
5
|
+
let rules = [
|
|
6
|
+
['ein', ''],
|
|
7
|
+
['cht', 'e'],
|
|
8
|
+
['ll', 'e'],
|
|
9
|
+
['is', 'se'],
|
|
10
|
+
['kt', 'e'],
|
|
11
|
+
['tt', 'e'],
|
|
12
|
+
['rt', 'e'],
|
|
13
|
+
['ur', 'en'],
|
|
14
|
+
['ck', 'e'],
|
|
15
|
+
['at', 'e'],
|
|
16
|
+
['ft', 'en'],
|
|
17
|
+
['nd', 'e'],
|
|
18
|
+
['ei', 'en'],
|
|
19
|
+
['or', 'en'],
|
|
20
|
+
['ch', 'e'],
|
|
21
|
+
['it', 'en'],
|
|
22
|
+
['st', 'en'],
|
|
23
|
+
['nt', 'en'],
|
|
24
|
+
['el', ''],
|
|
25
|
+
['on', 'en'],
|
|
26
|
+
['en', ''],
|
|
27
|
+
['ng', 'en'],
|
|
28
|
+
['in', 'nen'],
|
|
29
|
+
['er', '']
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
const firstForm = function (str) {
|
|
33
|
+
if (model.nouns && model.nouns.plural) {
|
|
34
|
+
return convert(str, model.nouns.plural)
|
|
35
|
+
}
|
|
36
|
+
for (let i = 0; i < rules.length; i += 1) {
|
|
37
|
+
let [from, to] = rules[i]
|
|
38
|
+
if (str.endsWith(from)) {
|
|
39
|
+
return str + to
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return str + 'n'
|
|
43
|
+
}
|
|
44
|
+
const toPlural = function (str) {
|
|
45
|
+
return {
|
|
46
|
+
one: firstForm(str)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export default toPlural
|