de-compromise 0.0.9 → 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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/builds/de-compromise.cjs +2357 -1687
  3. package/builds/de-compromise.min.js +1 -1
  4. package/builds/de-compromise.mjs +1 -1
  5. package/package.json +21 -14
  6. package/src/01-one/lexicon/_data.js +32 -0
  7. package/src/01-one/lexicon/compute/root.js +55 -0
  8. package/src/01-one/lexicon/lexicon.js +95 -0
  9. package/src/01-one/lexicon/methods/_data.js +193 -0
  10. package/src/01-one/lexicon/methods/adjectives/_test-back.js +29 -0
  11. package/src/01-one/lexicon/methods/adjectives/_test.js +49 -0
  12. package/src/01-one/lexicon/methods/adjectives/inflect.js +27 -0
  13. package/src/01-one/lexicon/methods/adjectives/model.js +126 -0
  14. package/src/01-one/lexicon/methods/adjectives/new/adjective.js +8 -0
  15. package/src/01-one/lexicon/methods/adjectives/new/comparative.js +7 -0
  16. package/src/01-one/lexicon/methods/adjectives/new/superlative.js +159 -0
  17. package/src/01-one/lexicon/methods/adjectives/toRoot.js +47 -0
  18. package/src/01-one/lexicon/methods/index.js +56 -0
  19. package/src/01-one/lexicon/methods/models.js +10 -0
  20. package/src/01-one/lexicon/methods/nouns/_test-back.js +45 -0
  21. package/src/01-one/lexicon/methods/nouns/new.js +56 -0
  22. package/src/01-one/lexicon/methods/nouns/toPlural.js +49 -0
  23. package/src/01-one/lexicon/methods/nouns/toSingular.js +46 -0
  24. package/src/01-one/lexicon/methods/verbs/conjugate.js +87 -0
  25. package/src/01-one/lexicon/methods/verbs/custom/_test-from.js +53 -0
  26. package/src/01-one/lexicon/methods/verbs/custom/_test-to.js +50 -0
  27. package/src/01-one/lexicon/methods/verbs/custom/fromPastParticiple.js +37 -0
  28. package/src/01-one/lexicon/methods/verbs/custom/rules.js +182 -0
  29. package/src/01-one/lexicon/methods/verbs/custom/toPastParticiple.js +54 -0
  30. package/src/01-one/lexicon/methods/verbs/irregulars.js +202 -0
  31. package/src/01-one/lexicon/methods/verbs/toRoot.js +55 -0
  32. package/src/01-one/lexicon/misc.js +78 -0
  33. package/src/01-one/lexicon/plugin.js +14 -0
  34. package/src/01-one/splitter/build.js +20 -0
  35. package/src/01-one/splitter/compute/splitter.js +54 -0
  36. package/src/01-one/splitter/model/index.js +20 -0
  37. package/src/01-one/splitter/plugin.js +10 -0
  38. package/src/01-one/splitter/trie.js +40 -0
  39. package/src/01-one/tagset/plugin.js +11 -0
  40. package/src/01-one/tagset/tags/dates.js +45 -0
  41. package/src/01-one/tagset/tags/misc.js +70 -0
  42. package/src/01-one/tagset/tags/nouns.js +116 -0
  43. package/src/01-one/tagset/tags/values.js +47 -0
  44. package/src/01-one/tagset/tags/verbs.js +64 -0
  45. package/src/01-one/tokenizer/contractions.js +40 -0
  46. package/src/01-one/tokenizer/is-sentence.js +37 -0
  47. package/src/01-one/tokenizer/plugin.js +11 -0
  48. package/src/01-one/tokenizer/unicode.js +55 -0
  49. package/src/02-two/postTagger/matches.js +47 -0
  50. package/src/02-two/postTagger/plugin.js +8 -0
  51. package/src/02-two/preTagger/compute/1st-pass/regex.js +43 -0
  52. package/src/02-two/preTagger/compute/1st-pass/titlecase.js +21 -0
  53. package/src/02-two/preTagger/compute/1st-pass/year.js +54 -0
  54. package/src/02-two/preTagger/compute/2nd-pass/acronym.js +82 -0
  55. package/src/02-two/preTagger/compute/2nd-pass/fallback.js +27 -0
  56. package/src/02-two/preTagger/compute/2nd-pass/prefix-lookup.js +33 -0
  57. package/src/02-two/preTagger/compute/2nd-pass/suffix-lookup.js +44 -0
  58. package/src/02-two/preTagger/compute/index.js +42 -0
  59. package/src/02-two/preTagger/model/index.js +14 -0
  60. package/src/02-two/preTagger/model/prefixes.js +46 -0
  61. package/src/02-two/preTagger/model/regex/regex-normal.js +25 -0
  62. package/src/02-two/preTagger/model/regex/regex-numbers.js +62 -0
  63. package/src/02-two/preTagger/model/regex/regex-text.js +17 -0
  64. package/src/02-two/preTagger/model/suffixes.js +171 -0
  65. package/src/02-two/preTagger/plugin.js +12 -0
  66. package/src/03-three/adjectives/api.js +34 -0
  67. package/src/03-three/adjectives/plugin.js +5 -0
  68. package/src/03-three/nouns/api.js +74 -0
  69. package/src/03-three/nouns/plugin.js +5 -0
  70. package/src/03-three/numbers/api.js +259 -0
  71. package/src/03-three/numbers/data.js +77 -0
  72. package/src/03-three/numbers/format/index.js +27 -0
  73. package/src/03-three/numbers/format/toText.js +118 -0
  74. package/src/03-three/numbers/parse/fromText.js +52 -0
  75. package/src/03-three/numbers/parse/index.js +63 -0
  76. package/src/03-three/numbers/plugin.js +5 -0
  77. package/src/03-three/verbs/api.js +41 -0
  78. package/src/03-three/verbs/plugin.js +5 -0
  79. package/src/_lib.js +4 -0
  80. package/src/_version.js +1 -0
  81. package/src/index.js +53 -0
  82. package/types/index.d.ts +46 -0
  83. package/types/misc.ts +92 -0
  84. package/types/view/de.ts +61 -0
  85. 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,8 @@
1
+ /* eslint-disable no-unused-vars */
2
+ let models = [
3
+ { fallback: 'er', rules: [['e', 'er']] },
4
+ { fallback: 'en', rules: [['e', 'en']] },
5
+ { fallback: 'e', rules: [['e', 'e']] },
6
+ { fallback: 'es', rules: [['e', 'es']] }
7
+
8
+ ]
@@ -0,0 +1,7 @@
1
+ /* eslint-disable no-unused-vars */
2
+ let models = [
3
+ { fallback: 'erer', rules: [['e', 'erer']] },
4
+ { fallback: 'eren', rules: [['e', 'eren']] },
5
+ { fallback: 'ere', rules: [['e', 'ere']] },
6
+ { fallback: 'eres', rules: [['e', 'eres']] }
7
+ ]
@@ -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,10 @@
1
+ import { uncompress } from 'suffix-thumb'
2
+ import model from './_data.js'
3
+
4
+ // uncompress them
5
+ Object.keys(model).forEach(k => {
6
+ Object.keys(model[k]).forEach(form => {
7
+ model[k][form] = uncompress(model[k][form])
8
+ })
9
+ })
10
+ export default model
@@ -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