de-compromise 0.0.4 → 0.0.6
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/LICENSE +21 -0
- package/README.md +1 -0
- package/builds/de-compromise.cjs +921 -284
- package/builds/de-compromise.min.js +1 -2
- package/builds/de-compromise.mjs +1 -2
- package/package.json +7 -5
package/builds/de-compromise.cjs
CHANGED
|
@@ -53,6 +53,8 @@
|
|
|
53
53
|
};
|
|
54
54
|
var compute$9 = fns$4;
|
|
55
55
|
|
|
56
|
+
// wrappers for loops in javascript arrays
|
|
57
|
+
|
|
56
58
|
const forEach = function (cb) {
|
|
57
59
|
let ptrs = this.fullPointer;
|
|
58
60
|
ptrs.forEach((ptr, i) => {
|
|
@@ -64,11 +66,14 @@
|
|
|
64
66
|
|
|
65
67
|
const map = function (cb, empty) {
|
|
66
68
|
let ptrs = this.fullPointer;
|
|
67
|
-
// let cache = this._cache || []
|
|
68
69
|
let res = ptrs.map((ptr, i) => {
|
|
69
70
|
let view = this.update([ptr]);
|
|
70
|
-
|
|
71
|
-
return
|
|
71
|
+
let out = cb(view, i);
|
|
72
|
+
// if we returned nothing, return a view
|
|
73
|
+
if (out === undefined) {
|
|
74
|
+
return this.none()
|
|
75
|
+
}
|
|
76
|
+
return out
|
|
72
77
|
});
|
|
73
78
|
if (res.length === 0) {
|
|
74
79
|
return empty || this.update([])
|
|
@@ -95,23 +100,18 @@
|
|
|
95
100
|
|
|
96
101
|
const filter = function (cb) {
|
|
97
102
|
let ptrs = this.fullPointer;
|
|
98
|
-
// let cache = this._cache || []
|
|
99
103
|
ptrs = ptrs.filter((ptr, i) => {
|
|
100
104
|
let view = this.update([ptr]);
|
|
101
|
-
// view._cache = cache[i]
|
|
102
105
|
return cb(view, i)
|
|
103
106
|
});
|
|
104
|
-
let res = this.update(ptrs);
|
|
105
|
-
// res._cache = ptrs.map(ptr => cache[ptr[0]])
|
|
107
|
+
let res = this.update(ptrs);
|
|
106
108
|
return res
|
|
107
109
|
};
|
|
108
110
|
|
|
109
111
|
const find = function (cb) {
|
|
110
112
|
let ptrs = this.fullPointer;
|
|
111
|
-
// let cache = this._cache || []
|
|
112
113
|
let found = ptrs.find((ptr, i) => {
|
|
113
114
|
let view = this.update([ptr]);
|
|
114
|
-
// view._cache = cache[i]
|
|
115
115
|
return cb(view, i)
|
|
116
116
|
});
|
|
117
117
|
return this.update([found])
|
|
@@ -119,10 +119,8 @@
|
|
|
119
119
|
|
|
120
120
|
const some = function (cb) {
|
|
121
121
|
let ptrs = this.fullPointer;
|
|
122
|
-
// let cache = this._cache || []
|
|
123
122
|
return ptrs.some((ptr, i) => {
|
|
124
123
|
let view = this.update([ptr]);
|
|
125
|
-
// view._cache = cache[i]
|
|
126
124
|
return cb(view, i)
|
|
127
125
|
})
|
|
128
126
|
};
|
|
@@ -176,14 +174,11 @@
|
|
|
176
174
|
/** */
|
|
177
175
|
eq: function (n) {
|
|
178
176
|
let ptr = this.pointer;
|
|
179
|
-
let cache = this._cache || [];
|
|
180
177
|
if (!ptr) {
|
|
181
178
|
ptr = this.docs.map((_doc, i) => [i]);
|
|
182
179
|
}
|
|
183
180
|
if (ptr[n]) {
|
|
184
|
-
|
|
185
|
-
view._cache = cache[n];
|
|
186
|
-
return view
|
|
181
|
+
return this.update([ptr[n]])
|
|
187
182
|
}
|
|
188
183
|
return this.none()
|
|
189
184
|
},
|
|
@@ -268,7 +263,7 @@
|
|
|
268
263
|
|
|
269
264
|
// aliases
|
|
270
265
|
methods$l.get = methods$l.eq;
|
|
271
|
-
var api$
|
|
266
|
+
var api$f = methods$l;
|
|
272
267
|
|
|
273
268
|
class View {
|
|
274
269
|
constructor(document, pointer, groups = {}) {
|
|
@@ -342,31 +337,27 @@
|
|
|
342
337
|
update(pointer) {
|
|
343
338
|
let m = new View(this.document, pointer);
|
|
344
339
|
// send the cache down, too?
|
|
345
|
-
if (
|
|
346
|
-
// only if it's full
|
|
340
|
+
if (this._cache && pointer && pointer.length > 0) {
|
|
341
|
+
// only keep cache if it's a full-sentence
|
|
347
342
|
let cache = [];
|
|
348
|
-
pointer.forEach(ptr => {
|
|
343
|
+
pointer.forEach((ptr, i) => {
|
|
344
|
+
let [n, start, end] = ptr;
|
|
349
345
|
if (ptr.length === 1) {
|
|
350
|
-
cache.
|
|
346
|
+
cache[i] = this._cache[n];
|
|
347
|
+
} else if (start === 0 && this.document[n].length === end) {
|
|
348
|
+
cache[i] = this._cache[n];
|
|
351
349
|
}
|
|
352
|
-
// let [n, start, end] = ptr
|
|
353
|
-
// if (start === 0 && this.document[n][end - 1] && !this.document[n][end]) {
|
|
354
|
-
// console.log('=-=-=-= here -=-=-=-')
|
|
355
|
-
// }
|
|
356
350
|
});
|
|
357
|
-
|
|
351
|
+
if (cache.length > 0) {
|
|
352
|
+
m._cache = cache;
|
|
353
|
+
}
|
|
358
354
|
}
|
|
359
355
|
m.world = this.world;
|
|
360
356
|
return m
|
|
361
357
|
}
|
|
362
358
|
// create a new View, from this one
|
|
363
359
|
toView(pointer) {
|
|
364
|
-
|
|
365
|
-
pointer = this.pointer;
|
|
366
|
-
}
|
|
367
|
-
let m = new View(this.document, pointer);
|
|
368
|
-
// m._cache = this._cache // share this full thing
|
|
369
|
-
return m
|
|
360
|
+
return new View(this.document, pointer || this.pointer)
|
|
370
361
|
}
|
|
371
362
|
fromText(input) {
|
|
372
363
|
const { methods } = this;
|
|
@@ -397,10 +388,10 @@
|
|
|
397
388
|
return m
|
|
398
389
|
}
|
|
399
390
|
}
|
|
400
|
-
Object.assign(View.prototype, api$
|
|
391
|
+
Object.assign(View.prototype, api$f);
|
|
401
392
|
var View$1 = View;
|
|
402
393
|
|
|
403
|
-
var version$1 = '14.
|
|
394
|
+
var version$1 = '14.6.0';
|
|
404
395
|
|
|
405
396
|
const isObject$6 = function (item) {
|
|
406
397
|
return item && typeof item === 'object' && !Array.isArray(item)
|
|
@@ -435,6 +426,54 @@
|
|
|
435
426
|
return model
|
|
436
427
|
}
|
|
437
428
|
|
|
429
|
+
const addIrregulars = function (model, conj) {
|
|
430
|
+
let m = model.two.models || {};
|
|
431
|
+
Object.keys(conj).forEach(k => {
|
|
432
|
+
// verb forms
|
|
433
|
+
if (conj[k].pastTense) {
|
|
434
|
+
if (m.toPast) {
|
|
435
|
+
m.toPast.exceptions[k] = conj[k].pastTense;
|
|
436
|
+
}
|
|
437
|
+
if (m.fromPast) {
|
|
438
|
+
m.fromPast.exceptions[conj[k].pastTense] = k;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (conj[k].presentTense) {
|
|
442
|
+
if (m.toPresent) {
|
|
443
|
+
m.toPresent.exceptions[k] = conj[k].presentTense;
|
|
444
|
+
}
|
|
445
|
+
if (m.fromPresent) {
|
|
446
|
+
m.fromPresent.exceptions[conj[k].presentTense] = k;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (conj[k].gerund) {
|
|
450
|
+
if (m.toGerund) {
|
|
451
|
+
m.toGerund.exceptions[k] = conj[k].gerund;
|
|
452
|
+
}
|
|
453
|
+
if (m.fromGerund) {
|
|
454
|
+
m.fromGerund.exceptions[conj[k].gerund] = k;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
// adjective forms
|
|
458
|
+
if (conj[k].comparative) {
|
|
459
|
+
if (m.toComparative) {
|
|
460
|
+
m.toComparative.exceptions[k] = conj[k].comparative;
|
|
461
|
+
}
|
|
462
|
+
if (m.fromComparative) {
|
|
463
|
+
m.fromComparative.exceptions[conj[k].comparative] = k;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (conj[k].superlative) {
|
|
467
|
+
if (m.toSuperlative) {
|
|
468
|
+
m.toSuperlative.exceptions[k] = conj[k].superlative;
|
|
469
|
+
}
|
|
470
|
+
if (m.fromSuperlative) {
|
|
471
|
+
m.fromSuperlative.exceptions[conj[k].superlative] = k;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
};
|
|
476
|
+
|
|
438
477
|
const extend = function (plugin, world, View, nlp) {
|
|
439
478
|
const { methods, model, compute, hooks } = world;
|
|
440
479
|
if (plugin.methods) {
|
|
@@ -443,6 +482,9 @@
|
|
|
443
482
|
if (plugin.model) {
|
|
444
483
|
mergeDeep(model, plugin.model);
|
|
445
484
|
}
|
|
485
|
+
if (plugin.irregulars) {
|
|
486
|
+
addIrregulars(model, plugin.irregulars);
|
|
487
|
+
}
|
|
446
488
|
// shallow-merge compute
|
|
447
489
|
if (plugin.compute) {
|
|
448
490
|
Object.assign(compute, plugin.compute);
|
|
@@ -583,7 +625,6 @@
|
|
|
583
625
|
return doc
|
|
584
626
|
};
|
|
585
627
|
|
|
586
|
-
|
|
587
628
|
/** extend compromise functionality */
|
|
588
629
|
nlp.plugin = function (plugin) {
|
|
589
630
|
extend$1(plugin, this._world, View$1, this);
|
|
@@ -671,7 +712,7 @@
|
|
|
671
712
|
const addAPI$3 = function (View) {
|
|
672
713
|
Object.assign(View.prototype, methods$j);
|
|
673
714
|
};
|
|
674
|
-
var api$
|
|
715
|
+
var api$e = addAPI$3;
|
|
675
716
|
|
|
676
717
|
var compute$8 = {
|
|
677
718
|
cache: function (view) {
|
|
@@ -680,7 +721,7 @@
|
|
|
680
721
|
};
|
|
681
722
|
|
|
682
723
|
var cache$1 = {
|
|
683
|
-
api: api$
|
|
724
|
+
api: api$e,
|
|
684
725
|
compute: compute$8,
|
|
685
726
|
methods: methods$k,
|
|
686
727
|
};
|
|
@@ -859,7 +900,7 @@
|
|
|
859
900
|
after 46-thousand sentences
|
|
860
901
|
|
|
861
902
|
*/
|
|
862
|
-
let
|
|
903
|
+
let index$2 = 0;
|
|
863
904
|
|
|
864
905
|
const pad3 = (str) => {
|
|
865
906
|
str = str.length < 3 ? '0' + str : str;
|
|
@@ -868,19 +909,17 @@
|
|
|
868
909
|
|
|
869
910
|
const toId = function (term) {
|
|
870
911
|
let [n, i] = term.index || [0, 0];
|
|
871
|
-
|
|
872
|
-
var now = start$1;
|
|
873
|
-
now = parseInt(now, 10);
|
|
912
|
+
index$2 += 1;
|
|
874
913
|
|
|
875
|
-
//don't overflow
|
|
876
|
-
|
|
914
|
+
//don't overflow index
|
|
915
|
+
index$2 = index$2 > 46655 ? 0 : index$2;
|
|
877
916
|
//don't overflow sentences
|
|
878
|
-
n = n > 46655 ?
|
|
917
|
+
n = n > 46655 ? 0 : n;
|
|
879
918
|
// //don't overflow terms
|
|
880
|
-
i = i > 1294 ?
|
|
919
|
+
i = i > 1294 ? 0 : i;
|
|
881
920
|
|
|
882
921
|
// 3 digits for time
|
|
883
|
-
let id = pad3(
|
|
922
|
+
let id = pad3(index$2.toString(36));
|
|
884
923
|
// 3 digit for sentence index (46k)
|
|
885
924
|
id += pad3(n.toString(36));
|
|
886
925
|
|
|
@@ -903,7 +942,7 @@
|
|
|
903
942
|
// are we inserting inside a contraction?
|
|
904
943
|
// expand it first
|
|
905
944
|
const expand$2 = function (m) {
|
|
906
|
-
if (m.has('@hasContraction')) {//&& m.after('^.').has('@hasContraction')
|
|
945
|
+
if (m.has('@hasContraction') && typeof m.contractions === 'function') {//&& m.after('^.').has('@hasContraction')
|
|
907
946
|
let more = m.grow('@hasContraction');
|
|
908
947
|
more.contractions().expand();
|
|
909
948
|
}
|
|
@@ -928,7 +967,7 @@
|
|
|
928
967
|
}
|
|
929
968
|
//allow a view object
|
|
930
969
|
if (typeof input === 'object' && input.isView) {
|
|
931
|
-
return input.clone().docs[0] //assume one sentence
|
|
970
|
+
return input.clone().docs[0] || [] //assume one sentence
|
|
932
971
|
}
|
|
933
972
|
//allow an array of terms, too
|
|
934
973
|
if (isArray$7(input)) {
|
|
@@ -939,6 +978,7 @@
|
|
|
939
978
|
|
|
940
979
|
const insert = function (input, view, prepend) {
|
|
941
980
|
const { document, world } = view;
|
|
981
|
+
view.uncache();
|
|
942
982
|
// insert words at end of each doc
|
|
943
983
|
let ptrs = view.fullPointer;
|
|
944
984
|
let selfPtrs = view.fullPointer;
|
|
@@ -948,6 +988,10 @@
|
|
|
948
988
|
// add-in the words
|
|
949
989
|
let home = document[n];
|
|
950
990
|
let terms = getTerms(input, world);
|
|
991
|
+
// are we inserting nothing?
|
|
992
|
+
if (terms.length === 0) {
|
|
993
|
+
return
|
|
994
|
+
}
|
|
951
995
|
terms = addIds$2(terms);
|
|
952
996
|
if (prepend) {
|
|
953
997
|
expand$2(view.update([ptr]).firstTerm());
|
|
@@ -1027,6 +1071,7 @@
|
|
|
1027
1071
|
fns$2.replaceWith = function (input, keep = {}) {
|
|
1028
1072
|
let ptrs = this.fullPointer;
|
|
1029
1073
|
let main = this;
|
|
1074
|
+
this.uncache();
|
|
1030
1075
|
if (typeof input === 'function') {
|
|
1031
1076
|
return replaceByFn(main, input)
|
|
1032
1077
|
}
|
|
@@ -1073,6 +1118,7 @@
|
|
|
1073
1118
|
if (!m.found) {
|
|
1074
1119
|
return this
|
|
1075
1120
|
}
|
|
1121
|
+
this.soften();
|
|
1076
1122
|
return m.replaceWith(input, keep)
|
|
1077
1123
|
};
|
|
1078
1124
|
var replace = fns$2;
|
|
@@ -1172,6 +1218,7 @@
|
|
|
1172
1218
|
/** */
|
|
1173
1219
|
remove: function (reg) {
|
|
1174
1220
|
const { indexN } = this.methods.one.pointer;
|
|
1221
|
+
this.uncache();
|
|
1175
1222
|
// two modes:
|
|
1176
1223
|
// - a. remove self, from full parent
|
|
1177
1224
|
let self = this.all();
|
|
@@ -1181,9 +1228,10 @@
|
|
|
1181
1228
|
self = this;
|
|
1182
1229
|
not = this.match(reg);
|
|
1183
1230
|
}
|
|
1231
|
+
let isFull = !self.ptrs;
|
|
1184
1232
|
// is it part of a contraction?
|
|
1185
|
-
if (
|
|
1186
|
-
let more =
|
|
1233
|
+
if (not.has('@hasContraction') && not.contractions) {
|
|
1234
|
+
let more = not.grow('@hasContraction');
|
|
1187
1235
|
more.contractions().expand();
|
|
1188
1236
|
}
|
|
1189
1237
|
|
|
@@ -1194,16 +1242,18 @@
|
|
|
1194
1242
|
// repair our pointers
|
|
1195
1243
|
let gonePtrs = indexN(nots);
|
|
1196
1244
|
ptrs = fixPointers$1(ptrs, gonePtrs);
|
|
1197
|
-
|
|
1198
1245
|
// clean up our original inputs
|
|
1199
1246
|
self.ptrs = ptrs;
|
|
1200
1247
|
self.document = document;
|
|
1201
1248
|
self.compute('index');
|
|
1249
|
+
// if we started zoomed-out, try to end zoomed-out
|
|
1250
|
+
if (isFull) {
|
|
1251
|
+
self.ptrs = undefined;
|
|
1252
|
+
}
|
|
1202
1253
|
if (!reg) {
|
|
1203
1254
|
this.ptrs = [];
|
|
1204
1255
|
return self.none()
|
|
1205
1256
|
}
|
|
1206
|
-
// self._cache = null
|
|
1207
1257
|
let res = self.toView(ptrs); //return new document
|
|
1208
1258
|
return res
|
|
1209
1259
|
},
|
|
@@ -1318,7 +1368,7 @@
|
|
|
1318
1368
|
methods$h.deHyphenate = methods$h.dehyphenate;
|
|
1319
1369
|
methods$h.toQuotation = methods$h.toQuotations;
|
|
1320
1370
|
|
|
1321
|
-
var whitespace
|
|
1371
|
+
var whitespace = methods$h;
|
|
1322
1372
|
|
|
1323
1373
|
/** alphabetical order */
|
|
1324
1374
|
const alpha = (a, b) => {
|
|
@@ -1410,6 +1460,7 @@
|
|
|
1410
1460
|
/** re-arrange the order of the matches (in place) */
|
|
1411
1461
|
const sort = function (input) {
|
|
1412
1462
|
let { docs, pointer } = this;
|
|
1463
|
+
this.uncache();
|
|
1413
1464
|
if (typeof input === 'function') {
|
|
1414
1465
|
return customSort(this, input)
|
|
1415
1466
|
}
|
|
@@ -1449,6 +1500,9 @@
|
|
|
1449
1500
|
let ptrs = this.pointer || this.docs.map((_d, n) => [n]);
|
|
1450
1501
|
ptrs = [].concat(ptrs);
|
|
1451
1502
|
ptrs = ptrs.reverse();
|
|
1503
|
+
if (this._cache) {
|
|
1504
|
+
this._cache = this._cache.reverse();
|
|
1505
|
+
}
|
|
1452
1506
|
return this.update(ptrs)
|
|
1453
1507
|
};
|
|
1454
1508
|
|
|
@@ -1541,12 +1595,12 @@
|
|
|
1541
1595
|
};
|
|
1542
1596
|
var harden$1 = { harden, soften };
|
|
1543
1597
|
|
|
1544
|
-
const methods$f = Object.assign({}, caseFns, insert$1, replace, remove, whitespace
|
|
1598
|
+
const methods$f = Object.assign({}, caseFns, insert$1, replace, remove, whitespace, sort$1, concat, harden$1);
|
|
1545
1599
|
|
|
1546
1600
|
const addAPI$2 = function (View) {
|
|
1547
1601
|
Object.assign(View.prototype, methods$f);
|
|
1548
1602
|
};
|
|
1549
|
-
var api$
|
|
1603
|
+
var api$d = addAPI$2;
|
|
1550
1604
|
|
|
1551
1605
|
const compute$6 = {
|
|
1552
1606
|
id: function (view) {
|
|
@@ -1563,7 +1617,7 @@
|
|
|
1563
1617
|
var compute$7 = compute$6;
|
|
1564
1618
|
|
|
1565
1619
|
var change = {
|
|
1566
|
-
api: api$
|
|
1620
|
+
api: api$d,
|
|
1567
1621
|
compute: compute$7,
|
|
1568
1622
|
};
|
|
1569
1623
|
|
|
@@ -1793,6 +1847,37 @@
|
|
|
1793
1847
|
};
|
|
1794
1848
|
var numberRange$1 = numberRange;
|
|
1795
1849
|
|
|
1850
|
+
const numUnit = /^([+-]?[0-9][.,0-9]*)([a-z°²³µ/]+)$/; //(must be lowercase)
|
|
1851
|
+
|
|
1852
|
+
const notUnit = new Set([
|
|
1853
|
+
'st',
|
|
1854
|
+
'nd',
|
|
1855
|
+
'rd',
|
|
1856
|
+
'th',
|
|
1857
|
+
'am',
|
|
1858
|
+
'pm',
|
|
1859
|
+
'max',
|
|
1860
|
+
'°',
|
|
1861
|
+
's', // 1990s
|
|
1862
|
+
'e' // 18e - french/spanish ordinal
|
|
1863
|
+
]);
|
|
1864
|
+
|
|
1865
|
+
const numberUnit = function (terms, i) {
|
|
1866
|
+
let term = terms[i];
|
|
1867
|
+
let parts = term.text.match(numUnit);
|
|
1868
|
+
if (parts !== null) {
|
|
1869
|
+
// is it a recognized unit, like 'km'?
|
|
1870
|
+
let unit = parts[2].toLowerCase().trim();
|
|
1871
|
+
// don't split '3rd'
|
|
1872
|
+
if (notUnit.has(unit)) {
|
|
1873
|
+
return null
|
|
1874
|
+
}
|
|
1875
|
+
return [parts[1], unit] //split it
|
|
1876
|
+
}
|
|
1877
|
+
return null
|
|
1878
|
+
};
|
|
1879
|
+
var numberUnit$1 = numberUnit;
|
|
1880
|
+
|
|
1796
1881
|
const byApostrophe = /'/;
|
|
1797
1882
|
const numDash = /^[0-9][^-–—]*[-–—].*?[0-9]/;
|
|
1798
1883
|
|
|
@@ -1809,10 +1894,6 @@
|
|
|
1809
1894
|
end += 1;
|
|
1810
1895
|
}
|
|
1811
1896
|
tmp.ptrs = [[0, start, end]];
|
|
1812
|
-
tmp.compute('lexicon');
|
|
1813
|
-
if (tmp.world.compute.preTagger) {
|
|
1814
|
-
tmp.compute('preTagger');
|
|
1815
|
-
}
|
|
1816
1897
|
};
|
|
1817
1898
|
|
|
1818
1899
|
const byEnd = {
|
|
@@ -1854,7 +1935,7 @@
|
|
|
1854
1935
|
|
|
1855
1936
|
const toDocs = function (words, view) {
|
|
1856
1937
|
let doc = view.fromText(words.join(' '));
|
|
1857
|
-
doc.compute('id');
|
|
1938
|
+
doc.compute(['id', 'alias']);
|
|
1858
1939
|
return doc.docs[0]
|
|
1859
1940
|
};
|
|
1860
1941
|
|
|
@@ -1863,6 +1944,7 @@
|
|
|
1863
1944
|
let { world, document } = view;
|
|
1864
1945
|
const { model, methods } = world;
|
|
1865
1946
|
let list = model.one.contractions || [];
|
|
1947
|
+
new Set(model.one.units || []);
|
|
1866
1948
|
// each sentence
|
|
1867
1949
|
document.forEach((terms, n) => {
|
|
1868
1950
|
// loop through terms backwards
|
|
@@ -1898,10 +1980,18 @@
|
|
|
1898
1980
|
methods.one.setTag(words, 'NumberRange', world);//add custom tag
|
|
1899
1981
|
// is it a time-range, like '5-9pm'
|
|
1900
1982
|
if (words[2] && words[2].tags.has('Time')) {
|
|
1901
|
-
methods.one.setTag([words[0]], 'Time', world);
|
|
1983
|
+
methods.one.setTag([words[0]], 'Time', world, null, 'time-range');
|
|
1902
1984
|
}
|
|
1903
1985
|
reTag(document[n], view, i, words.length);
|
|
1904
1986
|
}
|
|
1987
|
+
continue
|
|
1988
|
+
}
|
|
1989
|
+
// split-apart '4km'
|
|
1990
|
+
words = numberUnit$1(terms, i);
|
|
1991
|
+
if (words) {
|
|
1992
|
+
words = toDocs(words, view);
|
|
1993
|
+
splice(document, [n, i], words);
|
|
1994
|
+
methods.one.setTag([words[1]], 'Unit', world, null, 'contraction-unit');
|
|
1905
1995
|
}
|
|
1906
1996
|
}
|
|
1907
1997
|
});
|
|
@@ -2002,7 +2092,7 @@
|
|
|
2002
2092
|
|
|
2003
2093
|
// tag any words in our lexicon - even if it hasn't been filled-up yet
|
|
2004
2094
|
// rest of pre-tagger is in ./two/preTagger
|
|
2005
|
-
const
|
|
2095
|
+
const lexicon$5 = function (view) {
|
|
2006
2096
|
const world = view.world;
|
|
2007
2097
|
view.docs.forEach(terms => {
|
|
2008
2098
|
for (let i = 0; i < terms.length; i += 1) {
|
|
@@ -2017,7 +2107,7 @@
|
|
|
2017
2107
|
};
|
|
2018
2108
|
|
|
2019
2109
|
var compute$4 = {
|
|
2020
|
-
lexicon:
|
|
2110
|
+
lexicon: lexicon$5
|
|
2021
2111
|
};
|
|
2022
2112
|
|
|
2023
2113
|
// derive clever things from our lexicon key-value pairs
|
|
@@ -2026,12 +2116,12 @@
|
|
|
2026
2116
|
let lex = {};
|
|
2027
2117
|
// console.log('start:', Object.keys(lex).length)
|
|
2028
2118
|
let _multi = {};
|
|
2029
|
-
|
|
2030
2119
|
// go through each word in this key-value obj:
|
|
2031
2120
|
Object.keys(words).forEach(word => {
|
|
2032
2121
|
let tag = words[word];
|
|
2033
2122
|
// normalize lexicon a little bit
|
|
2034
2123
|
word = word.toLowerCase().trim();
|
|
2124
|
+
word = word.replace(/'s\b/, '');
|
|
2035
2125
|
// cache multi-word terms
|
|
2036
2126
|
let split = word.split(/ /);
|
|
2037
2127
|
if (split.length > 1) {
|
|
@@ -2241,7 +2331,7 @@
|
|
|
2241
2331
|
return Object.prototype.toString.call(val) === '[object Object]'
|
|
2242
2332
|
};
|
|
2243
2333
|
|
|
2244
|
-
function api$
|
|
2334
|
+
function api$c (View) {
|
|
2245
2335
|
|
|
2246
2336
|
/** find all matches in this document */
|
|
2247
2337
|
View.prototype.lookup = function (input, opts = {}) {
|
|
@@ -2290,14 +2380,16 @@
|
|
|
2290
2380
|
/** pre-compile a list of matches to lookup */
|
|
2291
2381
|
const lib$4 = {
|
|
2292
2382
|
/** turn an array or object into a compressed trie*/
|
|
2293
|
-
|
|
2383
|
+
buildTrie: function (input) {
|
|
2294
2384
|
const trie = build(input, this.world());
|
|
2295
2385
|
return compress$1(trie)
|
|
2296
2386
|
}
|
|
2297
2387
|
};
|
|
2388
|
+
// add alias
|
|
2389
|
+
lib$4.compile = lib$4.buildTrie;
|
|
2298
2390
|
|
|
2299
2391
|
var lookup = {
|
|
2300
|
-
api: api$
|
|
2392
|
+
api: api$c,
|
|
2301
2393
|
lib: lib$4
|
|
2302
2394
|
};
|
|
2303
2395
|
|
|
@@ -2348,6 +2440,19 @@
|
|
|
2348
2440
|
// return false
|
|
2349
2441
|
// }
|
|
2350
2442
|
|
|
2443
|
+
const parseRegs = function (regs, opts, world) {
|
|
2444
|
+
const one = world.methods.one;
|
|
2445
|
+
if (typeof regs === 'number') {
|
|
2446
|
+
regs = String(regs);
|
|
2447
|
+
}
|
|
2448
|
+
// support param as string
|
|
2449
|
+
if (typeof regs === 'string') {
|
|
2450
|
+
regs = one.killUnicode(regs, world);
|
|
2451
|
+
regs = one.parseMatch(regs, opts, world);
|
|
2452
|
+
}
|
|
2453
|
+
return regs
|
|
2454
|
+
};
|
|
2455
|
+
|
|
2351
2456
|
const match$2 = function (regs, group, opts) {
|
|
2352
2457
|
const one = this.methods.one;
|
|
2353
2458
|
// support param as view object
|
|
@@ -2358,25 +2463,12 @@
|
|
|
2358
2463
|
if (isNet(regs)) {
|
|
2359
2464
|
return this.sweep(regs, { tagger: false }).view.settle()
|
|
2360
2465
|
}
|
|
2361
|
-
|
|
2362
|
-
if (typeof regs === 'string') {
|
|
2363
|
-
regs = one.killUnicode(regs, this.world);
|
|
2364
|
-
regs = one.parseMatch(regs, opts, this.world);
|
|
2365
|
-
}
|
|
2466
|
+
regs = parseRegs(regs, opts, this.world);
|
|
2366
2467
|
let todo = { regs, group };
|
|
2367
2468
|
let res = one.match(this.docs, todo, this._cache);
|
|
2368
2469
|
let { ptrs, byGroup } = fixPointers(res, this.fullPointer);
|
|
2369
2470
|
let view = this.toView(ptrs);
|
|
2370
2471
|
view._groups = byGroup;
|
|
2371
|
-
// try to keep some of the cache
|
|
2372
|
-
// if (this._cache) {
|
|
2373
|
-
// view._cache = view.ptrs.map(ptr => {
|
|
2374
|
-
// if (isFull(ptr, this.document)) {
|
|
2375
|
-
// return this._cache[ptr[0]]
|
|
2376
|
-
// }
|
|
2377
|
-
// return null
|
|
2378
|
-
// })
|
|
2379
|
-
// }
|
|
2380
2472
|
return view
|
|
2381
2473
|
};
|
|
2382
2474
|
|
|
@@ -2390,10 +2482,7 @@
|
|
|
2390
2482
|
if (isNet(regs)) {
|
|
2391
2483
|
return this.sweep(regs, { tagger: false, matchOne: true }).view
|
|
2392
2484
|
}
|
|
2393
|
-
|
|
2394
|
-
regs = one.killUnicode(regs, this.world);
|
|
2395
|
-
regs = one.parseMatch(regs, opts, this.world);
|
|
2396
|
-
}
|
|
2485
|
+
regs = parseRegs(regs, opts, this.world);
|
|
2397
2486
|
let todo = { regs, group, justOne: true };
|
|
2398
2487
|
let res = one.match(this.docs, todo, this._cache);
|
|
2399
2488
|
let { ptrs, byGroup } = fixPointers(res, this.fullPointer);
|
|
@@ -2413,10 +2502,7 @@
|
|
|
2413
2502
|
if (isNet(regs)) {
|
|
2414
2503
|
return this.sweep(regs, { tagger: false }).view.found
|
|
2415
2504
|
}
|
|
2416
|
-
|
|
2417
|
-
regs = one.killUnicode(regs, this.world);
|
|
2418
|
-
regs = one.parseMatch(regs, opts, this.world);
|
|
2419
|
-
}
|
|
2505
|
+
regs = parseRegs(regs, opts, this.world);
|
|
2420
2506
|
let todo = { regs, group, justOne: true };
|
|
2421
2507
|
let ptrs = one.match(this.docs, todo, this._cache).ptrs;
|
|
2422
2508
|
return ptrs.length > 0
|
|
@@ -2434,10 +2520,7 @@
|
|
|
2434
2520
|
let m = this.sweep(regs, { tagger: false }).view.settle();
|
|
2435
2521
|
return this.if(m)//recurse with result
|
|
2436
2522
|
}
|
|
2437
|
-
|
|
2438
|
-
regs = one.killUnicode(regs, this.world);
|
|
2439
|
-
regs = one.parseMatch(regs, opts, this.world);
|
|
2440
|
-
}
|
|
2523
|
+
regs = parseRegs(regs, opts, this.world);
|
|
2441
2524
|
let todo = { regs, group, justOne: true };
|
|
2442
2525
|
let ptrs = this.fullPointer;
|
|
2443
2526
|
let cache = this._cache || [];
|
|
@@ -2467,10 +2550,7 @@
|
|
|
2467
2550
|
return this.ifNo(m)
|
|
2468
2551
|
}
|
|
2469
2552
|
// otherwise parse the match string
|
|
2470
|
-
|
|
2471
|
-
regs = one.killUnicode(regs, this.world);
|
|
2472
|
-
regs = one.parseMatch(regs, opts, this.world);
|
|
2473
|
-
}
|
|
2553
|
+
regs = parseRegs(regs, opts, this.world);
|
|
2474
2554
|
let cache = this._cache || [];
|
|
2475
2555
|
let view = this.filter((m, i) => {
|
|
2476
2556
|
let todo = { regs, group, justOne: true };
|
|
@@ -2669,7 +2749,7 @@
|
|
|
2669
2749
|
const matchAPI = function (View) {
|
|
2670
2750
|
Object.assign(View.prototype, methods$c);
|
|
2671
2751
|
};
|
|
2672
|
-
var api$
|
|
2752
|
+
var api$b = matchAPI;
|
|
2673
2753
|
|
|
2674
2754
|
// match 'foo /yes/' and not 'foo/no/bar'
|
|
2675
2755
|
const bySlashes = /(?:^|\s)([![^]*(?:<[^<]*>)?\/.*?[^\\/]\/[?\]+*$~]*)(?:\s|$)/;
|
|
@@ -2849,14 +2929,24 @@
|
|
|
2849
2929
|
return obj
|
|
2850
2930
|
}
|
|
2851
2931
|
|
|
2852
|
-
//
|
|
2932
|
+
//root/sense overloaded
|
|
2853
2933
|
if (start(w) === '{' && end(w) === '}') {
|
|
2854
2934
|
w = stripBoth(w);
|
|
2935
|
+
obj.id = w;
|
|
2936
|
+
obj.root = w;
|
|
2855
2937
|
if (/\//.test(w)) {
|
|
2856
|
-
|
|
2857
|
-
obj.
|
|
2858
|
-
|
|
2859
|
-
obj.
|
|
2938
|
+
let split = obj.root.split(/\//);
|
|
2939
|
+
obj.root = split[0];
|
|
2940
|
+
obj.pos = split[1];
|
|
2941
|
+
if (obj.pos === 'adj') {
|
|
2942
|
+
obj.pos = 'Adjective';
|
|
2943
|
+
}
|
|
2944
|
+
// titlecase
|
|
2945
|
+
obj.pos = obj.pos.charAt(0).toUpperCase() + obj.pos.substr(1).toLowerCase();
|
|
2946
|
+
// add sense-number too
|
|
2947
|
+
if (split[2] !== undefined) {
|
|
2948
|
+
obj.num = split[2];
|
|
2949
|
+
}
|
|
2860
2950
|
}
|
|
2861
2951
|
return obj
|
|
2862
2952
|
}
|
|
@@ -2965,6 +3055,80 @@
|
|
|
2965
3055
|
};
|
|
2966
3056
|
var splitHyphens$2 = splitHyphens$1;
|
|
2967
3057
|
|
|
3058
|
+
// add all conjugations of this verb
|
|
3059
|
+
const addVerbs = function (token, world) {
|
|
3060
|
+
let { all } = world.methods.two.transform.verb || {};
|
|
3061
|
+
let str = token.root;
|
|
3062
|
+
// if (toInfinitive) {
|
|
3063
|
+
// str = toInfinitive(str, world.model)
|
|
3064
|
+
// }
|
|
3065
|
+
if (!all) {
|
|
3066
|
+
return []
|
|
3067
|
+
}
|
|
3068
|
+
return all(str, world.model)
|
|
3069
|
+
};
|
|
3070
|
+
|
|
3071
|
+
// add all inflections of this noun
|
|
3072
|
+
const addNoun = function (token, world) {
|
|
3073
|
+
let { all } = world.methods.two.transform.noun || {};
|
|
3074
|
+
if (!all) {
|
|
3075
|
+
return [token.root]
|
|
3076
|
+
}
|
|
3077
|
+
return all(token.root, world.model)
|
|
3078
|
+
};
|
|
3079
|
+
|
|
3080
|
+
// add all inflections of this adjective
|
|
3081
|
+
const addAdjective = function (token, world) {
|
|
3082
|
+
let { all } = world.methods.two.transform.adjective || {};
|
|
3083
|
+
if (!all) {
|
|
3084
|
+
return [token.root]
|
|
3085
|
+
}
|
|
3086
|
+
return all(token.root, world.model)
|
|
3087
|
+
};
|
|
3088
|
+
|
|
3089
|
+
// turn '{walk}' into 'walking', 'walked', etc
|
|
3090
|
+
const inflectRoot = function (regs, world) {
|
|
3091
|
+
// do we have compromise/two?
|
|
3092
|
+
regs = regs.map(token => {
|
|
3093
|
+
// a reg to convert '{foo}'
|
|
3094
|
+
if (token.root) {
|
|
3095
|
+
// check if compromise/two is loaded
|
|
3096
|
+
if (world.methods.two && world.methods.two.transform) {
|
|
3097
|
+
let choices = [];
|
|
3098
|
+
// have explicitly set from POS - '{sweet/adjective}'
|
|
3099
|
+
if (token.pos) {
|
|
3100
|
+
if (token.pos === 'Verb') {
|
|
3101
|
+
choices = choices.concat(addVerbs(token, world));
|
|
3102
|
+
} else if (token.pos === 'Noun') {
|
|
3103
|
+
choices = choices.concat(addNoun(token, world));
|
|
3104
|
+
} else if (token.pos === 'Adjective') {
|
|
3105
|
+
choices = choices.concat(addAdjective(token, world));
|
|
3106
|
+
}
|
|
3107
|
+
} else {
|
|
3108
|
+
// do verb/noun/adj by default
|
|
3109
|
+
choices = choices.concat(addVerbs(token, world));
|
|
3110
|
+
choices = choices.concat(addNoun(token, world));
|
|
3111
|
+
choices = choices.concat(addAdjective(token, world));
|
|
3112
|
+
}
|
|
3113
|
+
choices = choices.filter(str => str);
|
|
3114
|
+
if (choices.length > 0) {
|
|
3115
|
+
token.operator = 'or';
|
|
3116
|
+
token.fastOr = new Set(choices);
|
|
3117
|
+
}
|
|
3118
|
+
} else {
|
|
3119
|
+
// if no compromise/two, drop down into 'machine' lookup
|
|
3120
|
+
token.machine = token.root;
|
|
3121
|
+
delete token.id;
|
|
3122
|
+
delete token.root;
|
|
3123
|
+
}
|
|
3124
|
+
}
|
|
3125
|
+
return token
|
|
3126
|
+
});
|
|
3127
|
+
|
|
3128
|
+
return regs
|
|
3129
|
+
};
|
|
3130
|
+
var inflectRoot$1 = inflectRoot;
|
|
3131
|
+
|
|
2968
3132
|
// name any [unnamed] capture-groups with a number
|
|
2969
3133
|
const nameGroups = function (regs) {
|
|
2970
3134
|
let index = 0;
|
|
@@ -3073,6 +3237,8 @@
|
|
|
3073
3237
|
tokens = tokens.map(str => parseToken$1(str, opts));
|
|
3074
3238
|
// '~re-do~'
|
|
3075
3239
|
tokens = splitHyphens$2(tokens, world);
|
|
3240
|
+
// '{walk}'
|
|
3241
|
+
tokens = inflectRoot$1(tokens, world);
|
|
3076
3242
|
//clean up anything weird
|
|
3077
3243
|
tokens = postProcess$1(tokens);
|
|
3078
3244
|
// console.log(tokens)
|
|
@@ -3193,7 +3359,7 @@
|
|
|
3193
3359
|
const endQuote = /([\u0022\uFF02\u0027\u201D\u2019\u00BB\u203A\u2032\u2033\u2034\u301E\u00B4])/;
|
|
3194
3360
|
|
|
3195
3361
|
const hasHyphen$1 = /^[-–—]$/;
|
|
3196
|
-
const hasDash$1 = / [-–—] /;
|
|
3362
|
+
const hasDash$1 = / [-–—]{1,3} /;
|
|
3197
3363
|
|
|
3198
3364
|
/** search the term's 'post' punctuation */
|
|
3199
3365
|
const hasPost = (term, punct) => term.post.indexOf(punct) !== -1;
|
|
@@ -3215,6 +3381,8 @@
|
|
|
3215
3381
|
hasEllipses: term => hasPost(term, '..') || hasPost(term, '…') || hasPre(term, '..') || hasPre(term, '…'),
|
|
3216
3382
|
/** is there a semicolon after term word? */
|
|
3217
3383
|
hasSemicolon: term => hasPost(term, ';'),
|
|
3384
|
+
/** is there a colon after term word? */
|
|
3385
|
+
hasColon: term => hasPost(term, ':'),
|
|
3218
3386
|
/** is there a slash '/' in term word? */
|
|
3219
3387
|
hasSlash: term => /\//.test(term.text),
|
|
3220
3388
|
/** a hyphen connects two words like-term */
|
|
@@ -3328,6 +3496,10 @@
|
|
|
3328
3496
|
}
|
|
3329
3497
|
// support optimized (one|two)
|
|
3330
3498
|
if (reg.fastOr !== undefined) {
|
|
3499
|
+
// {work/verb} must be a verb
|
|
3500
|
+
if (reg.pos && !term.tags.has(reg.pos)) {
|
|
3501
|
+
return null
|
|
3502
|
+
}
|
|
3331
3503
|
return reg.fastOr.has(term.implicit) || reg.fastOr.has(term.normal) || reg.fastOr.has(term.text) || reg.fastOr.has(term.machine)
|
|
3332
3504
|
}
|
|
3333
3505
|
//support slower (one|two)
|
|
@@ -3593,17 +3765,82 @@
|
|
|
3593
3765
|
};
|
|
3594
3766
|
var doAndBlock = andBlock;
|
|
3595
3767
|
|
|
3768
|
+
const negGreedy = function (state, reg, nextReg) {
|
|
3769
|
+
let skip = 0;
|
|
3770
|
+
for (let t = state.t; t < state.terms.length; t += 1) {
|
|
3771
|
+
let found = matchTerm(state.terms[t], reg, state.start_i + state.t, state.phrase_length);
|
|
3772
|
+
// we don't want a match, here
|
|
3773
|
+
if (found) {
|
|
3774
|
+
break//stop going
|
|
3775
|
+
}
|
|
3776
|
+
// are we doing 'greedy-to'?
|
|
3777
|
+
// - "!foo+ after" should stop at 'after'
|
|
3778
|
+
if (nextReg) {
|
|
3779
|
+
found = matchTerm(state.terms[t], nextReg, state.start_i + state.t, state.phrase_length);
|
|
3780
|
+
if (found) {
|
|
3781
|
+
break
|
|
3782
|
+
}
|
|
3783
|
+
}
|
|
3784
|
+
skip += 1;
|
|
3785
|
+
// is it max-length now?
|
|
3786
|
+
if (reg.max !== undefined && skip === reg.max) {
|
|
3787
|
+
break
|
|
3788
|
+
}
|
|
3789
|
+
}
|
|
3790
|
+
if (skip === 0) {
|
|
3791
|
+
return false //dead
|
|
3792
|
+
}
|
|
3793
|
+
// did we satisfy min for !foo{min,max}
|
|
3794
|
+
if (reg.min && reg.min > skip) {
|
|
3795
|
+
return false//dead
|
|
3796
|
+
}
|
|
3797
|
+
state.t += skip;
|
|
3798
|
+
// state.r += 1
|
|
3799
|
+
return true
|
|
3800
|
+
};
|
|
3801
|
+
|
|
3802
|
+
var negGreedy$1 = negGreedy;
|
|
3803
|
+
|
|
3596
3804
|
// '!foo' should match anything that isn't 'foo'
|
|
3597
3805
|
// if it matches, return false
|
|
3598
3806
|
const doNegative = function (state) {
|
|
3599
3807
|
const { regs } = state;
|
|
3600
3808
|
let reg = regs[state.r];
|
|
3809
|
+
|
|
3810
|
+
// match *anything* but this term
|
|
3601
3811
|
let tmpReg = Object.assign({}, reg);
|
|
3602
3812
|
tmpReg.negative = false; // try removing it
|
|
3603
|
-
|
|
3604
|
-
if
|
|
3605
|
-
|
|
3813
|
+
|
|
3814
|
+
// found it? if so, we die here
|
|
3815
|
+
let found = matchTerm(state.terms[state.t], tmpReg, state.start_i + state.t, state.phrase_length);
|
|
3816
|
+
if (found) {
|
|
3817
|
+
return false//bye
|
|
3818
|
+
}
|
|
3819
|
+
// should we skip the term too?
|
|
3820
|
+
if (reg.optional) {
|
|
3821
|
+
// "before after" - "before !foo? after"
|
|
3822
|
+
// does the next reg match the this term?
|
|
3823
|
+
let nextReg = regs[state.r + 1];
|
|
3824
|
+
if (nextReg) {
|
|
3825
|
+
let fNext = matchTerm(state.terms[state.t], nextReg, state.start_i + state.t, state.phrase_length);
|
|
3826
|
+
if (fNext) {
|
|
3827
|
+
state.r += 1;
|
|
3828
|
+
} else if (nextReg.optional && regs[state.r + 2]) {
|
|
3829
|
+
// ugh. ok,
|
|
3830
|
+
// support "!foo? extra? need"
|
|
3831
|
+
// but don't scan ahead more than that.
|
|
3832
|
+
let fNext2 = matchTerm(state.terms[state.t], regs[state.r + 2], state.start_i + state.t, state.phrase_length);
|
|
3833
|
+
if (fNext2) {
|
|
3834
|
+
state.r += 2;
|
|
3835
|
+
}
|
|
3836
|
+
}
|
|
3837
|
+
}
|
|
3838
|
+
}
|
|
3839
|
+
// negative greedy - !foo+ - super hard!
|
|
3840
|
+
if (reg.greedy) {
|
|
3841
|
+
return negGreedy$1(state, tmpReg, regs[state.r + 1])
|
|
3606
3842
|
}
|
|
3843
|
+
state.t += 1;
|
|
3607
3844
|
return true
|
|
3608
3845
|
};
|
|
3609
3846
|
var doNegative$1 = doNegative;
|
|
@@ -3735,6 +3972,7 @@
|
|
|
3735
3972
|
* starting at this certain term.
|
|
3736
3973
|
*/
|
|
3737
3974
|
const tryHere = function (terms, regs, start_i, phrase_length) {
|
|
3975
|
+
// console.log(`\n\n:start: '${terms[0].text}':`)
|
|
3738
3976
|
if (terms.length === 0 || regs.length === 0) {
|
|
3739
3977
|
return null
|
|
3740
3978
|
}
|
|
@@ -3797,6 +4035,10 @@
|
|
|
3797
4035
|
}
|
|
3798
4036
|
// support '.' as any-single
|
|
3799
4037
|
if (reg.anything === true) {
|
|
4038
|
+
// '!.' negative anything should insta-fail
|
|
4039
|
+
if (reg.negative && reg.anything) {
|
|
4040
|
+
return null
|
|
4041
|
+
}
|
|
3800
4042
|
let alive = simpleMatch$1(state);
|
|
3801
4043
|
if (!alive) {
|
|
3802
4044
|
return null
|
|
@@ -3811,22 +4053,27 @@
|
|
|
3811
4053
|
}
|
|
3812
4054
|
continue
|
|
3813
4055
|
}
|
|
3814
|
-
// ok,
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
let alive =
|
|
4056
|
+
// ok, it doesn't match - but maybe it wasn't *supposed* to?
|
|
4057
|
+
if (reg.negative) {
|
|
4058
|
+
// we want *anything* but this term
|
|
4059
|
+
let alive = doNegative$1(state);
|
|
3818
4060
|
if (!alive) {
|
|
3819
4061
|
return null
|
|
3820
4062
|
}
|
|
3821
4063
|
continue
|
|
3822
4064
|
}
|
|
3823
|
-
// ok,
|
|
3824
|
-
|
|
3825
|
-
|
|
4065
|
+
// ok, finally test the term-reg
|
|
4066
|
+
// console.log(' - ' + state.terms[state.t].text)
|
|
4067
|
+
let hasMatch = matchTerm(state.terms[state.t], reg, state.start_i + state.t, state.phrase_length);
|
|
4068
|
+
if (hasMatch === true) {
|
|
4069
|
+
let alive = simpleMatch$1(state);
|
|
3826
4070
|
if (!alive) {
|
|
3827
4071
|
return null
|
|
3828
4072
|
}
|
|
4073
|
+
continue
|
|
3829
4074
|
}
|
|
4075
|
+
// console.log('=-=-=-= here -=-=-=-')
|
|
4076
|
+
|
|
3830
4077
|
//ok who cares, keep going
|
|
3831
4078
|
if (reg.optional === true) {
|
|
3832
4079
|
continue
|
|
@@ -3991,7 +4238,7 @@
|
|
|
3991
4238
|
};
|
|
3992
4239
|
|
|
3993
4240
|
var match = {
|
|
3994
|
-
api: api$
|
|
4241
|
+
api: api$b,
|
|
3995
4242
|
methods: methods$a,
|
|
3996
4243
|
lib: lib$3,
|
|
3997
4244
|
};
|
|
@@ -4601,6 +4848,9 @@
|
|
|
4601
4848
|
if (method === 'normal') {
|
|
4602
4849
|
return this.text('normal')
|
|
4603
4850
|
}
|
|
4851
|
+
if (method === 'root') {
|
|
4852
|
+
return this.text('root')
|
|
4853
|
+
}
|
|
4604
4854
|
if (method === 'machine' || method === 'reduced') {
|
|
4605
4855
|
return this.text('machine')
|
|
4606
4856
|
}
|
|
@@ -4678,7 +4928,7 @@
|
|
|
4678
4928
|
if (fmt && typeof fmt === 'string' && fmts$1.hasOwnProperty(fmt)) {
|
|
4679
4929
|
opts = Object.assign({}, fmts$1[fmt]);
|
|
4680
4930
|
} else if (fmt && isObject$1(fmt)) {
|
|
4681
|
-
opts = Object.assign({},
|
|
4931
|
+
opts = Object.assign({}, opts, fmt);//todo: fixme
|
|
4682
4932
|
}
|
|
4683
4933
|
if (this.pointer) {
|
|
4684
4934
|
opts.keepSpace = false;
|
|
@@ -4700,10 +4950,10 @@
|
|
|
4700
4950
|
const addAPI$1 = function (View) {
|
|
4701
4951
|
Object.assign(View.prototype, methods$6);
|
|
4702
4952
|
};
|
|
4703
|
-
var api$
|
|
4953
|
+
var api$a = addAPI$1;
|
|
4704
4954
|
|
|
4705
4955
|
var output = {
|
|
4706
|
-
api: api$
|
|
4956
|
+
api: api$a,
|
|
4707
4957
|
methods: {
|
|
4708
4958
|
one: {
|
|
4709
4959
|
hash: md5
|
|
@@ -4839,7 +5089,7 @@
|
|
|
4839
5089
|
|
|
4840
5090
|
var splitAll$1 = splitAll;
|
|
4841
5091
|
|
|
4842
|
-
const max$1 =
|
|
5092
|
+
const max$1 = 20;
|
|
4843
5093
|
|
|
4844
5094
|
// sweep-around looking for our start term uuid
|
|
4845
5095
|
const blindSweep = function (id, doc, n) {
|
|
@@ -5115,11 +5365,11 @@
|
|
|
5115
5365
|
// add set/intersection/union
|
|
5116
5366
|
Object.assign(View.prototype, methods$4);
|
|
5117
5367
|
};
|
|
5118
|
-
var api$
|
|
5368
|
+
var api$9 = addAPI;
|
|
5119
5369
|
|
|
5120
5370
|
var pointers = {
|
|
5121
5371
|
methods: methods$5,
|
|
5122
|
-
api: api$
|
|
5372
|
+
api: api$9,
|
|
5123
5373
|
};
|
|
5124
5374
|
|
|
5125
5375
|
var lib$2 = {
|
|
@@ -5132,7 +5382,7 @@
|
|
|
5132
5382
|
}
|
|
5133
5383
|
};
|
|
5134
5384
|
|
|
5135
|
-
const api$
|
|
5385
|
+
const api$7 = function (View) {
|
|
5136
5386
|
|
|
5137
5387
|
/** speedy match a sequence of matches */
|
|
5138
5388
|
View.prototype.sweep = function (net, opts = {}) {
|
|
@@ -5176,7 +5426,7 @@
|
|
|
5176
5426
|
};
|
|
5177
5427
|
|
|
5178
5428
|
};
|
|
5179
|
-
var api$
|
|
5429
|
+
var api$8 = api$7;
|
|
5180
5430
|
|
|
5181
5431
|
// extract the clear needs for an individual match token
|
|
5182
5432
|
const getTokenNeeds = function (reg) {
|
|
@@ -5240,7 +5490,7 @@
|
|
|
5240
5490
|
return { wants, count }
|
|
5241
5491
|
};
|
|
5242
5492
|
|
|
5243
|
-
const parse$
|
|
5493
|
+
const parse$2 = function (matches, world) {
|
|
5244
5494
|
const parseMatch = world.methods.one.parseMatch;
|
|
5245
5495
|
matches.forEach(obj => {
|
|
5246
5496
|
obj.regs = parseMatch(obj.match, {}, world);
|
|
@@ -5259,12 +5509,12 @@
|
|
|
5259
5509
|
return matches
|
|
5260
5510
|
};
|
|
5261
5511
|
|
|
5262
|
-
var parse$
|
|
5512
|
+
var parse$3 = parse$2;
|
|
5263
5513
|
|
|
5264
5514
|
// do some indexing on the list of matches
|
|
5265
|
-
const
|
|
5515
|
+
const buildNet = function (matches, world) {
|
|
5266
5516
|
// turn match-syntax into json
|
|
5267
|
-
matches = parse$
|
|
5517
|
+
matches = parse$3(matches, world);
|
|
5268
5518
|
|
|
5269
5519
|
// collect by wants and needs
|
|
5270
5520
|
let hooks = {};
|
|
@@ -5300,7 +5550,7 @@
|
|
|
5300
5550
|
}
|
|
5301
5551
|
};
|
|
5302
5552
|
|
|
5303
|
-
var buildNet =
|
|
5553
|
+
var buildNet$1 = buildNet;
|
|
5304
5554
|
|
|
5305
5555
|
// for each cached-sentence, find a list of possible matches
|
|
5306
5556
|
const getHooks = function (docCaches, hooks) {
|
|
@@ -5336,7 +5586,7 @@
|
|
|
5336
5586
|
});
|
|
5337
5587
|
// ensure nothing matches in our 'ifNo' property
|
|
5338
5588
|
list = list.filter(obj => {
|
|
5339
|
-
if (obj.ifNo !== undefined && obj.ifNo.some(no =>
|
|
5589
|
+
if (obj.ifNo !== undefined && obj.ifNo.some(no => haves.has(no)) === true) {
|
|
5340
5590
|
return false
|
|
5341
5591
|
}
|
|
5342
5592
|
return true
|
|
@@ -5357,7 +5607,7 @@
|
|
|
5357
5607
|
|
|
5358
5608
|
// finally,
|
|
5359
5609
|
// actually run these match-statements on the terms
|
|
5360
|
-
const runMatch = function (maybeList, document, methods, opts) {
|
|
5610
|
+
const runMatch = function (maybeList, document, docCache, methods, opts) {
|
|
5361
5611
|
let results = [];
|
|
5362
5612
|
for (let n = 0; n < maybeList.length; n += 1) {
|
|
5363
5613
|
for (let i = 0; i < maybeList[n].length; i += 1) {
|
|
@@ -5366,9 +5616,23 @@
|
|
|
5366
5616
|
let res = methods.one.match([document[n]], m);
|
|
5367
5617
|
// found something.
|
|
5368
5618
|
if (res.ptrs.length > 0) {
|
|
5369
|
-
// let index=document[n][0].index
|
|
5370
5619
|
res.ptrs.forEach(ptr => {
|
|
5371
5620
|
ptr[0] = n; // fix the sentence pointer
|
|
5621
|
+
// check ifNo
|
|
5622
|
+
// if (m.ifNo !== undefined) {
|
|
5623
|
+
// let terms = document[n].slice(ptr[1], ptr[2])
|
|
5624
|
+
// for (let k = 0; k < m.ifNo.length; k += 1) {
|
|
5625
|
+
// const no = m.ifNo[k]
|
|
5626
|
+
// // quick-check cache
|
|
5627
|
+
// if (docCache[n].has(no)) {
|
|
5628
|
+
// // console.log(no)
|
|
5629
|
+
// if (terms.find(t => t.normal === no || t.tags.has(no))) {
|
|
5630
|
+
// // console.log('+' + no)
|
|
5631
|
+
// return
|
|
5632
|
+
// }
|
|
5633
|
+
// }
|
|
5634
|
+
// }
|
|
5635
|
+
// }
|
|
5372
5636
|
let todo = Object.assign({}, m, { pointer: ptr });
|
|
5373
5637
|
if (m.unTag !== undefined) {
|
|
5374
5638
|
todo.unTag = m.unTag;
|
|
@@ -5410,16 +5674,8 @@
|
|
|
5410
5674
|
// if we don't have enough words
|
|
5411
5675
|
maybeList = tooSmall(maybeList, document);
|
|
5412
5676
|
|
|
5413
|
-
// maybeList.forEach((arr, i) => {
|
|
5414
|
-
// let txt = document[i].map(t => t.text).join(' ')
|
|
5415
|
-
// console.log(`==== ${txt} ====`)
|
|
5416
|
-
// arr.forEach(m => {
|
|
5417
|
-
// console.log(` - ${m.match}`)
|
|
5418
|
-
// })
|
|
5419
|
-
// })
|
|
5420
|
-
|
|
5421
5677
|
// now actually run the matches
|
|
5422
|
-
let results = runMatch$1(maybeList, document, methods, opts);
|
|
5678
|
+
let results = runMatch$1(maybeList, document, docCache, methods, opts);
|
|
5423
5679
|
// console.dir(results, { depth: 5 })
|
|
5424
5680
|
return results
|
|
5425
5681
|
};
|
|
@@ -5447,6 +5703,7 @@
|
|
|
5447
5703
|
const tagger$3 = function (list, document, world) {
|
|
5448
5704
|
const { model, methods } = world;
|
|
5449
5705
|
const { getDoc, setTag, unTag } = methods.one;
|
|
5706
|
+
const looksPlural = methods.two.looksPlural;
|
|
5450
5707
|
if (list.length === 0) {
|
|
5451
5708
|
return list
|
|
5452
5709
|
}
|
|
@@ -5456,7 +5713,7 @@
|
|
|
5456
5713
|
console.log(`\n\n \x1b[32m→ ${list.length} post-tagger:\x1b[0m`); //eslint-disable-line
|
|
5457
5714
|
}
|
|
5458
5715
|
return list.map(todo => {
|
|
5459
|
-
if (!todo.tag && !todo.chunk) {
|
|
5716
|
+
if (!todo.tag && !todo.chunk && !todo.unTag) {
|
|
5460
5717
|
return
|
|
5461
5718
|
}
|
|
5462
5719
|
let reason = todo.reason || todo.match;
|
|
@@ -5475,9 +5732,12 @@
|
|
|
5475
5732
|
if (todo.tag !== undefined) {
|
|
5476
5733
|
setTag(terms, todo.tag, world, todo.safe, `[post] '${reason}'`);
|
|
5477
5734
|
// quick and dirty plural tagger
|
|
5478
|
-
if (
|
|
5479
|
-
|
|
5480
|
-
|
|
5735
|
+
if (todo.tag === 'Noun') {
|
|
5736
|
+
let term = terms[terms.length - 1];
|
|
5737
|
+
if (looksPlural(term.text)) {
|
|
5738
|
+
setTag([term], 'Plural', world, todo.safe, 'quick-plural');
|
|
5739
|
+
} else {
|
|
5740
|
+
setTag([term], 'Singular', world, todo.safe, 'quick-singular');
|
|
5481
5741
|
}
|
|
5482
5742
|
}
|
|
5483
5743
|
}
|
|
@@ -5493,14 +5753,14 @@
|
|
|
5493
5753
|
var bulkTagger = tagger$3;
|
|
5494
5754
|
|
|
5495
5755
|
var methods$3 = {
|
|
5496
|
-
buildNet,
|
|
5756
|
+
buildNet: buildNet$1,
|
|
5497
5757
|
bulkMatch,
|
|
5498
5758
|
bulkTagger
|
|
5499
5759
|
};
|
|
5500
5760
|
|
|
5501
5761
|
var sweep = {
|
|
5502
5762
|
lib: lib$2,
|
|
5503
|
-
api: api$
|
|
5763
|
+
api: api$8,
|
|
5504
5764
|
methods: {
|
|
5505
5765
|
one: methods$3,
|
|
5506
5766
|
}
|
|
@@ -5549,7 +5809,7 @@
|
|
|
5549
5809
|
}
|
|
5550
5810
|
// finally, add our tag
|
|
5551
5811
|
term.tags.add(tag);
|
|
5552
|
-
// now it's dirty
|
|
5812
|
+
// now it's dirty?
|
|
5553
5813
|
term.dirty = true;
|
|
5554
5814
|
// add a chunk too, if it's easy
|
|
5555
5815
|
addChunk(term, tag);
|
|
@@ -5601,6 +5861,10 @@
|
|
|
5601
5861
|
tag.forEach(tg => setTag(terms, tg, world, isSafe));
|
|
5602
5862
|
return
|
|
5603
5863
|
}
|
|
5864
|
+
if (typeof tag !== 'string') {
|
|
5865
|
+
console.warn(`compromise: Invalid tag '${tag}'`);// eslint-disable-line
|
|
5866
|
+
return
|
|
5867
|
+
}
|
|
5604
5868
|
tag = tag.trim();
|
|
5605
5869
|
// support '#Noun . #Adjective' syntax
|
|
5606
5870
|
if (isMulti.test(tag)) {
|
|
@@ -5890,7 +6154,7 @@
|
|
|
5890
6154
|
const tagAPI = function (View) {
|
|
5891
6155
|
Object.assign(View.prototype, tag$1);
|
|
5892
6156
|
};
|
|
5893
|
-
var api$
|
|
6157
|
+
var api$6 = tagAPI;
|
|
5894
6158
|
|
|
5895
6159
|
// wire-up more pos-tags to our model
|
|
5896
6160
|
const addTags = function (tags) {
|
|
@@ -5944,12 +6208,16 @@
|
|
|
5944
6208
|
tagRank: tagRank$1
|
|
5945
6209
|
},
|
|
5946
6210
|
methods: methods$2,
|
|
5947
|
-
api: api$
|
|
6211
|
+
api: api$6,
|
|
5948
6212
|
lib: lib$1
|
|
5949
6213
|
};
|
|
5950
6214
|
|
|
5951
|
-
|
|
6215
|
+
// split by periods, question marks, unicode ⁇, etc
|
|
6216
|
+
const initSplit = /([.!?\u203D\u2E18\u203C\u2047-\u2049]+\s)/g;
|
|
6217
|
+
// merge these back into prev sentence
|
|
6218
|
+
const splitsOnly = /^[.!?\u203D\u2E18\u203C\u2047-\u2049]+\s$/;
|
|
5952
6219
|
const newLine = /((?:\r?\n|\r)+)/; // Match different new-line formats
|
|
6220
|
+
|
|
5953
6221
|
// Start with a regex:
|
|
5954
6222
|
const basicSplit = function (text) {
|
|
5955
6223
|
let all = [];
|
|
@@ -5959,76 +6227,32 @@
|
|
|
5959
6227
|
//split by period, question-mark, and exclamation-mark
|
|
5960
6228
|
let arr = lines[i].split(initSplit);
|
|
5961
6229
|
for (let o = 0; o < arr.length; o++) {
|
|
5962
|
-
|
|
6230
|
+
// merge 'foo' + '.'
|
|
6231
|
+
if (arr[o + 1] && splitsOnly.test(arr[o + 1]) === true) {
|
|
6232
|
+
arr[o] += arr[o + 1];
|
|
6233
|
+
arr[o + 1] = '';
|
|
6234
|
+
}
|
|
6235
|
+
if (arr[o] !== '') {
|
|
6236
|
+
all.push(arr[o]);
|
|
6237
|
+
}
|
|
5963
6238
|
}
|
|
5964
6239
|
}
|
|
5965
6240
|
return all
|
|
5966
6241
|
};
|
|
5967
|
-
var
|
|
6242
|
+
var simpleSplit = basicSplit;
|
|
5968
6243
|
|
|
5969
|
-
const
|
|
5970
|
-
const
|
|
5971
|
-
const hasLetter$1 = /\p{L}/u;
|
|
6244
|
+
const hasLetter$2 = /[a-z0-9\u00C0-\u00FF\u00a9\u00ae\u2000-\u3300\ud000-\udfff]/i;
|
|
6245
|
+
const hasSomething$1 = /\S/;
|
|
5972
6246
|
|
|
5973
|
-
|
|
5974
|
-
const isSentence = function (str, abbrevs) {
|
|
5975
|
-
// must have a letter
|
|
5976
|
-
if (hasLetter$1.test(str) === false) {
|
|
5977
|
-
return false
|
|
5978
|
-
}
|
|
5979
|
-
// check for 'F.B.I.'
|
|
5980
|
-
if (isAcronym$2.test(str) === true) {
|
|
5981
|
-
return false
|
|
5982
|
-
}
|
|
5983
|
-
//check for '...'
|
|
5984
|
-
if (hasEllipse.test(str) === true) {
|
|
5985
|
-
return false
|
|
5986
|
-
}
|
|
5987
|
-
let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
|
|
5988
|
-
let words = txt.split(' ');
|
|
5989
|
-
let lastWord = words[words.length - 1].toLowerCase();
|
|
5990
|
-
// check for 'Mr.'
|
|
5991
|
-
if (abbrevs.hasOwnProperty(lastWord) === true) {
|
|
5992
|
-
return false
|
|
5993
|
-
}
|
|
5994
|
-
// //check for jeopardy!
|
|
5995
|
-
// if (blacklist.hasOwnProperty(lastWord)) {
|
|
5996
|
-
// return false
|
|
5997
|
-
// }
|
|
5998
|
-
return true
|
|
5999
|
-
};
|
|
6000
|
-
var isSentence$1 = isSentence;
|
|
6001
|
-
|
|
6002
|
-
//(Rule-based sentence boundary segmentation) - chop given text into its proper sentences.
|
|
6003
|
-
// Ignore periods/questions/exclamations used in acronyms/abbreviations/numbers, etc.
|
|
6004
|
-
//regs-
|
|
6005
|
-
const hasSomething = /\S/;
|
|
6006
|
-
const startWhitespace = /^\s+/;
|
|
6007
|
-
const hasLetter = /[a-z0-9\u00C0-\u00FF\u00a9\u00ae\u2000-\u3300\ud000-\udfff]/i;
|
|
6008
|
-
|
|
6009
|
-
const splitSentences = function (text, model) {
|
|
6010
|
-
let abbrevs = model.one.abbreviations || new Set();
|
|
6011
|
-
text = text || '';
|
|
6012
|
-
text = String(text);
|
|
6013
|
-
let sentences = [];
|
|
6014
|
-
// First do a greedy-split..
|
|
6247
|
+
const notEmpty = function (splits) {
|
|
6015
6248
|
let chunks = [];
|
|
6016
|
-
// Ensure it 'smells like' a sentence
|
|
6017
|
-
if (!text || typeof text !== 'string' || hasSomething.test(text) === false) {
|
|
6018
|
-
return sentences
|
|
6019
|
-
}
|
|
6020
|
-
// cleanup unicode-spaces
|
|
6021
|
-
text = text.replace('\xa0', ' ');
|
|
6022
|
-
// Start somewhere:
|
|
6023
|
-
let splits = basicSplit$1(text);
|
|
6024
|
-
// Filter-out the crap ones
|
|
6025
6249
|
for (let i = 0; i < splits.length; i++) {
|
|
6026
6250
|
let s = splits[i];
|
|
6027
6251
|
if (s === undefined || s === '') {
|
|
6028
6252
|
continue
|
|
6029
6253
|
}
|
|
6030
6254
|
//this is meaningful whitespace
|
|
6031
|
-
if (hasSomething.test(s) === false || hasLetter.test(s) === false) {
|
|
6255
|
+
if (hasSomething$1.test(s) === false || hasLetter$2.test(s) === false) {
|
|
6032
6256
|
//add it to the last one
|
|
6033
6257
|
if (chunks[chunks.length - 1]) {
|
|
6034
6258
|
chunks[chunks.length - 1] += s;
|
|
@@ -6042,12 +6266,20 @@
|
|
|
6042
6266
|
//else, only whitespace, no terms, no sentence
|
|
6043
6267
|
chunks.push(s);
|
|
6044
6268
|
}
|
|
6045
|
-
|
|
6046
|
-
|
|
6269
|
+
return chunks
|
|
6270
|
+
};
|
|
6271
|
+
var simpleMerge = notEmpty;
|
|
6272
|
+
|
|
6273
|
+
//loop through these chunks, and join the non-sentence chunks back together..
|
|
6274
|
+
const smartMerge = function (chunks, world) {
|
|
6275
|
+
const isSentence = world.methods.one.tokenize.isSentence;
|
|
6276
|
+
const abbrevs = world.model.one.abbreviations || new Set();
|
|
6277
|
+
|
|
6278
|
+
let sentences = [];
|
|
6047
6279
|
for (let i = 0; i < chunks.length; i++) {
|
|
6048
6280
|
let c = chunks[i];
|
|
6049
6281
|
//should this chunk be combined with the next one?
|
|
6050
|
-
if (chunks[i + 1] && isSentence
|
|
6282
|
+
if (chunks[i + 1] && isSentence(c, abbrevs) === false) {
|
|
6051
6283
|
chunks[i + 1] = c + (chunks[i + 1] || '');
|
|
6052
6284
|
} else if (c && c.length > 0) {
|
|
6053
6285
|
//this chunk is a proper sentence..
|
|
@@ -6055,6 +6287,143 @@
|
|
|
6055
6287
|
chunks[i] = '';
|
|
6056
6288
|
}
|
|
6057
6289
|
}
|
|
6290
|
+
return sentences
|
|
6291
|
+
};
|
|
6292
|
+
var smartMerge$1 = smartMerge;
|
|
6293
|
+
|
|
6294
|
+
// merge embedded quotes into 1 sentence
|
|
6295
|
+
// like - 'he said "no!" and left.'
|
|
6296
|
+
const MAX_QUOTE = 280;// ¯\_(ツ)_/¯
|
|
6297
|
+
|
|
6298
|
+
// don't support single-quotes for multi-sentences
|
|
6299
|
+
const pairs = {
|
|
6300
|
+
'\u0022': '\u0022', // 'StraightDoubleQuotes'
|
|
6301
|
+
'\uFF02': '\uFF02', // 'StraightDoubleQuotesWide'
|
|
6302
|
+
// '\u0027': '\u0027', // 'StraightSingleQuotes'
|
|
6303
|
+
'\u201C': '\u201D', // 'CommaDoubleQuotes'
|
|
6304
|
+
// '\u2018': '\u2019', // 'CommaSingleQuotes'
|
|
6305
|
+
'\u201F': '\u201D', // 'CurlyDoubleQuotesReversed'
|
|
6306
|
+
// '\u201B': '\u2019', // 'CurlySingleQuotesReversed'
|
|
6307
|
+
'\u201E': '\u201D', // 'LowCurlyDoubleQuotes'
|
|
6308
|
+
'\u2E42': '\u201D', // 'LowCurlyDoubleQuotesReversed'
|
|
6309
|
+
'\u201A': '\u2019', // 'LowCurlySingleQuotes'
|
|
6310
|
+
'\u00AB': '\u00BB', // 'AngleDoubleQuotes'
|
|
6311
|
+
'\u2039': '\u203A', // 'AngleSingleQuotes'
|
|
6312
|
+
'\u2035': '\u2032', // 'PrimeSingleQuotes'
|
|
6313
|
+
'\u2036': '\u2033', // 'PrimeDoubleQuotes'
|
|
6314
|
+
'\u2037': '\u2034', // 'PrimeTripleQuotes'
|
|
6315
|
+
'\u301D': '\u301E', // 'PrimeDoubleQuotes'
|
|
6316
|
+
// '\u0060': '\u00B4', // 'PrimeSingleQuotes'
|
|
6317
|
+
'\u301F': '\u301E', // 'LowPrimeDoubleQuotesReversed'
|
|
6318
|
+
};
|
|
6319
|
+
const openQuote = RegExp('(' + Object.keys(pairs).join('|') + ')', 'g');
|
|
6320
|
+
const closeQuote = RegExp('(' + Object.values(pairs).join('|') + ')', 'g');
|
|
6321
|
+
|
|
6322
|
+
const closesQuote = function (str) {
|
|
6323
|
+
if (!str) {
|
|
6324
|
+
return false
|
|
6325
|
+
}
|
|
6326
|
+
let m = str.match(closeQuote);
|
|
6327
|
+
if (m !== null && m.length === 1) {
|
|
6328
|
+
return true
|
|
6329
|
+
}
|
|
6330
|
+
return false
|
|
6331
|
+
};
|
|
6332
|
+
|
|
6333
|
+
// allow micro-sentences when inside a quotation, like:
|
|
6334
|
+
// the doc said "no sir. i will not beg" and walked away.
|
|
6335
|
+
const quoteMerge = function (splits) {
|
|
6336
|
+
let arr = [];
|
|
6337
|
+
for (let i = 0; i < splits.length; i += 1) {
|
|
6338
|
+
let split = splits[i];
|
|
6339
|
+
// do we have an open-quote and not a closed one?
|
|
6340
|
+
let m = split.match(openQuote);
|
|
6341
|
+
if (m !== null && m.length === 1) {
|
|
6342
|
+
|
|
6343
|
+
// look at the next sentence for a closing quote,
|
|
6344
|
+
if (closesQuote(splits[i + 1]) && splits[i + 1].length < MAX_QUOTE) {
|
|
6345
|
+
splits[i] += splits[i + 1];// merge them
|
|
6346
|
+
arr.push(splits[i]);
|
|
6347
|
+
splits[i + 1] = '';
|
|
6348
|
+
i += 1;
|
|
6349
|
+
continue
|
|
6350
|
+
}
|
|
6351
|
+
// look at n+2 for a closing quote,
|
|
6352
|
+
if (closesQuote(splits[i + 2])) {
|
|
6353
|
+
let toAdd = splits[i + 1] + splits[i + 2];// merge them all
|
|
6354
|
+
//make sure it's not too-long
|
|
6355
|
+
if (toAdd.length < MAX_QUOTE) {
|
|
6356
|
+
splits[i] += toAdd;
|
|
6357
|
+
arr.push(splits[i]);
|
|
6358
|
+
splits[i + 1] = '';
|
|
6359
|
+
splits[i + 2] = '';
|
|
6360
|
+
i += 2;
|
|
6361
|
+
continue
|
|
6362
|
+
}
|
|
6363
|
+
}
|
|
6364
|
+
}
|
|
6365
|
+
arr.push(splits[i]);
|
|
6366
|
+
}
|
|
6367
|
+
return arr
|
|
6368
|
+
};
|
|
6369
|
+
var quoteMerge$1 = quoteMerge;
|
|
6370
|
+
|
|
6371
|
+
const MAX_LEN = 250;// ¯\_(ツ)_/¯
|
|
6372
|
+
|
|
6373
|
+
// support unicode variants?
|
|
6374
|
+
// https://stackoverflow.com/questions/13535172/list-of-all-unicodes-open-close-brackets
|
|
6375
|
+
const hasOpen = /\(/g;
|
|
6376
|
+
const hasClosed = /\)/g;
|
|
6377
|
+
const mergeParens = function (splits) {
|
|
6378
|
+
let arr = [];
|
|
6379
|
+
for (let i = 0; i < splits.length; i += 1) {
|
|
6380
|
+
let split = splits[i];
|
|
6381
|
+
let m = split.match(hasOpen);
|
|
6382
|
+
if (m !== null && m.length === 1) {
|
|
6383
|
+
// look at next sentence, for closing parenthesis
|
|
6384
|
+
if (splits[i + 1] && splits[i + 1].length < MAX_LEN) {
|
|
6385
|
+
let m2 = splits[i + 1].match(hasClosed);
|
|
6386
|
+
if (m2 !== null && m.length === 1 && !hasOpen.test(splits[i + 1])) {
|
|
6387
|
+
// merge in 2nd sentence
|
|
6388
|
+
splits[i] += splits[i + 1];
|
|
6389
|
+
arr.push(splits[i]);
|
|
6390
|
+
splits[i + 1] = '';
|
|
6391
|
+
i += 1;
|
|
6392
|
+
continue
|
|
6393
|
+
}
|
|
6394
|
+
}
|
|
6395
|
+
}
|
|
6396
|
+
arr.push(splits[i]);
|
|
6397
|
+
}
|
|
6398
|
+
return arr
|
|
6399
|
+
};
|
|
6400
|
+
var parensMerge = mergeParens;
|
|
6401
|
+
|
|
6402
|
+
//(Rule-based sentence boundary segmentation) - chop given text into its proper sentences.
|
|
6403
|
+
// Ignore periods/questions/exclamations used in acronyms/abbreviations/numbers, etc.
|
|
6404
|
+
//regs-
|
|
6405
|
+
const hasSomething = /\S/;
|
|
6406
|
+
const startWhitespace = /^\s+/;
|
|
6407
|
+
|
|
6408
|
+
const splitSentences = function (text, world) {
|
|
6409
|
+
text = text || '';
|
|
6410
|
+
text = String(text);
|
|
6411
|
+
// Ensure it 'smells like' a sentence
|
|
6412
|
+
if (!text || typeof text !== 'string' || hasSomething.test(text) === false) {
|
|
6413
|
+
return []
|
|
6414
|
+
}
|
|
6415
|
+
// cleanup unicode-spaces
|
|
6416
|
+
text = text.replace('\xa0', ' ');
|
|
6417
|
+
// First do a greedy-split..
|
|
6418
|
+
let splits = simpleSplit(text);
|
|
6419
|
+
// Filter-out the crap ones
|
|
6420
|
+
let sentences = simpleMerge(splits);
|
|
6421
|
+
//detection of non-sentence chunks:
|
|
6422
|
+
sentences = smartMerge$1(sentences, world);
|
|
6423
|
+
// allow 'he said "no sir." and left.'
|
|
6424
|
+
sentences = quoteMerge$1(sentences);
|
|
6425
|
+
// allow 'i thought (no way!) and left.'
|
|
6426
|
+
sentences = parensMerge(sentences);
|
|
6058
6427
|
//if we never got a sentence, return the given text
|
|
6059
6428
|
if (sentences.length === 0) {
|
|
6060
6429
|
return [text]
|
|
@@ -6070,7 +6439,7 @@
|
|
|
6070
6439
|
}
|
|
6071
6440
|
return sentences
|
|
6072
6441
|
};
|
|
6073
|
-
var
|
|
6442
|
+
var splitSentences$1 = splitSentences;
|
|
6074
6443
|
|
|
6075
6444
|
const hasHyphen = function (str, model) {
|
|
6076
6445
|
let parts = str.split(/[-–—]/);
|
|
@@ -6154,7 +6523,7 @@
|
|
|
6154
6523
|
const isBoundary = /^[!?.]+$/;
|
|
6155
6524
|
const naiiveSplit = /(\S+)/;
|
|
6156
6525
|
|
|
6157
|
-
let notWord = ['.', '?', '!', ':', ';', '-', '–', '—', '--', '...', '(', ')', '[', ']', '"', "'", '`'];
|
|
6526
|
+
let notWord = ['.', '?', '!', ':', ';', '-', '–', '—', '--', '...', '(', ')', '[', ']', '"', "'", '`', '«', '»', '*'];
|
|
6158
6527
|
notWord = notWord.reduce((h, c) => {
|
|
6159
6528
|
h[c] = true;
|
|
6160
6529
|
return h
|
|
@@ -6218,40 +6587,68 @@
|
|
|
6218
6587
|
result = result.filter(s => s);
|
|
6219
6588
|
return result
|
|
6220
6589
|
};
|
|
6221
|
-
var
|
|
6590
|
+
var splitTerms = splitWords;
|
|
6591
|
+
|
|
6592
|
+
const allowBefore = [
|
|
6593
|
+
'#', //#hastag
|
|
6594
|
+
'@', //@atmention
|
|
6595
|
+
'_',//underscore
|
|
6596
|
+
// '\\-',//-4 (escape)
|
|
6597
|
+
'+',//+4
|
|
6598
|
+
'.',//.4
|
|
6599
|
+
];
|
|
6600
|
+
const allowAfter = [
|
|
6601
|
+
'%',//88%
|
|
6602
|
+
'_',//underscore
|
|
6603
|
+
'°',//degrees, italian ordinal
|
|
6604
|
+
// '\'',// \u0027
|
|
6605
|
+
];
|
|
6222
6606
|
|
|
6223
6607
|
//all punctuation marks, from https://en.wikipedia.org/wiki/Punctuation
|
|
6608
|
+
let beforeReg = new RegExp(`[${allowBefore.join('')}]+$`, '');
|
|
6609
|
+
let afterReg = new RegExp(`^[${allowAfter.join('')}]+`, '');
|
|
6610
|
+
|
|
6224
6611
|
//we have slightly different rules for start/end - like #hashtags.
|
|
6225
|
-
const
|
|
6226
|
-
|
|
6227
|
-
const endings =
|
|
6228
|
-
/[ \n\t.'[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*@•^†‡°¡¿※#№÷׺ª‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u201D\u00B4\u301E]+$/;
|
|
6612
|
+
const endings = /[\p{Punctuation}\s]+$/u;
|
|
6613
|
+
const startings = /^[\p{Punctuation}\s]+/u;
|
|
6229
6614
|
const hasApostrophe$1 = /['’]/;
|
|
6230
6615
|
const hasAcronym = /^[a-z]\.([a-z]\.)+/i;
|
|
6231
|
-
const minusNumber = /^[-+.][0-9]/;
|
|
6232
6616
|
const shortYear = /^'[0-9]{2}/;
|
|
6617
|
+
const isNumber = /^-[0-9]/;
|
|
6233
6618
|
|
|
6234
6619
|
const normalizePunctuation = function (str) {
|
|
6235
6620
|
let original = str;
|
|
6236
6621
|
let pre = '';
|
|
6237
6622
|
let post = '';
|
|
6238
|
-
//
|
|
6623
|
+
// adhoc cleanup for pre
|
|
6239
6624
|
str = str.replace(startings, found => {
|
|
6240
|
-
|
|
6241
|
-
|
|
6242
|
-
if (
|
|
6243
|
-
pre = '';
|
|
6244
|
-
return
|
|
6625
|
+
// punctuation symboles like '@' to allow at start of term
|
|
6626
|
+
let m = found.match(beforeReg);
|
|
6627
|
+
if (m) {
|
|
6628
|
+
pre = found.replace(beforeReg, '');
|
|
6629
|
+
return m
|
|
6245
6630
|
}
|
|
6246
6631
|
// support years like '97
|
|
6247
6632
|
if (pre === `'` && shortYear.test(str)) {
|
|
6248
6633
|
pre = '';
|
|
6249
6634
|
return found
|
|
6250
6635
|
}
|
|
6636
|
+
// support prefix negative signs like '-45'
|
|
6637
|
+
if (found === '-' && isNumber.test(str)) {
|
|
6638
|
+
return found
|
|
6639
|
+
}
|
|
6640
|
+
pre = found; //keep it
|
|
6251
6641
|
return ''
|
|
6252
6642
|
});
|
|
6643
|
+
// ad-hoc cleanup for post
|
|
6253
6644
|
str = str.replace(endings, found => {
|
|
6254
|
-
|
|
6645
|
+
// punctuation symboles like '@' to allow at start of term
|
|
6646
|
+
let m = found.match(afterReg);
|
|
6647
|
+
if (m) {
|
|
6648
|
+
post = found.replace(afterReg, '');
|
|
6649
|
+
return m
|
|
6650
|
+
}
|
|
6651
|
+
|
|
6255
6652
|
// keep s-apostrophe - "flanders'" or "chillin'"
|
|
6256
6653
|
if (hasApostrophe$1.test(found) && /[sn]['’]$/.test(original) && hasApostrophe$1.test(pre) === false) {
|
|
6257
6654
|
post = post.replace(hasApostrophe$1, '');
|
|
@@ -6259,9 +6656,10 @@
|
|
|
6259
6656
|
}
|
|
6260
6657
|
//keep end-period in acronym
|
|
6261
6658
|
if (hasAcronym.test(str) === true) {
|
|
6262
|
-
post =
|
|
6659
|
+
post = found.replace(/^\./, '');
|
|
6263
6660
|
return '.'
|
|
6264
6661
|
}
|
|
6662
|
+
post = found;//keep it
|
|
6265
6663
|
return ''
|
|
6266
6664
|
});
|
|
6267
6665
|
//we went too far..
|
|
@@ -6289,7 +6687,21 @@
|
|
|
6289
6687
|
};
|
|
6290
6688
|
return parsed
|
|
6291
6689
|
};
|
|
6292
|
-
var
|
|
6690
|
+
var splitWhitespace = parseTerm;
|
|
6691
|
+
|
|
6692
|
+
// 'Björk' to 'Bjork'.
|
|
6693
|
+
const killUnicode = function (str, world) {
|
|
6694
|
+
const unicode = world.model.one.unicode || {};
|
|
6695
|
+
str = str || '';
|
|
6696
|
+
let chars = str.split('');
|
|
6697
|
+
chars.forEach((s, i) => {
|
|
6698
|
+
if (unicode[s]) {
|
|
6699
|
+
chars[i] = unicode[s];
|
|
6700
|
+
}
|
|
6701
|
+
});
|
|
6702
|
+
return chars.join('')
|
|
6703
|
+
};
|
|
6704
|
+
var killUnicode$1 = killUnicode;
|
|
6293
6705
|
|
|
6294
6706
|
/** some basic operations on a string to reduce noise */
|
|
6295
6707
|
const clean = function (str) {
|
|
@@ -6329,7 +6741,7 @@
|
|
|
6329
6741
|
const noPeriodAcronym$1 = /[A-Z]{2,}('s|,)?$/;
|
|
6330
6742
|
const lowerCaseAcronym$1 = /([a-z]\.)+[a-z]\.?$/;
|
|
6331
6743
|
|
|
6332
|
-
const isAcronym$
|
|
6744
|
+
const isAcronym$3 = function (str) {
|
|
6333
6745
|
//like N.D.A
|
|
6334
6746
|
if (periodAcronym$1.test(str) === true) {
|
|
6335
6747
|
return true
|
|
@@ -6350,7 +6762,7 @@
|
|
|
6350
6762
|
};
|
|
6351
6763
|
|
|
6352
6764
|
const doAcronym = function (str) {
|
|
6353
|
-
if (isAcronym$
|
|
6765
|
+
if (isAcronym$3(str)) {
|
|
6354
6766
|
str = str.replace(/\./g, '');
|
|
6355
6767
|
}
|
|
6356
6768
|
return str
|
|
@@ -6369,27 +6781,13 @@
|
|
|
6369
6781
|
};
|
|
6370
6782
|
var normal = normalize;
|
|
6371
6783
|
|
|
6372
|
-
// 'Björk' to 'Bjork'.
|
|
6373
|
-
const killUnicode = function (str, world) {
|
|
6374
|
-
const unicode = world.model.one.unicode || {};
|
|
6375
|
-
str = str || '';
|
|
6376
|
-
let chars = str.split('');
|
|
6377
|
-
chars.forEach((s, i) => {
|
|
6378
|
-
if (unicode[s]) {
|
|
6379
|
-
chars[i] = unicode[s];
|
|
6380
|
-
}
|
|
6381
|
-
});
|
|
6382
|
-
return chars.join('')
|
|
6383
|
-
};
|
|
6384
|
-
var killUnicode$1 = killUnicode;
|
|
6385
|
-
|
|
6386
6784
|
// turn a string input into a 'document' json format
|
|
6387
|
-
const
|
|
6785
|
+
const parse$1 = function (input, world) {
|
|
6388
6786
|
const { methods, model } = world;
|
|
6389
6787
|
const { splitSentences, splitTerms, splitWhitespace } = methods.one.tokenize;
|
|
6390
6788
|
input = input || '';
|
|
6391
6789
|
// split into sentences
|
|
6392
|
-
let sentences = splitSentences(input,
|
|
6790
|
+
let sentences = splitSentences(input, world);
|
|
6393
6791
|
// split into word objects
|
|
6394
6792
|
input = sentences.map((txt) => {
|
|
6395
6793
|
let terms = splitTerms(txt, model);
|
|
@@ -6403,14 +6801,54 @@
|
|
|
6403
6801
|
});
|
|
6404
6802
|
return input
|
|
6405
6803
|
};
|
|
6804
|
+
var fromString = parse$1;
|
|
6805
|
+
|
|
6806
|
+
const isAcronym$2 = /[ .][A-Z]\.? *$/i; //asci - 'n.s.a.'
|
|
6807
|
+
const hasEllipse$1 = /(?:\u2026|\.{2,}) *$/; // '...'
|
|
6808
|
+
const hasLetter$1 = /\p{L}/u;
|
|
6809
|
+
const leadInit = /^[A-Z]\. $/; // "W. Kensington"
|
|
6810
|
+
|
|
6811
|
+
/** does this look like a sentence? */
|
|
6812
|
+
const isSentence$2 = function (str, abbrevs) {
|
|
6813
|
+
// must have a letter
|
|
6814
|
+
if (hasLetter$1.test(str) === false) {
|
|
6815
|
+
return false
|
|
6816
|
+
}
|
|
6817
|
+
// check for 'F.B.I.'
|
|
6818
|
+
if (isAcronym$2.test(str) === true) {
|
|
6819
|
+
return false
|
|
6820
|
+
}
|
|
6821
|
+
// check for leading initial - "W. Kensington"
|
|
6822
|
+
if (str.length === 3 && leadInit.test(str)) {
|
|
6823
|
+
return false
|
|
6824
|
+
}
|
|
6825
|
+
//check for '...'
|
|
6826
|
+
if (hasEllipse$1.test(str) === true) {
|
|
6827
|
+
return false
|
|
6828
|
+
}
|
|
6829
|
+
let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
|
|
6830
|
+
let words = txt.split(' ');
|
|
6831
|
+
let lastWord = words[words.length - 1].toLowerCase();
|
|
6832
|
+
// check for 'Mr.'
|
|
6833
|
+
if (abbrevs.hasOwnProperty(lastWord) === true) {
|
|
6834
|
+
return false
|
|
6835
|
+
}
|
|
6836
|
+
// //check for jeopardy!
|
|
6837
|
+
// if (blacklist.hasOwnProperty(lastWord)) {
|
|
6838
|
+
// return false
|
|
6839
|
+
// }
|
|
6840
|
+
return true
|
|
6841
|
+
};
|
|
6842
|
+
var isSentence$3 = isSentence$2;
|
|
6406
6843
|
|
|
6407
6844
|
var methods$1 = {
|
|
6408
6845
|
one: {
|
|
6409
6846
|
killUnicode: killUnicode$1,
|
|
6410
6847
|
tokenize: {
|
|
6411
|
-
splitSentences:
|
|
6412
|
-
|
|
6413
|
-
|
|
6848
|
+
splitSentences: splitSentences$1,
|
|
6849
|
+
isSentence: isSentence$3,
|
|
6850
|
+
splitTerms,
|
|
6851
|
+
splitWhitespace,
|
|
6414
6852
|
fromString,
|
|
6415
6853
|
},
|
|
6416
6854
|
},
|
|
@@ -6502,7 +6940,6 @@
|
|
|
6502
6940
|
'lt',
|
|
6503
6941
|
'maj',
|
|
6504
6942
|
'messrs',
|
|
6505
|
-
'mister',
|
|
6506
6943
|
'mlle',
|
|
6507
6944
|
'mme',
|
|
6508
6945
|
'mr',
|
|
@@ -6523,7 +6960,7 @@
|
|
|
6523
6960
|
'sir',
|
|
6524
6961
|
'sr',
|
|
6525
6962
|
'supt',
|
|
6526
|
-
'surg'
|
|
6963
|
+
'surg'
|
|
6527
6964
|
//miss
|
|
6528
6965
|
//misses
|
|
6529
6966
|
];
|
|
@@ -6606,7 +7043,7 @@
|
|
|
6606
7043
|
'dl',
|
|
6607
7044
|
'ml',
|
|
6608
7045
|
'gal',
|
|
6609
|
-
'ft', //ambiguous
|
|
7046
|
+
// 'ft', //ambiguous
|
|
6610
7047
|
'qt',
|
|
6611
7048
|
'pt',
|
|
6612
7049
|
'tbl',
|
|
@@ -6635,13 +7072,12 @@
|
|
|
6635
7072
|
'kmph', //kilometers per hour
|
|
6636
7073
|
'kb', //kilobyte
|
|
6637
7074
|
'mb', //megabyte
|
|
6638
|
-
'gb', //ambig
|
|
7075
|
+
// 'gb', //ambig
|
|
6639
7076
|
'tb', //terabyte
|
|
6640
7077
|
'lx', //lux
|
|
6641
7078
|
'lm', //lumen
|
|
6642
|
-
'pa', //ambig
|
|
7079
|
+
// 'pa', //ambig
|
|
6643
7080
|
'fl oz', //
|
|
6644
|
-
|
|
6645
7081
|
'yb',
|
|
6646
7082
|
];
|
|
6647
7083
|
|
|
@@ -6761,7 +7197,7 @@
|
|
|
6761
7197
|
r: 'ŔŕŖŗŘřƦȐȑȒȓɌɍЃГЯгяѓҐґ',
|
|
6762
7198
|
s: 'ŚśŜŝŞşŠšƧƨȘșȿЅѕ',
|
|
6763
7199
|
t: 'ŢţŤťŦŧƫƬƭƮȚțȶȾΓΤτϮТт',
|
|
6764
|
-
u: '
|
|
7200
|
+
u: 'ÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưƱƲǓǔǕǖǗǘǙǚǛǜȔȕȖȗɄΰυϋύ',
|
|
6765
7201
|
v: 'νѴѵѶѷ',
|
|
6766
7202
|
w: 'ŴŵƜωώϖϢϣШЩшщѡѿ',
|
|
6767
7203
|
x: '×ΧχϗϰХхҲҳӼӽӾӿ',
|
|
@@ -6795,7 +7231,7 @@
|
|
|
6795
7231
|
// const hasApostrophe = /['’]s$/
|
|
6796
7232
|
|
|
6797
7233
|
const addAliases = function (term, world) {
|
|
6798
|
-
let str = term.normal || term.text;
|
|
7234
|
+
let str = term.normal || term.text || term.machine;
|
|
6799
7235
|
const aliases = world.model.one.aliases;
|
|
6800
7236
|
// lookup known aliases like '&'
|
|
6801
7237
|
if (aliases.hasOwnProperty(str)) {
|
|
@@ -7015,10 +7451,10 @@
|
|
|
7015
7451
|
return this
|
|
7016
7452
|
};
|
|
7017
7453
|
|
|
7018
|
-
const api$
|
|
7454
|
+
const api$4 = function (View) {
|
|
7019
7455
|
View.prototype.autoFill = autoFill;
|
|
7020
7456
|
};
|
|
7021
|
-
var api$
|
|
7457
|
+
var api$5 = api$4;
|
|
7022
7458
|
|
|
7023
7459
|
// generate all the possible prefixes up-front
|
|
7024
7460
|
const getPrefixes = function (arr, opts, world) {
|
|
@@ -7100,7 +7536,7 @@
|
|
|
7100
7536
|
};
|
|
7101
7537
|
var typeahead = {
|
|
7102
7538
|
model: model$2,
|
|
7103
|
-
api: api$
|
|
7539
|
+
api: api$5,
|
|
7104
7540
|
lib,
|
|
7105
7541
|
compute: compute$1,
|
|
7106
7542
|
hooks: ['typeahead']
|
|
@@ -7259,15 +7695,16 @@
|
|
|
7259
7695
|
};
|
|
7260
7696
|
var reverse$1 = reverse;
|
|
7261
7697
|
|
|
7262
|
-
// generated in ./learn/tiger/conjugate
|
|
7263
7698
|
var presentModel = {
|
|
7264
|
-
rules: '
|
|
7265
|
-
exceptions: '
|
|
7699
|
+
rules: 'elten|ilt,erraten|3ät,ädieren|6,schehen|3ieht,ermögen|3ag,mgeben|5,hlaufen|6,usagen|5,ufgehen|6,rblühen|6,fechten|1icht,prengen|6,pfehlen|2iehlt,rtreten|6,eunigen|6,etragen|3ägt,egegnen|6,rstoßen|6,itragen|3ägt,ntgeben|6,fährden|6,orsehen|6,ufhören|6,chreien|5st,etteln|5st,nflehen|5st,osen|2te,esen|iest,tteilen|6,uziehen|6,rinken|5,egeben|5,rocknen|6t,uslösen|6,zichten|6,edürfen|2arf,edauern|6e,erden|3,brufen|5,flussen|6,öten|3,eharren|6,tsinnen|6,chützen|6,eloben|5,hwellen|2illt,pfinden|6,kziehen|6,eweinen|6,rletzen|6,blösen|5,chulden|6,ssaugen|6,ekehren|6,lasen|1äst,imessen|6,rzerren|6,ekennen|6,bachten|6,ulassen|6,chgehen|6,nplanen|6,bnen|3,tmen|3t,chämen|5,fhalten|2ält,ßachten|6,erauben|6,rspüren|6,agern|4e,rmeiden|6,rdenken|6,nfahren|2ährt,ntraten|3ät,chussen|3ßt,ktreten|6,hhalten|2ält,efehlen|2iehlt,rbünden|6,nrufen|5,ingeben|6,tfahren|2ährt,techen|1icht,nehaben|4t,andern|5e,fdecken|6,axen|2te,blassen|3ßt,nnähern|6e,rnähren|6,nbahnen|6,hlingen|6,twerten|6,hwenden|6,esellen|6,stlegen|6,shalten|6,fremden|6,ifahren|6,ttragen|3ägt,ffangen|2ingen,hdenken|6,eheben|5,edanken|6,idmen|4t,sweiten|6,rzeihen|6,edrigen|6,rderben|2irbt,uellen|1illt,fwerfen|6,sbluten|6,ddieren|6,ebären|2iert,choten|4te,limmern|6e,öchten|5,ehüten|5,öffnen|5t,eraten|2ät,stützen|6,werben|1irbt,ehalten|2ält,nlegen|5,ordnen|5t,chlafen|3äft,amieren|6,issen|1ßt,waschen|1äscht,thalten|2ält,rhalten|6,fangen|1ängt,rühren|5,tstehen|6,rtragen|3ägt,helfen|1ilft,laden|1ädt,sterben|2irbt,treffen|2ifft,wachsen|1ächst,passen|2ßt,tun|2t,fassen|2ßt,essen|ißt,werfen|1irft,treten|2itt,gnen|3t,sehen|1ieht,laufen|1äuft,chnen|4t,lassen|1äßt,nehmen|1immt,rechen|1icht,geben|1ibt,fallen|1ällt,den|2t,eln|2t,ern|2t,ten|2t,en|t',
|
|
7700
|
+
exceptions: 'halten|1ält,verlangen|8,bestehen|7,wissen|1eiß,rechnen|6,anschauen|8,sehen|4,denken|5,wirken|5,raten|1ät,darstellen|9,gehören|6,schlagen|4ägt,einbeziehen|10,hungern|6e,fahren|1ühren,ruhen|4,fühlen|5,freuen|4te,kommentieren|11,verschmelzen|11,speisen|6,versuchen|8,steuern|6e,ausschlagen|7ägt,entgegenstehen|13,streben|6,lauten|5,feiern|Feiert,engagieren|9,melden|Melden,erteilen|Erteilt,verstreichen|11,durchleuchten|12,greifen|Greift,erhalten|3ält,regeln|5e,präsentieren|11,entwickeln|7le,existieren|9,angehen|6,wimmern|6st,weißen|Weißt,spüren|Spürst,gefangenhalten|9ält,vorankommen|10,ignorieren|9,tragen|5,stoßen|2ößt,fertigen|6te,umschlagen|6ägt,erwirtschaften|13,billigen|7,verdienen|8,rauchen|6,tauschen|Tauschen,betrachten|9,zielen|5,werben|5,appellieren|10,tangieren|8,sorgen|5,verhandeln|7le,durchschlagen|12,unterdrücken|11,zahlen|5,verbrauchen|10,graben|2äbt,rücken|5,gebrauchen|9,erfahren|3ährt,unterliegen|10,registrieren|11,verbessern|9e,bedenken|7,anschicken|9,gegenüberstehen|14,fernhalten|9,sparen|5,blockieren|9,verhalten|4ält,schicken|6st,rauskommen|9,zuschauen|8,profitieren|10,lieben|5,bewundern|8e,rechtfertigen|12,vorwerfen|4irfst,vorfinden|8,brechen|6,tagen|Tagt,verstecken|9,offenhalten|6ält,grenzen|6,verbergen|4irgt,weigern|6e,verlaufen|8,malen|2hlt,entgegennehmen|13,gestatten|Gestatten,vergleichen|10,prägen|5,behindern|8e,sicherstellen|12,untersagen|9,reden|4,kaufen|5,anrichten|8,beuten|5,verfahren|8,verschlagen|7ägt,übereinstimmen|13,verschieben|10,zehren|5,strotzen|7,blühen|Blüht,abstammen|8,koppeln|6e,bevorstehen|10,schrecken|8,pressen|3ßt,aufschlagen|7ägt,hassen|5,bergen|5,antreffen|8,anweisen|7,totschlagen|2dtschlägt,berücksichtigen|Berücksichtigen,rutschen|7,autorisieren|11,offerieren|Offeriert,folen|3gen,brennen|6,beabsichtigen|12,veranlassen|10,verbleiben|9,anhalten|7,abschneiden|10,dehnen|5,essen|4,gleichkommen|11,beschaffen|9,entschuldigen|12,küssen|2ßt,anpassen|7,tendieren|8,erzeugen|7,tarnen|5,zersetzen|8,kollaborieren|12,aufbringen|9,überwachen|9,verstellen|9,täuschen|7,offenstehen|10,ergehen|6,unterschlagen|9ägt,entgegenschlagen|15,verhelfen|8,erschöpfen|9,telefonieren|Telefoniert,stabilisieren|12,abweichen|8,backen|5,bereinigen|Bereinigt,wandeln|4le,zusammengehen|12,expandieren|10,abwickeln|6le,einhalten|8,schmelzen|4ilzt,wiedertreffen|12,müssen|5,lecken|5,einschlagen|10,wetten|Wetten,erkaufen|7,gelten|1ilt,hissen|2ßt',
|
|
7701
|
+
rev: 'hnelt|4n,schieht|3ehen,rinnert|6n,erficht|3echten,eißelt|5n,immerst|5n,chreist|5en,ettelst|5n,nflehst|5en,tößt|1oßen,ergißt|3essen,iest|esen,ähert|4n,räbt|1aben,rleiert|6n,chwillt|3ellen,chickst|5en,rwirfst|2erfen,läst|1asen,erbirgt|3ergen,ermißt|4ssen,ufhält|3alten,reßt|2ssen,uschußt|5ssen,rchhält|4alten,uchert|5n,ticht|1echen,nnehat|5ben,erblaßt|5ssen,rillert|6n,uillt|1ellen,ebiert|2ären,chmilzt|3elzen,ßert|3n,fiehlt|1ehlen,behält|3alten,enhält|3alten,erhält|3alten,mißt|1essen,frißt|2essen,schläft|4afen,tschert|6n,ssert|4n,wäscht|1aschen,pert|3n,auert|4n,thält|2alten,fängt|1angen,kert|3n,fährt|1ahren,hilft|1elfen,lädt|1aden,trifft|2effen,felt|3n,wächst|1achsen,paßt|2ssen,zelt|3n,tut|2n,rät|1aten,faßt|2ssen,mmelt|4n,pelt|3n,wirft|1erfen,chelt|4n,belt|3n,fert|3n,schlägt|4agen,irbt|erben,trägt|2agen,tritt|2eten,bert|3n,ichert|5n,delt|3n,mmert|4n,telt|3n,sieht|1ehen,läuft|1aufen,euert|4n,läßt|1assen,selt|3n,nimmt|1ehmen,kelt|3n,richt|1echen,gibt|1eben,fällt|1allen,gert|3n,gelt|3n,tert|3n,dert|3n,et|1n,t|en,eiß|issen,ermag|3ögen,ühren|ahren,olgen|2en,ffingen|2angen,reute|3en,egele|4n,ertigte|5en,oste|2en,bessere|6n,oppele|5n,axte|2en,nnähere|6n,chotte|4en,limmere|6n,uere|3n,wickle|4eln,andle|3eln,gere|3n,ndere|4n,e|1n,edarf|2ürfen,erd|3en'
|
|
7266
7702
|
};
|
|
7267
7703
|
|
|
7268
7704
|
var pastModel = {
|
|
7269
|
-
rules: '
|
|
7270
|
-
exceptions: '
|
|
7705
|
+
rules: 'klimmen|2omm,iziehen|2ogen,hwellen|2oll,ulassen|2ieße,rlieren|2or,sdehnen|5ten,efehlen|2ahl,rkünden|6te,rtönen|4ten,nregen|4ten,esitzen|2aß,ehalten|2ielt,ufgeben|3aben,blehnen|5ten,pfehlen|2ahl,hlingen|2angen,efinden|2anden,elten|alt,otten|4ten,haupten|6te,tdecken|5ten,ewegen|4te,etonen|4te,chlafen|3iefen,egeben|2aben,toppen|4ten,hmlegen|5ten,eenden|5ten,tlassen|2ieß,etragen|3ug,chuften|6ten,etreten|3äten,liehen|1ohen,üsten|4te,flegen|4ten,erebben|5te,ühmen|3te,rsitzen|2aß,pfangen|2ing,ntragen|5ten,schehen|3ah,rhängen|5te,eidigen|5ten,hneiden|2itten,rwarten|6ten,elaufen|2iefen,rumpfen|5te,itragen|3ug,scheren|5ten,rspüren|5ten,tliegen|2agen,lingeln|6ten,rbitten|2aten,längern|6ten,rringen|2ang,greißen|2issen,rsinken|2anken,udieren|5ten,ingehen|3ing,osten|4ten,hädigen|5te,lüchten|6ten,liessen|1oß,ermuten|6ten,erüben|4ten,ekennen|2annten,redigen|5ten,rgraben|3ub,tiieren|5ten,prühen|4ten,lvieren|5ten,idmen|4te,ermögen|4chten,erehren|5ten,hwinden|2anden,rägen|3te,helegen|5ten,rhöhen|4ten,trömen|4ten,ümpeln|5ten,edrohen|5te,umgehen|3ing,rmorden|6ten,ewerten|6ten,drucken|5ten,pflügen|5ten,nstigen|5ten,tinken|1ank,rqueren|5ten,usten|4ten,ftragen|5ten,rehen|3te,ilmen|3te,erknien|6te,röffnen|6te,hezeien|5te,ürgern|5ten,fheulen|5ten,öten|3te,nlasten|6ten,undigen|5te,rwürgen|5te,egegnen|6ten,standen|6te,efallen|2iel,rbosen|4te,ulegen|4ten,palten|5te,rlauben|5ten,ejahen|4te,egehen|2ingen,fährden|6ten,inbüßen|5ten,lucksen|5te,rleihen|2ieh,ufrufen|3iefe,mpieren|5ten,uwinken|5ten,rwähnen|5te,tfalten|6te,tfallen|2iele,sfallen|2iel,chwören|3oren,gnieren|5ten,rsachen|5te,rwenden|6ten,ugehen|2ingen,ressen|1aßen,flügeln|6ten,nwenden|2andte,eitigen|5ten,ehmigen|5te,fdecken|5ten,nweisen|2iesen,enügen|4ten,slaufen|2iefen,utmaßen|5te,gräumen|5ten,rgolden|6ten,rwägen|2og,rüfen|3te,ruhigen|5ten,umpen|3ten,uellen|1oll,erübeln|6ten,hleppen|5ten,ohnen|3te,ewirken|5ten,anschen|5ten,inzeren|5ten,östigen|5ten,chellen|5ten,hwemmen|5ten,irieren|5ten,orzugen|5te,tarten|5ten,peisen|4ten,tuieren|5ten,bildern|6ten,nlassen|2ieß,elieren|5ten,ekunden|6ten,rwachen|5te,lanen|3te,chaden|5te,npassen|3ßte,eliegen|2ag,spießen|5te,stragen|3ug,rrieren|5ten,hwimmen|2ammen,altigen|5ten,ewerfen|2arfen,nrücken|5ten,tapeln|5ten,okern|4ten,sbilden|6ten,twerden|2urde,rlieben|5te,rlocken|5ten,kliegen|2ag,limmern|6ten,sfüllen|5ten,ewahren|5ten,chweben|5ten,ungern|5ten,hillern|6ten,blaufen|2ief,mpören|4ten,bziehen|2ogen,rneinen|5ten,gwöhnen|5ten,edürfen|2urfte,ringern|6ten,ichtern|6ten,alzen|3ten,efragen|5ten,olstern|6ten,emahnen|5ten,pannen|4ten,rimmen|4te,rwiegen|2ogen,orwagen|5ten,nfangen|2ingen,ulichen|5ten,bgeben|2äben,hringen|2ang,esten|4te,rhelfen|2alfen,stücken|5ten,uhören|4ten,penden|5ten,strafen|5te,sweiten|6te,rsorgen|5te,nallen|4ten,glassen|2ießen,rfangen|2ing,chämen|4te,mlaufen|2iefen,bdecken|5ten,oltern|5ten,ilassen|2ießen,lündern|6ten,ewerben|2arb,esetzen|5ten,ufhören|5ten,tmen|3te,erfegen|5ten,bwenden|6ten,forsten|6te,ümmeln|5ten,btun|2aten,ertun|3aten,prengen|5te,trengen|5ten,zwecken|5ten,ersten|arsten,erkern|5ten,efreien|5te,chalten|6te,eiraten|6te,risten|5te,tocken|4ten,hlaufen|2ief,ckgehen|3ing,fnehmen|2ähmen,chüren|4ten,nnahmen|5ten,rwalten|6te,kreiden|6te,lummern|6ten,remsen|4te,umieren|5ten,siegeln|6ten,treifen|5te,nachten|6ten,rdieren|5ten,rösten|5ten,illegen|5ten,mkommen|2amen,rtiefen|5ten,ohren|3ten,augen|og,bsetzen|5ten,klaufen|2ief,fhäufen|5te,lühen|3ten,üssen|ußte,erlesen|3as,apieren|5ten,uslosen|5ten,ächen|3te,rdauern|6ten,uftun|3äte,erkeln|5ten,umpeln|5ten,alieren|5ten,ahnden|5ten,nreihen|5ten,öschen|4ten,auben|3te,ordnen|5ten,eiern|4ten,erholen|5ten,rleiben|5te,hweigen|2ieg,cheinen|2ienen,ürchten|6ten,treiten|2itt,mühen|3te,sammeln|6ten,währen|4ten,stufen|4te,chreien|3ie,mitteln|6ten,treiken|5ten,pringen|2ang,lagern|5ten,leiden|1itten,folgen|4ten,graben|2uben,rdigen|4te,aunen|3ten,bergen|1arg,heben|1ob,harren|4ten,uldigen|5ten,laden|1ud,rlaufen|2iefen,amieren|5ten,isten|4ten,senden|1andte,regen|3te,zünden|5ten,issen|1ßte,denken|1achten,ruhen|3te,tagen|3te,rliegen|2ag,kaufen|4te,wachsen|1uchs,edigen|4te,sorgen|4ten,heißen|1ieß,ähen|2te,buchen|4ten,trinken|2ank,ummen|3te,eimen|3te,hoffen|4ten,nsetzen|5ten,dichten|6ten,rgießen|2oß,nten|3te,nbaren|4ten,affen|3te,fragen|4te,mucken|4ten,usgehen|3ingen,streben|5ten,meiden|1ied,üben|2te,oppeln|5ten,dringen|2angen,passen|2ßten,chützen|5ten,ammen|3te,singen|1ang,rasen|3ten,lasten|5te,horchen|5te,zeigen|4ten,hängen|1ingen,ngehen|2ingen,ausen|3te,wählen|4ten,wandern|6ten,wehen|3te,lden|3te,innen|annen,cheiden|2ied,ndigen|4ten,eden|3te,ehnen|3te,erben|arben,rufen|1ief,fliegen|2ogen,wingen|1ang,frieren|2or,rmen|2te,ahnen|3te,fassen|2ßten,rgehen|2ing,dienen|4te,stimmen|5te,einigen|5ten,bieten|1ot,essen|aß,sitzen|1aßen,leiten|5te,zeugen|4ten,langen|4te,ven|1te,üpfen|3te,stoßen|2ießen,uten|3te,lingen|1ang,raten|1iet,äumen|3te,klagen|4te,ügen|2te,rbeiten|6ten,üßen|2te,steigen|2iegen,fahren|1uhr,treffen|2af,ppen|2te,reisen|4ten,sehen|1ah,ösen|2te,lichen|4te,achen|3ten,reiben|1ieb,werfen|1arf,sagen|3te,ligen|3te,rnen|2te,tten|3te,rten|3te,treten|2at,pfen|2ten,gnen|3te,eißen|iß,ften|3te,bringen|2achte,leben|3te,chlagen|3ug,eichen|ich,uchen|3te,ennen|annte,fallen|1ielen,legen|3te,ziehen|1og,chnen|4te,halten|1ielten,weisen|1ies,inden|and,ießen|ossen,uen|1te,stehen|2and,geben|1ab,nehmen|1ahm,schen|3te,chten|4te,tigen|3te,kommen|1am,zen|1te,eln|2te,len|1te,ken|1te,ern|2te,ren|1te',
|
|
7706
|
+
exceptions: 'wünschen|6ten,aussprechen|6achen,machen|4te,entsprechen|6achen,halten|1ielte,sprechen|3ach,loben|3te,lassen|1ieß,suchen|Suchte,argumentieren|11ten,erlassen|3ießen,brechen|2achen,rebellieren|9ten,demonstrieren|11ten,versuchen|7ten,erreichen|7te,tragen|2ugen,gehen|1ingen,stehen|2ünden,rufen|1iefen,schaffen|3uf,gehören|5ten,fassen|2ßte,protestieren|10ten,gründen|6te,schließen|4oß,teilen|4ten,organisieren|10ten,haben|Hätte,begreifen|4iffen,rutschen|6ten,laufen|1ief,liegen|1ag,bitten|1at,heben|1oben,beschränken|9ten,besiedeln|8ten,wissen|1ußten,verlangen|7ten,warnen|4ten,deuten|5ten,treffen|2afen,bleiben|2ieben,meinen|4te,greifen|2iff,bekräftigen|9ten,treiben|2ieben,landen|5ten,verschieben|6oben,errichten|8ten,drohen|4ten,einlegen|6ten,begründen|8ten,neigen|4te,reichen|5ten,fehlen|4ten,brauchen|6ten,richten|6ten,unterschreiben|9ieben,verweigern|9ten,versprechen|6ach,wenden|1andte,feuern|5ten,steigen|2ieg,stammen|5ten,übergeben|5aben,öffnen|5ten,rollen|4ten,verbrennen|5annten,ändern|5ten,fangen|1ingen,tun|1at,denken|1achte,wirken|4ten,einschätzen|9ten,beschließen|6oß,präsentieren|10ten,drängen|5ten,siegen|4ten,sinken|1ank,bestehen|4ünde,begleiten|8ten,ignorieren|8ten,verbringen|5achten,verbreiten|9te,versperren|8ten,fahren|1uhren,gestalten|8te,blockieren|8ten,entstehen|5anden,beabsichtigen|11ten,ordnen|5te,erfordern|8ten,verstärken|8ten,beteiligen|8ten,veranschlagen|11ten,diskutieren|9ten,veranstalten|11ten,verlassen|4ieß,votieren|6ten,überlassen|5ieß,brennen|2annten,widersprechen|8ächen,ausstellen|8ten,verschmelzen|7olzen,mißhandeln|9ten,anstehen|4anden,scheiden|3ieden,vorherrschen|10ten,lieben|4ten,verdrängen|8te,werben|1arb,blicken|5ten,gleichen|2ichen,sichern|6ten,enthalten|4ielt,annehmen|3ahmen,kumulieren|8ten,enden|4te,skandieren|8ten,eintreffen|5afen,lauschen|6ten,weinen|4ten,sollen|4test,fortschreiten|8itt,identifizieren|12ten,beschenken|8ten,abstimmen|7ten,existieren|8ten,reifen|4ten,verkämpfen|8te,urteilen|6ten,unterschreiten|9itt,tauchen|5ten,tummeln|6ten,verschenken|9ten,hegen|3ten,zustimmen|7ten,merken|4ten,interessieren|11ten,mögen|1ochte,bereiten|7te,entschuldigen|11te,ergreifen|4iff,naturalisieren|12ten,schmelzen|4olz,kehren|4ten,trauern|6ten,operieren|7ten,kleiden|6te,schmähen|6ten,behandeln|8ten,rechtfertigen|11ten,absperren|7ten,bezweifeln|9ten,vorliegen|4ägen,betrachten|9ten,widersetzen|9ten,steigern|7ten,ergeben|3äben,basieren|6ten,weiterfahren|7ühre,beten|4te,erfassen|4ßte,zeihen|1iehen,kichern|6ten,breiten|6te,zusammenbrechen|10achen,verhindern|9ten,ausreichen|8ten,aufbrechen|5achen,auszeichnen|10ten,wagen|3te,zwingen|2angen,honorieren|8ten,einbeziehen|6ogen,hinterlassen|7ießen,passieren|7ten,weitergehen|7inge,reiben|1ieben,debattieren|Debattierten,kleben|4ten,werden|1ard,hinzukommen|6amen,einen|3te,animieren|7ten,zerlegen|6ten,einbrechen|5ach,gleiten|2itt,mitarbeiten|10te,erfolgen|6te,einschließen|7oß,polieren|6ten,blättern|7ten,nutzen|4ten,ausbreiten|9ten,helfen|1alf,wägen|1ogen,lesen|1asen,eignen|5ten,hemmen|4te,schieben|3ob,überreichen|9te,übertragen|6ug,erkranken|7ten,unterbreiten|11ten,residieren|8ten,erhören|5ten,bauen|3ten,schreiten|4itten,ausbleiben|5ieb,eilen|3ten,einschreiten|7itten,erwirtschaften|13ten,unterscheiden|8iedet,unken|Unkten,trennen|5ten,zuspitzen|7ten,münden|5te,garantieren|9ten,verklären|7ten,nähern|5ten,erarbeiten|9te,insistieren|9ten,vorhalten|4ielt,betteln|6ten,abschütteln|10ten,zieren|4ten,regieren|6ten,vorbereiten|10ten,wiegen|1og,recken|4ten,davonkommen|6ämen,einziehen|4ogen,trauen|4ten,favorisieren|10ten,zusammenkommen|9amen,vortragen|5ugen,reden|4ten,unterstehen|7ünden,erwachsen|3üchse,einreisen|7te,zirkulieren|9ten,waschen|1usch,verdächtigen|10ten,inspizieren|9ten,auskundschaften|14ten,säumen|4ten,sein|wart,befrachten|9ten,weiten|5ten,solidarisieren|12ten,verbleiben|5ieben,umstellen|7ten,zugutekommen|7amen,zurückreichen|11ten,finanzieren|9ten,anhalten|3ielt,flachen|5te,vermindern|9ten,versteigen|5ieg,hinnehmen|4ähme,unterbrechen|7ach,unterlaufen|6ief,weiterproduzieren|15ten,kosen|3tet,musizieren|8ten,toben|3ten,häufen|4ten,berechnen|8ten,herausdringen|8ang,miterleben|8ten,korrigieren|9ten,aufbringen|5ächten,versagen|6ten,praktizieren|10ten,kandidieren|9ten,erschließen|6oß,herankommen|6amen,schauen|5ten,intonieren|8ten,vegetieren|8ten,kriechen|2ochen,ritzen|4ten,aufgreifen|5iffen,unterbleiben|7ieb,jagen|3ten,wildern|6ten,diskriminieren|12ten,aufgehen|4ing,tanzen|4ten,vertragen|5ügen,zusammenhalten|9ielte,hocken|4ten,verstecken|8ten,durchklingen|7angen,trachten|7ten,weiterdebattieren|15ten,verbilligen|9ten,mehren|4ten,dominieren|Dominierten,schirmen|Schirmte,draufgehen|6ingen,beißen|1isse,ersetzen|6ten,provozieren|9ten,ausbrechen|5ach,aufarbeiten|10te,festschreiben|8ieben,überfordern|10ten,spekulieren|9ten,schütten|7ten,gebrauchen|8ten,unterziehen|6ogen,nützen|4ten,modellieren|9ten,ansiedeln|8ten,wickeln|6ten,zurückfordern|12ten,ringen|1angen,anschließen|6oß,waten|4ten,riechen|1och,ausschließen|7össen,zukommen|3äme,hantieren|7ten,verhärten|8ten,verteilen|7ten,saugen|1og',
|
|
7707
|
+
rev: 'rklomm|3immen,nahm|1ehmen,kam|1ommen,uließe|2assen,estünde|3ehen,ochte|ögen,erführe|3ahren,ufriefe|3ufen,erginge|3ehen,ntfiele|3allen,npaßte|3ssen,ntwurde|3erden,rwüchse|2achsen,edurfte|2ürfen,eitelte|5n,innähme|3ehmen,isse|eißen,ußte|üssen,uftäte|3un,ukäme|2ommen,felte|3n,herte|3n,kelte|3n,mmerte|4n,ißte|1ssen,faßte|2ssen,ickerte|5n,schrie|4eien,empelte|5n,ttelte|4n,hielte|1alten,äußerte|5n,nerte|3n,mmelte|4n,perte|3n,ferte|3n,berte|3n,belte|3n,andte|enden,zelte|3n,selte|3n,delte|3n,brachte|2ingen,gerte|3n,annte|ennen,gelte|3n,uerte|3n,derte|3n,terte|3n,ete|1n,te|en,chuf|2affen,alf|elfen,griff|2eifen,rief|1ufen,traf|2effen,warf|1erfen,lief|1aufen,efanden|2inden,ußten|issen,hliefen|2afen,schoben|3ieben,eträten|3eten,lohen|1iehen,euerten|4n,rachten|1ingen,stlagen|3iegen,uhren|ahren,erbaten|3itten,grissen|2eißen,rsanken|2inken,prächen|2echen,kannten|1ennen,hmolzen|2elzen,chieden|2eiden,möchten|2gen,hwanden|2inden,lichen|1eichen,nnahmen|2ehmen,orlägen|3iegen,iehen|eihen,chworen|3ören,raßen|1essen,nwiesen|2eisen,asen|esen,äherten|4n,hwammen|2immen,onkämen|3ommen,ewarfen|2erfen,llerten|4n,erwogen|3iegen,rhalfen|2elfen,rächten|1ingen,rochen|1iechen,rtrügen|3agen,arsten|ersten,fnähmen|2ehmen,hlössen|2ießen,eierten|4n,griffen|2eifen,chienen|2einen,rannten|1ennen,standen|2ehen,gruben|2aben,trafen|2effen,auerten|4n,dachten|1enken,gäben|1eben,hritten|2eiten,kerten|3n,mmerten|4n,trugen|2agen,stünden|2ehen,fingen|1angen,taten|1un,hingen|1ängen,annen|innen,gaben|1eben,itten|eiden,arben|erben,flogen|2iegen,saßen|1itzen,stießen|2oßen,ließen|1assen,stiegen|2eigen,terten|3n,rachen|1echen,zogen|1iehen,liefen|1aufen,aßten|1ssen,kamen|1ommen,angen|ingen,ieben|eiben,fielen|1allen,gerten|3n,gingen|1ehen,hielten|1alten,ossen|ießen,derten|3n,elten|2n,eten|1n,ten|en,alt|elten,olltest|3en,chiedet|2eiden,ostet|2en,bot|1ieten,riet|1aten,hielt|1alten,itt|eiten,trat|2eten,tschloß|5iessen,saß|1itzen,hieß|1eißen,aß|essen,ließ|1assen,iß|eißen,oß|ießen,tergrub|5aben,chob|2ieben,hob|1eben,warb|1erben,ieb|eiben,gab|1eben,chmolz|3elzen,erlieh|3eihen,usch|aschen,och|iechen,rach|1echen,ah|ehen,ich|eichen,ard|erden,lud|1aden,band|1inden,ied|eiden,fand|1inden,stand|2ehen,rwog|2ägen,fing|1angen,barg|1ergen,ieg|eigen,lag|1iegen,ging|1ehen,zog|1iehen,ug|agen,ang|ingen,erlas|3esen,wuchs|1achsen,wies|1eisen,oll|ellen,fahl|1ehlen,fiel|1allen,or|ieren,fuhr|1ahren,ank|inken'
|
|
7271
7708
|
};
|
|
7272
7709
|
|
|
7273
7710
|
let infToPresent = uncompress$1(presentModel);
|
|
@@ -7291,8 +7728,24 @@
|
|
|
7291
7728
|
return convert$1(str, pastToInf)
|
|
7292
7729
|
};
|
|
7293
7730
|
|
|
7731
|
+
const all = function (str) {
|
|
7732
|
+
let arr = [str];
|
|
7733
|
+
let past = toPast(str);
|
|
7734
|
+
if (past !== str) {
|
|
7735
|
+
arr.push(past);
|
|
7736
|
+
}
|
|
7737
|
+
let present = toPresent(str);
|
|
7738
|
+
if (present !== str) {
|
|
7739
|
+
arr.push(present);
|
|
7740
|
+
}
|
|
7741
|
+
return arr
|
|
7742
|
+
};
|
|
7294
7743
|
|
|
7295
|
-
var
|
|
7744
|
+
var verb = { toPresent, fromPresent, toPast, fromPast, all };
|
|
7745
|
+
|
|
7746
|
+
|
|
7747
|
+
// console.log(toPresent('zusammenzufuehren'))
|
|
7748
|
+
// console.log(toPast('gehen'))
|
|
7296
7749
|
|
|
7297
7750
|
// generated in ./lib/lexicon
|
|
7298
7751
|
var lexData = {
|
|
@@ -7303,7 +7756,7 @@
|
|
|
7303
7756
|
"Conjunction": "true¦bAd7entwed6falls,in5nach5o3so2und,w0zumal;e0ohingegen;d4il,nn2;lange,ndern,wie;b0d2;!glei3;dem;er;a1enn,o0;ch;ss,ß;e0zw;vor,ziehungsweise",
|
|
7304
7757
|
"Determiner": "true¦d2ein0;!e0;!m,n,r,s;as,e0ie;m,n,r,s",
|
|
7305
7758
|
"City": "true¦0:3A;a2Yb28c1Yd1Te1Sf1Qg1Kh1Ci1Ajakar2Jk11l0Um0Gn0Co0ApZquiYrVsLtCuBv8w3y1zuri22;ang1We1okohama;katerin1Krev0;ars4e3i1rocl4;ckl0Yn1;nipeg,terth0Z;llingt1Rxford;aw;a2i1;en2Klni33;lenc2Yncouv0Ir2J;lan bat0Ftrecht;a7bilisi,e6he5i4o3rondheim,u1;nWr1;in,ku;kyo,ronJulouD;anj26l16miso2Mra2D; haKssaloni10;gucigalpa,hr0l av0O;i1llinn,mpe2Engi09rtu;chu25n0pU;a4e3h2kopje,t1ydney;ockholm,uttga15;angh1Ienzh20;o0Nv01;int peters0Xl4n1ppo1I; 1ti1E;jo1salv3;se;v1z0T;adW;eykjavik,i2o1;me,sario,t28;ga,o de janei1A;to;a9e7h6i5o3r1ueb1Tyongya1Q;a1etor28;gue;rt1zn0; elizabe4o;ls1Jrae28;iladelph23nom pe0Aoenix;r1tah tik1C;th;lerLr1tr13;is;dessa,s1ttawa;a1Klo;a3ew 1is;delWtaip1york ci1U;ei;goya,nt0Xpl0Xv0;a7e6i5o2u1;mb0Oni0L;nt2sco1;u,w;evideo,real;l0n03skolc;dellín,lbour0U;drid,l6n4r1;ib2se1;ille;or;chest1dalYi11;er;mo;a6i3o1vCy03;nd1s angel0H;on,r0G;ma1nz,sb00verpo2;!ss1;ol; pla0Jusan0G;a6hark5i4laipeda,o2rak1uala lump3;ow;be,pavog1sice;ur;ev,ng9;iv;b4mpa0Lndy,ohsiu0Ira1un04;c1j;hi;ncheNstanb1̇zmir;ul;a6e4o1; chi mi2ms,u1;stJ;nh;lsin1rakliH;ki;ifa,m1noi,va0B;bu0UiltE;alw5dan4en3hent,iza,othen2raz,ua1;dalaj0Hngzhou;bu0R;eVoa,ève;sk;ay;es,rankfu1;rt;dmont5indhovV;a2ha02oha,u1;blSrb0shanbe;e1kar,masc0HugavpiK;gu,je1;on;a8ebu,h3o1raioKuriti02;lo1nstanKpenhagOrk;gGmbo;enn4i2ristchur1;ch;ang m2c1ttagoM;ago;ai;i1lgary,pe town,rac5;ro;aIeCirminghXogoBr6u1;char4dap4enos air3r1s0;g1sa;as;es;est;a3isba2usse1;ls;ne;silRtisla1;va;ta;i4lgrade,r1;g2l1n;in;en;ji1rut;ng;ku,n4r1sel;celo2ranquil1;la;na;g2ja lu1;ka;alo1kok;re;aDbBhmedabad,l8m5n3qa2sh1thens,uckland;dod,gabat;ba;k1twerp;ara;m0s1;terd1;am;exandr2ma1;ty;ia;idj0u dhabi;an;lbo2rh1;us;rg",
|
|
7306
|
-
"Verb": "true¦0:
|
|
7759
|
+
"Verb": "true¦0:4P;1:4I;2:4O;3:3W;4:3U;a4Ab3Gd3Be2Nf2Gg1Nh1Ci23k1Al15m12n10p0Yr0Ws0Ht0Bu05vSwFz7ä6über5;ne10ras2sp39trUwa2;nd2Uußer4;eBi2Qog0u5ä2Nög0;ge9rück6sammen5;geb4Mhä1;ge6zu5;drä1erob2P;ga1wies0;la4Hsp4Iw4A;igDrstö1Y;aFeDi9o8u7ä6ü5;nsche3rde3;hl0re3;rd0ß4;l17rd0;ch0der24e6r5s0S;d,ke3;derhol5s;e,te;i5r2N;ch0gere,st;ch0Mndt0r5;!en,f,n4;er8or5;ausg0Uge5lK;d2Kga1schl5;ag0;bCdBfüg0gAhä1l8mHrat0s6tret0wechs39öffentlich5;en,t;chli1pr5ucht2W;e2ic2Ao2;a1oren5;!g0M;a1e3Sli2;eutli2ie17rä1;ot0u36;mg0Inter5;br8l7st5;r5üP;ei2ich05;ag;i1o2;a8hro0Zr6ue,ä5;t0us2;a5in26ug;f,t0;pp0u5;ch0s2;a2VchEeCiAol09p9t5;a6e5reik0ärk0ü2S;c20i2Tll4;mm5ndT;e,t;iel0ra2;n5tz0;d,g0ke;i5tzt0;!d,en;a8ein0ienMl7rie6we2Aü5;tz0;!b;a2Iepp0;fOue;ei1Qief,uts2ä5üc1N;ch0um4;asElant1Wr5;ophezeit,äg0;a5iedeM;hm0;ach1Eein4i6öch4ü5;s9ßF;s2tb1Dßbrau2;a6ehn4ie27ud,ä5ös0;dt,g0;g6s5;se;!en;am0omme,rie2önne,ü5;mm0Pnd1L;aCer9in8of7ä5;n1Qt5;te3;fe;blä0Hg0wegtäus2;rs0Ivo5;rg5;ega1;be3l4nde6t5;!te3;le;ab0e7i6l5;aub0i2änz0;b,ng;bPdOfNga1halt0lu1mac0JpJrIsBt9w6z5;og0wu1;a6es0o5;nn0rd0;n1Us2;an,r5;ag0o0W;ch8p1Yt7u5;c0Bn5;g0k0;a07orb0ri2;a0Rl5;eu5o1S;st;at0u1;a6la5;nt;a5rkt;rt;aVu11;acZru1;e8o7r5;a5o2;cWucW;r0t0;!t0;a1eEiAorder9reige8uß0ördKü5;h5rc0S;le3r5;e,te3;sp1B;n,te3;el08ng0;ingeQmpfPntIr5;fFga1hEinnerDklär05läutCmögliYrAs7wäg0z5örtC;wu1ä5;hl0;ch5to2;i0o12ü5;tt7;ei5u1;che;ern;n,tX;ob0öhP;r00ü5;ll0;ga1la0Ts5;ch8pr6ta5;nd;a2e2ic5o2;ht;ei5ied0;de;a1ing;d5frQga1;ru1;en8r7urchd6ürf5;e,t0;ri1;a1i1ä1ück0;ke;aXe9i8liebEra5;cSu5;ch5;e3t;e4n;aQdien0fNgLherrs2kam0mängKnötiIrFsAt5wältG;on7r5;aPo5;ff0;en,t5;!e;ch7itze,p04tät5;ig5;en,te;ied,lo00w5äft7;or0;ichte4ücksicht5;ig0;te;ge3;!n;eln;an5li2onn0rab0;g0n;i6ürc5;ht0;nd0;bsichti5nspru2;ge;ng0ue;bFngeCu5;f9s5;ge5ma2;bIg6s5;cFpH;a1li2;ge5ma2;bEfa1ga1hob0zwu1;bot0fa1ga1spDw5;an5;dt;ge6hä1;ng0;b8s5;c5traft;hlo5;ss0;ro2;ch0;en",
|
|
7307
7760
|
"Noun": "true¦0:8A;1:7Z;2:89;3:7K;4:7H;5:7Q;6:87;7:7F;8:7P;9:5K;A:7B;B:84;a7Cb6Ec68d60e5Nf51g4Ah3Ti3Oj3Kk36l2Um27n20o1Zp1Kr16s0Gt07u03vSwHzDäCölvor5Jüber2J;gypten4Sngs3rz3;aEeDuCwic3E;ge,kä1Bstande5G;c4hn3Qit04l3;c6Ogr6T;aKeGiEocheCä4Lört2ürst2;!nC;!en7J;dersCnt1ssen4D;a4Zp5O;ge,hrpflichtige,iElt,n7GrCsen4T;n1rat36tC;!e,papi6U;g1se;ff0hl0ige9lC;den40es;arian3eIieHoC;igt,lk,rC;ab1Lg7Kpres2sCwürfe6;chußlorbe6NitzendeDtandsC;sp2PvA;!r;l77rteljahrhunde67;ned3PrC;antwortlic5brau4KdDgleic4haCkä0Plus3teid6F;l51ndlungst1N;acBächtige6;ltent2QmDnterCrN;geb4Sschri3U;brü2fr78sCwelt3D;chuldungs4Ntänd0;aHei9hyss0iGoFreDürC;!en;ndCpp2uhanda5O;!w7;de,nn0;e0Xg1s51;sc5tDuC;be,s7;sac5;aZchVeUiTkand2Non5DpOtEuDynod2Nz4UüC;d0pp2;c4detendeuts2mI;aJeIimHrEuCädt2;dieCf0nd0;ngebü3Qr7;aDeC;et,ß;t5Eß0;me6;inkohleze2l1Z;atsCdtrat,rza3T;a01di5U;arFd ErC;ac4echC;ch6Wer;frak3Ll4SvA;er,te;cBgnal6Wnn;i6Tuc5;arpings,e09in,neid1rDuld0wC;ierig0Käc5;eibt0MiCöd1;fts27tt;chCnkt,rajewo;e6sen-an5U;aOeGiFoEu4üC;ckCd58he;s16t5L;be4Wl1G;tu1Tv1;chGgierungsQiCst;h0sC;ch,eDighaC;uf0;!n5N;er2tC;e,saC;nwa8;c4hmen3A;aMeJfIhänom3Qioni4YoGrC;eDoCä08; kopf 08grammv1Ujek3tes3;isCsseE;absp61verfal9;lizeiCr2D;sp0V;enn1Xl0N;it2ArC;es,sC;onal,pek3Y;lästinense4MpieErC;lamentCol0teivA;es,swahl0;re;berfläc4f1Qliv1ppenheim1stslawonie1C;aGeEieDorCä4;be44drhein westf12;r0tz20;andert0QgativtrCuk24;end;chCme;b5Gr08s4Ft;aUcdonnTeQiJoIuGäFöglichEüC;lCn2;heim kärli34l1;keit0;d2rk3;lCseum;is30;dellcharakt1nats7rd;chae9eHlGnDtC;gefang2Gtwo2X;destDisterpräCut0;sident0;ein2B;itär,lia3U;rt,te;nDrC;kma02rD;achem,em,ge,schenre1C;ell;astrOl1nErktn45schinenDßC;e,n2G;!pistol0;ge9n;aIeGiFokal2SuCä32;dCft;ew0SwigC;!shaf3P;cBs3;ch,g7iCu4T;c5pz0O;ch1fontain2LndCst0teini11;eDgerC;icB;!sC;e18k12vA;aMe3BiKoGrDu2ZöCüc4;ln,nig4Nr3;a25iegsCu0U;en3TverbC;re1A;h9llekRmmun0nCst0;flik3tC;ak3rolC;le;nCrc5;ke9;bel,mpagn0rDss0tschthCuf;al1;is1Ut0;ahrEerusalDuCürg0;gendliche3Wppé;em;!es7hundertw7tausendw7zehnt;deFmperaEnDrCtali2Y;an,e24;ha8itiative6;tiv;al0;aJeFoDundertCäf0Tö4;taus7;eCr0T;ch0Sn0;broEn1WrCß;b0Qrn,sCzog;tell1;n 0T;ftJlInGuC;ptDshaltC;!sstreits;urs2NvC;erantwor0A;delsCs jo2;!ab0N;s,t;!a1O;a0EeIipHläub36mbh,oGrCünt1;oßofEundDöße,ünC;de6en;ig;fens35;lft20tt;fe9;bTfaRha8lPmeinde6nOrKsEwC;a8erkschaftC;en,svA;chFeCicBpräc5ta8;llCtze;schaC;ft0;iCwor08;ch3;ichtDäuC;sc4;!eC;!s;era9f;d,senkC;ir2;hr,ngeneC;n,r;ie3üC;hr0;aWdp0GeUiPlKoHrDäll0ührungseC;be0R;aDeiheiC;tli2;g0kCu0;tion1Q;l08rC;meln,sC;ch1;aFuDäc5üchC;tlin04;cBgangC;st;mm0sc5;liale6schC;!erC;!eiC;abC;komm0;ld,stgenommC;en0;ll28milienangehöriT;bNiHnGpoc4rDuC;le,ropä1;achDde,folg,ha8löse,wachC;en,sene1R;tens;de,tge8;m1nC;bFheiEnDzelhande9;ls;ahm0;m0Yt0;rüc4;ene6;am0eIgbHiEraDu0YörfC;ch0er;ch;enstDnCvid7;ge;e,mäd2; vA;fizi3legie12utsc5;du FhCo8;arakter1Lef,iC;le,nabesuchC;es;lCvA;ande0J;a02eTilSlutvergieß0oPrKuGüC;ch1hErgerC;!initiaC;tiv0;ne;ndesCrs2;aDhaus0FläCtagsabgeordne3vA;nder6;nsta8;ancheDief,oCöt2;schür0t;!nC;!kollC;eg0;rcCusquLx0;heC;rt;d,l;am3b0freiungstJhöIrGsEtrC;iCoffP;eb;chäftig0TucheC;r,s;ekCgsteEicht0Tnd;et;rd0;ig1;dHnErriDsf,ueC;rn;er0;an0kC;darlCen;eh0;en1;a2b0Bgab,kb0Al06nWrSsOuC;fFge,sC;lä06sCwei2;ag0chußvAicBprC;ac4;entIsDtC;ritt;ichtsratDtändC;is2;svA;orsiC;tz7;ha8;c4ylsuch7;enC;de;he;beitsEgumen3tenvielC;fa8;te;plätz0we8;geIhHlGsDtwoCwa8zeig0;rt0;icBprüc5ta8;lt;he6;ag0;äng1;hörCklagt0stellO;igeC;!n,r;exaDternatC;ive;nd1;er;ar;endIgeordneGhFsC;icBpC;ra2;ht;ör0;te6;!n;!e;ch0;en",
|
|
7308
7761
|
"Country": "true¦0:2Q;1:2P;a2Ib23c21d1Se1Lf1Hg19h18i13j10k0Rl0Nm0En05o04pYrVsKtEu7v4weißrusXz3ä2öster1I;quatorial02thiopi0;entralafrik1Type9;anuatu,e2ietnam;nezue2Jreinigte 2;arabische emira1Kstaat0;.6gan2GkraiLn2ruWsbeD;ga4ited 2;arab emirates,kingdom,states2;! of ame1T;rn;k.,s.2; virgin islands,a.;a5ha9o4rinidad und toba1Nsch3u2ürk1U;n0Trkme2Evalu;ad,echi0;go,nga;dschi2nsan0Y;ki2B;aAchwed0e9i7low6omal0Wpa1ri lan0Jt. 5u4was3y26ão tomé und príncipe,üd2;afri0IkNsud2A;il1D;d28riname;kitts und nevis,luc0Svincent und die grenadD;ak1Je1;erra leo2mbabwe,ngapur;ne;negKr03ychell0;lomon0m2n marino,udi-ara02;b0Moa;e15u2;an1Rmä1s2;sl12;a4eGhilipp3o2;l0rtugD;in0;ki1Tl0Cnama,pua-neu3ra2;guay;guin0L;m1Rsttim0O;a8e6i4or2;dk2weg0;or0H;caragua,ederlanRger2;!ia;p2useel0P;al;mib04u2;ru;a4exi7ikronUo2yanmK;ldawi0n2samb0I;aco,gol0Stenegro;dagaskHl5r3ur2zedo1;eta1itius;ok2shallinseln;ko;a2ediv0i,ta;wi,ysU;a0Re4i2uxemburg;b2echtenste0Ttau0;erRy0;sotho,tX;a6enPir5o3roati0u2önigreich großbritan1;ba,wait;lum2mor0;bi0;gisi0ZibaZ;m4na0Rp ver3sach0Yt2;ar;de;bodscha,erI;a2em0;mai2p0U;ka;nd4r3s2ta0H;lVrael;ak,lU;i0on2;esi0;aiMondur0A;a6ha01r5u2;atema0Einea2ya00;!-biss2;au;ena0Aieche8;b3mb2;ia;un;i3rank2;reiX;dschi,n2;nlF;cu6l4ritr3s2;tlD;ea; salv3fenbeinküs2;te;ad2;or;e6omini3schibu2änemark;ti;ca,k2;anische republ2;ik;mokratische re3utschl2;and;publik kon2;go;hi9osta 2;rica;aAe8hutSo6r4u2;lgaMr2;kina faso,undi;asiEun2;ei;livi0snien und herzegowi2tswa2;na;l2n7;gi0ize;h4nglades3rbad2;os;ch;am3ra2;in;as;fghaBl7n4r3serbaidschDustra2;li0;genti1me1;dorra,go3tigua und barbu2;da;la;ba1ge2;ri0;ni0;en;ni2;st2;an",
|
|
7309
7762
|
"Region": "true¦0:1S;1:20;a1Yb1Rc1Hd1Ces1Bf18g12h0Zi0Wj0Uk0Sl0Rm0GnZoXpSqPrMsDtAut9v6w4y2zacatec20;o05u2;cat17kZ;a2est vi4isconsin,yomi13;rwick0shington dc;er3i2;rgin1R;acruz,mont;ah,tar pradesh;a3e2laxca1DuscaB;nnessee,x1Q;bas0Kmaulip1PsmK;a7i5o3taf0Ou2ylh13;ffWrr02s0Y;me10no1Auth 2;cTdS;ber1Hc2naloa;hu0Sily;n3skatchew0Rxo2;ny; luis potosi,ta catari1;a2hode8;j2ngp04;asth0Mshahi;inghai,u2;e2intana roo;bec,ensYreta0E;ara5e3rince edward2; isW;i,nnsylv2rnambu02;an13;!na;axa0Ndisha,h2klaho1Antar2reg5x04;io;ayarit,eCo4u2;evo le2nav0L;on;r2tt0Rva scot0W;f7mandy,th2; 2ampton0;c4d3yo2;rk0;ako0X;aroli1;olk;bras0Wva01w2; 3foundland2;! and labrador;brunswick,hamp0jers3mexiJyork2;! state;ey;a7i3o2;nta1relos;ch4dlands,n3ss2;issippi,ouri;as geraFneso0K;igPoacP;dhya,harasht03ine,ni4r2ssachusetts;anhao,y2;land;p2toba;ur;anca0eiHincoln0ouis7;a2entucky,hul1;ns08rnata0Dshmir;alis2iangxi;co;daho,llino3nd2owa;ia1;is;a3ert2idalFunB;ford0;mp0waii;ansu,eorgWlou6u2;an3erre2izhou,jarat;ro;ajuato,gdo2;ng;cester0;lori3uji2;an;da;sex;e5o3uran2;go;rs2;et;lawaFrby0;a9ea8hi7o2umbrH;ahui5l4nnectic3rsi2ventry;ca;ut;iMorado;la;apEhuahua;ra;l8m2;bridge0peche;a5ritish columb7uck2;ingham0;shi2;re;h3ja cal2sque,var3;iforn2;ia;guascalientes,l5r2;izo1kans2;as;na;a3ber2;ta;ba3s2;ka;ma",
|
|
@@ -7488,12 +7941,12 @@
|
|
|
7488
7941
|
// add conjugations for our verbs
|
|
7489
7942
|
if (tag === 'Infinitive') {
|
|
7490
7943
|
// add present tense
|
|
7491
|
-
let pres =
|
|
7944
|
+
let pres = verb.toPresent(w);
|
|
7492
7945
|
if (pres && pres !== w) {
|
|
7493
7946
|
lexicon$1[pres] = 'PresentTense';
|
|
7494
7947
|
}
|
|
7495
7948
|
// add past tense
|
|
7496
|
-
let past =
|
|
7949
|
+
let past = verb.toPast(w);
|
|
7497
7950
|
if (past && past !== w) {
|
|
7498
7951
|
lexicon$1[past] = 'PastTense';
|
|
7499
7952
|
}
|
|
@@ -7505,11 +7958,90 @@
|
|
|
7505
7958
|
|
|
7506
7959
|
var lexicon$2 = lexicon$1;
|
|
7507
7960
|
|
|
7961
|
+
const verbForm = function (term) {
|
|
7962
|
+
let want = [
|
|
7963
|
+
'FirstPerson',
|
|
7964
|
+
'SecondPerson',
|
|
7965
|
+
'ThirdPerson',
|
|
7966
|
+
'FirstPersonPlural',
|
|
7967
|
+
'SecondPersonPlural',
|
|
7968
|
+
'ThirdPersonPlural',
|
|
7969
|
+
];
|
|
7970
|
+
return want.find(tag => term.tags.has(tag))
|
|
7971
|
+
};
|
|
7972
|
+
|
|
7973
|
+
//relajarse -> relajar
|
|
7974
|
+
const stripReflexive = function (str) {
|
|
7975
|
+
str = str.replace(/se$/, '');
|
|
7976
|
+
str = str.replace(/te$/, '');
|
|
7977
|
+
str = str.replace(/me$/, '');
|
|
7978
|
+
return str
|
|
7979
|
+
};
|
|
7980
|
+
|
|
7981
|
+
const root = function (view) {
|
|
7982
|
+
|
|
7983
|
+
const { verb, noun, adjective } = view.world.methods.two.transform;
|
|
7984
|
+
view.docs.forEach(terms => {
|
|
7985
|
+
terms.forEach(term => {
|
|
7986
|
+
let str = term.implicit || term.normal || term.text;
|
|
7987
|
+
|
|
7988
|
+
if (term.tags.has('Reflexive')) {
|
|
7989
|
+
str = stripReflexive(str);
|
|
7990
|
+
}
|
|
7991
|
+
// get infinitive form of the verb
|
|
7992
|
+
if (term.tags.has('Verb')) {
|
|
7993
|
+
let form = verbForm(term);
|
|
7994
|
+
if (term.tags.has('Gerund')) {
|
|
7995
|
+
term.root = verb.fromGerund(str, form);
|
|
7996
|
+
} else if (term.tags.has('PresentTense')) {
|
|
7997
|
+
term.root = verb.fromPresent(str, form);
|
|
7998
|
+
} else if (term.tags.has('PastTense')) {
|
|
7999
|
+
term.root = verb.fromPast(str, form);
|
|
8000
|
+
} else if (term.tags.has('FutureTense')) {
|
|
8001
|
+
term.root = verb.fromFuture(str, form);
|
|
8002
|
+
} else if (term.tags.has('Conditional')) {
|
|
8003
|
+
term.root = verb.fromConditional(str, form);
|
|
8004
|
+
} else ;
|
|
8005
|
+
}
|
|
8006
|
+
|
|
8007
|
+
// nouns -> singular masculine form
|
|
8008
|
+
// if (term.tags.has('Noun')) {
|
|
8009
|
+
// if (term.tags.has('Plural')) {
|
|
8010
|
+
// str = noun.toSingular(str)
|
|
8011
|
+
// }
|
|
8012
|
+
// if (term.tags.has('FemaleNoun')) {
|
|
8013
|
+
// // not sure about this
|
|
8014
|
+
// // str = noun.toMasculine(str)
|
|
8015
|
+
// }
|
|
8016
|
+
// term.root = str
|
|
8017
|
+
// }
|
|
8018
|
+
|
|
8019
|
+
// // nouns -> singular masculine form
|
|
8020
|
+
// if (term.tags.has('Adjective')) {
|
|
8021
|
+
// if (term.tags.has('PluralAdjective')) {
|
|
8022
|
+
// if (term.tags.has('FemaleAdjective')) {
|
|
8023
|
+
// str = adjective.fromFemalePlural(str)
|
|
8024
|
+
// } else {
|
|
8025
|
+
// str = adjective.toSingular(str)
|
|
8026
|
+
// }
|
|
8027
|
+
// }
|
|
8028
|
+
// if (term.tags.has('FemaleAdjective')) {
|
|
8029
|
+
// str = adjective.fromFemale(str)
|
|
8030
|
+
// }
|
|
8031
|
+
// term.root = str
|
|
8032
|
+
// }
|
|
8033
|
+
});
|
|
8034
|
+
});
|
|
8035
|
+
return view
|
|
8036
|
+
};
|
|
8037
|
+
var root$1 = root;
|
|
8038
|
+
|
|
7508
8039
|
var lexicon = {
|
|
8040
|
+
compute: { root: root$1 },
|
|
7509
8041
|
methods: {
|
|
7510
|
-
|
|
8042
|
+
two: {
|
|
7511
8043
|
transform: {
|
|
7512
|
-
|
|
8044
|
+
verb: verb
|
|
7513
8045
|
}
|
|
7514
8046
|
}
|
|
7515
8047
|
},
|
|
@@ -7638,7 +8170,7 @@
|
|
|
7638
8170
|
},
|
|
7639
8171
|
};
|
|
7640
8172
|
|
|
7641
|
-
var verbs$
|
|
8173
|
+
var verbs$2 = {
|
|
7642
8174
|
Verb: {
|
|
7643
8175
|
not: ['Noun', 'Adjective', 'Adverb', 'Value', 'Expression'],
|
|
7644
8176
|
},
|
|
@@ -7856,7 +8388,7 @@
|
|
|
7856
8388
|
},
|
|
7857
8389
|
};
|
|
7858
8390
|
|
|
7859
|
-
let tags = Object.assign({}, nouns$1, verbs$
|
|
8391
|
+
let tags = Object.assign({}, nouns$1, verbs$2, values$1, dates, misc);
|
|
7860
8392
|
|
|
7861
8393
|
var tagset = {
|
|
7862
8394
|
tags
|
|
@@ -7940,10 +8472,49 @@
|
|
|
7940
8472
|
{ word: 'zur', out: ['zu', 'der'] }, //(to the / to)
|
|
7941
8473
|
];
|
|
7942
8474
|
|
|
8475
|
+
const isAcronym$1 = /[ .][A-Z]\.? *$/i;
|
|
8476
|
+
const hasEllipse = /(?:\u2026|\.{2,}) *$/;
|
|
8477
|
+
const hasLetter = /\p{L}/u;
|
|
8478
|
+
const isOrdinal = /[0-9]\. *$/;
|
|
8479
|
+
|
|
8480
|
+
/** does this look like a sentence? */
|
|
8481
|
+
const isSentence = function (str, abbrevs) {
|
|
8482
|
+
// must have a letter
|
|
8483
|
+
if (hasLetter.test(str) === false) {
|
|
8484
|
+
return false
|
|
8485
|
+
}
|
|
8486
|
+
// check for 'F.B.I.'
|
|
8487
|
+
if (isAcronym$1.test(str) === true) {
|
|
8488
|
+
return false
|
|
8489
|
+
}
|
|
8490
|
+
// german ordinals like '4.'
|
|
8491
|
+
if (isOrdinal.test(str) === true) {
|
|
8492
|
+
return false
|
|
8493
|
+
}
|
|
8494
|
+
//check for '...'
|
|
8495
|
+
if (hasEllipse.test(str) === true) {
|
|
8496
|
+
return false
|
|
8497
|
+
}
|
|
8498
|
+
let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
|
|
8499
|
+
let words = txt.split(' ');
|
|
8500
|
+
let lastWord = words[words.length - 1].toLowerCase();
|
|
8501
|
+
// check for 'Mr.'
|
|
8502
|
+
if (abbrevs.hasOwnProperty(lastWord) === true) {
|
|
8503
|
+
return false
|
|
8504
|
+
}
|
|
8505
|
+
// //check for jeopardy!
|
|
8506
|
+
// if (blacklist.hasOwnProperty(lastWord)) {
|
|
8507
|
+
// return false
|
|
8508
|
+
// }
|
|
8509
|
+
return true
|
|
8510
|
+
};
|
|
8511
|
+
var isSentence$1 = isSentence;
|
|
8512
|
+
|
|
7943
8513
|
var tokenizer = {
|
|
7944
8514
|
mutate: (world) => {
|
|
7945
8515
|
world.model.one.unicode = unicode$1;
|
|
7946
8516
|
world.model.one.contractions = contractions;
|
|
8517
|
+
world.methods.one.tokenize.isSentence = isSentence$1;
|
|
7947
8518
|
},
|
|
7948
8519
|
};
|
|
7949
8520
|
|
|
@@ -7954,7 +8525,7 @@
|
|
|
7954
8525
|
|
|
7955
8526
|
let values = { more: [] };
|
|
7956
8527
|
let nouns = { more: [] };
|
|
7957
|
-
let verbs = { more: [] };
|
|
8528
|
+
let verbs$1 = { more: [] };
|
|
7958
8529
|
let adjectives = { more: [] };
|
|
7959
8530
|
|
|
7960
8531
|
var model$1 = {
|
|
@@ -7962,7 +8533,7 @@
|
|
|
7962
8533
|
splitter: {
|
|
7963
8534
|
values,
|
|
7964
8535
|
nouns,
|
|
7965
|
-
verbs,
|
|
8536
|
+
verbs: verbs$1,
|
|
7966
8537
|
adjectives
|
|
7967
8538
|
}
|
|
7968
8539
|
}
|
|
@@ -8079,6 +8650,8 @@
|
|
|
8079
8650
|
};
|
|
8080
8651
|
|
|
8081
8652
|
const hasApostrophe = /['‘’‛‵′`´]/;
|
|
8653
|
+
const hasPeriod = /\./;
|
|
8654
|
+
const isNum = /^[0-9+-,]+$/;
|
|
8082
8655
|
|
|
8083
8656
|
// normal regexes
|
|
8084
8657
|
const doRegs = function (str, regs) {
|
|
@@ -8100,6 +8673,12 @@
|
|
|
8100
8673
|
if (hasApostrophe.test(term.post) && !hasApostrophe.test(term.pre)) {
|
|
8101
8674
|
text += term.post.trim();
|
|
8102
8675
|
}
|
|
8676
|
+
// keep period in number ordinals?
|
|
8677
|
+
if (hasPeriod.test(term.post) && isNum.test(text)) {
|
|
8678
|
+
setTag([term], ['Ordinal', 'NumericValue'], world, false, `1-regex-ordinal`);
|
|
8679
|
+
term.confidence = 0.6;
|
|
8680
|
+
return true
|
|
8681
|
+
}
|
|
8103
8682
|
let arr = doRegs(text, regexText) || doRegs(normal, regexNormal);
|
|
8104
8683
|
// hide a bunch of number regexes behind this one
|
|
8105
8684
|
if (!arr && /[0-9]/.test(normal)) {
|
|
@@ -8512,6 +9091,9 @@
|
|
|
8512
9091
|
// ending-apostrophes
|
|
8513
9092
|
[/.{3}[lkmnp]in['‘’‛‵′`´]$/, 'Gerund', "chillin'"],
|
|
8514
9093
|
[/.{4}s['‘’‛‵′`´]$/, 'Possessive', "flanders'"],
|
|
9094
|
+
|
|
9095
|
+
// german ordinals '4.'
|
|
9096
|
+
// [/^[0-9]+\.$/, 'Ordinal'],
|
|
8515
9097
|
];
|
|
8516
9098
|
|
|
8517
9099
|
const rb = 'Adverb';
|
|
@@ -9074,9 +9656,9 @@
|
|
|
9074
9656
|
var format = formatNumber;
|
|
9075
9657
|
|
|
9076
9658
|
// return the nth elem of a doc
|
|
9077
|
-
const getNth = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
|
|
9659
|
+
const getNth$1 = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
|
|
9078
9660
|
|
|
9079
|
-
const api = function (View) {
|
|
9661
|
+
const api$2 = function (View) {
|
|
9080
9662
|
/** */
|
|
9081
9663
|
class Numbers extends View {
|
|
9082
9664
|
constructor(document, pointer, groups) {
|
|
@@ -9084,13 +9666,13 @@
|
|
|
9084
9666
|
this.viewType = 'Numbers';
|
|
9085
9667
|
}
|
|
9086
9668
|
parse(n) {
|
|
9087
|
-
return getNth(this, n).map(parse)
|
|
9669
|
+
return getNth$1(this, n).map(parse)
|
|
9088
9670
|
}
|
|
9089
9671
|
get(n) {
|
|
9090
|
-
return getNth(this, n).map(parse).map(o => o.num)
|
|
9672
|
+
return getNth$1(this, n).map(parse).map(o => o.num)
|
|
9091
9673
|
}
|
|
9092
9674
|
json(n) {
|
|
9093
|
-
let doc = getNth(this, n);
|
|
9675
|
+
let doc = getNth$1(this, n);
|
|
9094
9676
|
return doc.map(p => {
|
|
9095
9677
|
let json = p.toView().json(n)[0];
|
|
9096
9678
|
let parsed = parse(p);
|
|
@@ -9321,19 +9903,62 @@
|
|
|
9321
9903
|
}
|
|
9322
9904
|
// make sure splitter has run
|
|
9323
9905
|
m.compute('splitter');
|
|
9324
|
-
m = getNth(m, n);
|
|
9906
|
+
m = getNth$1(m, n);
|
|
9325
9907
|
return new Numbers(this.document, m.pointer)
|
|
9326
9908
|
};
|
|
9327
9909
|
// alias
|
|
9328
9910
|
View.prototype.values = View.prototype.numbers;
|
|
9329
9911
|
};
|
|
9330
|
-
var api$
|
|
9912
|
+
var api$3 = api$2;
|
|
9331
9913
|
|
|
9332
9914
|
var numbers = {
|
|
9333
|
-
api: api$
|
|
9915
|
+
api: api$3
|
|
9334
9916
|
};
|
|
9335
9917
|
|
|
9336
|
-
|
|
9918
|
+
const getNth = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
|
|
9919
|
+
|
|
9920
|
+
// get root form of adjective
|
|
9921
|
+
const getRoot = function (m, methods) {
|
|
9922
|
+
m.compute('root');
|
|
9923
|
+
let str = m.text('root');
|
|
9924
|
+
return str
|
|
9925
|
+
};
|
|
9926
|
+
|
|
9927
|
+
const api = function (View) {
|
|
9928
|
+
class Verbs extends View {
|
|
9929
|
+
constructor(document, pointer, groups) {
|
|
9930
|
+
super(document, pointer, groups);
|
|
9931
|
+
this.viewType = 'Verbs';
|
|
9932
|
+
}
|
|
9933
|
+
conjugate(n) {
|
|
9934
|
+
const methods = this.methods.two.transform.verb;
|
|
9935
|
+
const { toPresent, toPast, toFuture, toConditional, toGerund } = methods;
|
|
9936
|
+
return getNth(this, n).map(m => {
|
|
9937
|
+
let str = getRoot(m);
|
|
9938
|
+
return {
|
|
9939
|
+
presentTense: toPresent(str),
|
|
9940
|
+
pastTense: toPast(str),
|
|
9941
|
+
// futureTense: toFuture(str),
|
|
9942
|
+
// conditional: toConditional(str),
|
|
9943
|
+
// gerund: toGerund(str),
|
|
9944
|
+
}
|
|
9945
|
+
}, [])
|
|
9946
|
+
}
|
|
9947
|
+
}
|
|
9948
|
+
|
|
9949
|
+
View.prototype.verbs = function (n) {
|
|
9950
|
+
let m = this.match('#Verb+');
|
|
9951
|
+
m = getNth(m, n);
|
|
9952
|
+
return new Verbs(this.document, m.pointer)
|
|
9953
|
+
};
|
|
9954
|
+
};
|
|
9955
|
+
var api$1 = api;
|
|
9956
|
+
|
|
9957
|
+
var verbs = {
|
|
9958
|
+
api: api$1,
|
|
9959
|
+
};
|
|
9960
|
+
|
|
9961
|
+
var version = '0.0.6';
|
|
9337
9962
|
|
|
9338
9963
|
nlp$1.plugin(tokenizer);
|
|
9339
9964
|
nlp$1.plugin(tagset);
|
|
@@ -9342,13 +9967,25 @@
|
|
|
9342
9967
|
nlp$1.plugin(postTagger);
|
|
9343
9968
|
nlp$1.plugin(splitter);
|
|
9344
9969
|
nlp$1.plugin(numbers);
|
|
9345
|
-
|
|
9970
|
+
nlp$1.plugin(verbs);
|
|
9346
9971
|
|
|
9347
9972
|
const de = function (txt, lex) {
|
|
9348
9973
|
let dok = nlp$1(txt, lex);
|
|
9349
9974
|
return dok
|
|
9350
9975
|
};
|
|
9351
9976
|
|
|
9977
|
+
// copy constructor methods over
|
|
9978
|
+
Object.keys(nlp$1).forEach(k => {
|
|
9979
|
+
if (nlp$1.hasOwnProperty(k)) {
|
|
9980
|
+
de[k] = nlp$1[k];
|
|
9981
|
+
}
|
|
9982
|
+
});
|
|
9983
|
+
|
|
9984
|
+
// this one is hidden
|
|
9985
|
+
Object.defineProperty(de, '_world', {
|
|
9986
|
+
value: nlp$1._world,
|
|
9987
|
+
writable: true,
|
|
9988
|
+
});
|
|
9352
9989
|
/** log the decision-making to console */
|
|
9353
9990
|
de.verbose = function (set) {
|
|
9354
9991
|
let env = typeof process === 'undefined' ? self.env || {} : process.env; //use window, in browser
|