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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/builds/de-compromise.cjs +2354 -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,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")