(http://spencermounta.in)",
"name": "compromise",
"description": "modest natural language processing",
- "version": "14.6.0",
+ "version": "14.7.0",
"main": "./src/three.js",
"unpkg": "./builds/compromise.js",
"type": "module",
@@ -95,13 +95,13 @@
"suffix-thumb": "4.0.2"
},
"devDependencies": {
- "@rollup/plugin-node-resolve": "15.0.0",
+ "@rollup/plugin-node-resolve": "15.0.1",
"amble": "1.3.0",
- "eslint": "8.25.0",
+ "eslint": "8.26.0",
"eslint-plugin-regexp": "1.9.0",
"nlp-corpus": "4.4.0",
- "rollup": "3.2.3",
- "rollup-plugin-filesize-check": "0.0.1",
+ "rollup": "3.2.5",
+ "rollup-plugin-filesize-check": "0.0.2",
"rollup-plugin-terser": "7.0.2",
"shelljs": "0.8.5",
"tap-dancer": "0.3.4",
diff --git a/plugins/dates/scratch.js b/plugins/dates/scratch.js
index c23ed8c13..a0fdd030c 100644
--- a/plugins/dates/scratch.js
+++ b/plugins/dates/scratch.js
@@ -12,6 +12,19 @@ const fmt = (iso) => (iso ? spacetime(iso).format('{day-short} {nice} {year}') :
// process.env.DEBUG_DATE = true
+
+
+// date issues:
+// 'the month before christmas' vs 'a month before christmas'
+// middle september
+// end of september
+// first half of march
+// week of june 3rd
+// fridays in june
+// every saturday
+// now
+// until christmas
+
const context = {
// today: '1999-04-17',
// today: [1999, 3, 12]
diff --git a/plugins/paragraphs/README.md b/plugins/paragraphs/README.md
new file mode 100644
index 000000000..0ade5cdd5
--- /dev/null
+++ b/plugins/paragraphs/README.md
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+ v
+
+
+
+
+
+
+
+
+ npm install compromise-paragraphs
+
+
+```js
+let str = `What's with these homies dissin' my girl? Why do they gotta front?
+
+What did we ever do to these guys that made them so violent?
+
+Woo-hoo, but you know I'm yours.
+Woo-hoo, and I know you're mine.
+Woo-hoo, and that's for all time
+`
+
+let doc = nlp(str).paragraphs()
+
+doc.length
+// 3
+
+doc.json(options)
+/*[
+ {text:'What's with these ...', sentences:[{},{}]}
+ {text:'What did we ever ...', sentences:[{}]}
+]*/
+
+// get the second paragraph
+doc.eq(1).text()
+// 'What did we ever ...'
+
+// get the first two sentences of the first paragraph
+doc
+ .first()
+ .sentences()
+ .slice(0, 2)
+```
+
+This is a tentative implementation of `.paragraphs()` and associated methods, for compromise.
+
+This is tricky because a sentence is a top-level structure to compromise, (and english grammar!), and combining sentences together would have some consequences about grammatical tags.
+
+Instead, this plugin is a (partially-complete) wrapper for sentence objects, so that you can call things like `.text()` and `.json()` on a paragraph, but then drop back down to `.sentences()` after, and work as normal.
+
+The term objects passed into `.paragraphs()` are mutable, so they will actually change when you transform them:
+
+```js
+let doc = nlp(str).paragraphs()
+
+doc = doc.filter(p => {
+ return p.has('#Determiner guys')
+})
+// What did we ever do to these guys that made them so violent?
+```
+
+### [Demo](https://observablehq.com/@spencermountain/compromise-paragraphs)
+
+## API:
+
+outputs:
+
+- .text()
+- .json()
+
+matches:
+
+- .match()
+- .not()
+- .if()
+- .ifNo()
+- .has()
+
+selectors:
+
+- .sentences()
+- .terms()
+
+accessors:
+
+- .eq()
+- .first()
+- .last()
+
+loops:
+
+- .forEach()
+- .map()
+- .filter()
+
+MIT
diff --git a/plugins/paragraphs/builds/compromise-paragraphs.cjs b/plugins/paragraphs/builds/compromise-paragraphs.cjs
new file mode 100644
index 000000000..41f774e52
--- /dev/null
+++ b/plugins/paragraphs/builds/compromise-paragraphs.cjs
@@ -0,0 +1,158 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.compromiseParagraphs = factory());
+})(this, (function () { 'use strict';
+
+ const concatArr = function (views, fn) {
+ let arr = [];
+ views.forEach(m => {
+ arr.push(m[fn]());
+ });
+ return arr
+ };
+
+ const concatStr = function (views, cb) {
+ let str = [];
+ views.forEach(m => {
+ str += cb(m);
+ });
+ return str
+ };
+
+ const concatDoc = function (views, cb) {
+ let ptrs = [];
+ views.forEach(m => {
+ let res = cb(m);
+ if (res.found) {
+ ptrs = ptrs.concat(res.ptrs);
+ }
+ });
+ return views[0].update(ptrs)
+ };
+
+
+ const api = function (View) {
+
+
+
+ class Paragraphs {
+ constructor(views) {
+ this.viewType = 'Paragraphs';
+ this.views = views;
+ }
+ // is the view not-empty?
+ get found() {
+ return this.views.length > 0
+ }
+ // how many matches we have
+ get length() {
+ return this.views.length
+ }
+
+ text(fmt) {
+ return concatStr(this.views, (m) => m.text(fmt))
+ }
+ json() {
+ return concatArr(this.views, 'json')
+ }
+ match(reg) {
+ return concatDoc(this.views, (view) => view.match(reg))
+ }
+ not(reg) {
+ return concatDoc(this.views, (view) => view.match(reg))
+ }
+ sentences() {
+ return concatDoc(this.views, (view) => view)
+ }
+ terms() {
+ return concatDoc(this.views, (view) => view.terms())
+ }
+ filter(fn) {
+ let res = this.views.filter(p => {
+ return p.some(fn)
+ });
+ return this.update(res)
+ }
+ forEach(fn) {
+ this.views.forEach(p => {
+ p.forEach(fn);
+ });
+ return this
+ }
+ map(fn) {
+ let res = this.views.map(view => {
+ return fn(view)
+ });
+ return this.update(res)
+ }
+ // boolean
+ has(reg) {
+ return this.views.some(view => view.has(reg))
+ }
+ if(reg) {
+ let views = this.views.filter(view => view.has(reg));
+ return this.update(views)
+ }
+ ifNo(reg) {
+ let views = this.views.filter(view => !view.has(reg));
+ return this.update(views)
+ }
+ eq(num) {
+ let p = this.views[num];
+ if (p) {
+ return this.update([p])
+ }
+ return this.update([])
+ }
+ first() {
+ return this.eq(0)
+ }
+ last() {
+ return this.eq(this.length - 1)
+ }
+ debug() {
+ this.views.forEach((view) => {
+ console.log('\n=-=-=-=-');//eslint-disable-line
+ view.debug();
+ });
+ }
+
+ // overloaded - keep Paragraphs class
+ update(views) {
+ let m = new Paragraphs(views);
+ return m
+ }
+ }
+
+ /** */
+ View.prototype.paragraphs = function () {
+ const hasTwoNewline = /\n\n/;
+ let all = [];
+ let run = [];
+ this.all().forEach(s => {
+ let end = s.lastTerm();
+ run.push(s.ptrs[0]);
+ if (hasTwoNewline.test(end.post())) {
+ all.push(run);
+ run = [];
+ }
+ });
+ if (run.length) {
+ all.push(run);
+ }
+ let views = all.map(ptr => {
+ return this.update(ptr)
+ });
+ return new Paragraphs(views)
+ };
+ };
+ var api$1 = api;
+
+ var plugin = {
+ api: api$1,
+ };
+
+ return plugin;
+
+}));
diff --git a/plugins/paragraphs/builds/compromise-paragraphs.min.js b/plugins/paragraphs/builds/compromise-paragraphs.min.js
new file mode 100644
index 000000000..2726b7c5a
--- /dev/null
+++ b/plugins/paragraphs/builds/compromise-paragraphs.min.js
@@ -0,0 +1 @@
+var t,e;t=this,e=function(){const t=function(t,e){let s=[];return t.forEach((t=>{let r=e(t);r.found&&(s=s.concat(r.ptrs))})),t[0].update(s)};return{api:function(e){class Paragraphs{constructor(t){this.viewType="Paragraphs",this.views=t}get found(){return this.views.length>0}get length(){return this.views.length}text(t){return function(t,e){let s=[];return t.forEach((t=>{s+=e(t)})),s}(this.views,(e=>e.text(t)))}json(){return function(t,e){let s=[];return t.forEach((t=>{s.push(t[e]())})),s}(this.views,"json")}match(e){return t(this.views,(t=>t.match(e)))}not(e){return t(this.views,(t=>t.match(e)))}sentences(){return t(this.views,(t=>t))}terms(){return t(this.views,(t=>t.terms()))}filter(t){let e=this.views.filter((e=>e.some(t)));return this.update(e)}forEach(t){return this.views.forEach((e=>{e.forEach(t)})),this}map(t){let e=this.views.map((e=>t(e)));return this.update(e)}has(t){return this.views.some((e=>e.has(t)))}if(t){let e=this.views.filter((e=>e.has(t)));return this.update(e)}ifNo(t){let e=this.views.filter((e=>!e.has(t)));return this.update(e)}eq(t){let e=this.views[t];return e?this.update([e]):this.update([])}first(){return this.eq(0)}last(){return this.eq(this.length-1)}debug(){this.views.forEach((t=>{console.log("\n=-=-=-=-"),t.debug()}))}update(t){return new Paragraphs(t)}}e.prototype.paragraphs=function(){const t=/\n\n/;let e=[],s=[];this.all().forEach((r=>{let i=r.lastTerm();s.push(r.ptrs[0]),t.test(i.post())&&(e.push(s),s=[])})),s.length&&e.push(s);let r=e.map((t=>this.update(t)));return new Paragraphs(r)}}}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).compromiseParagraphs=e();
diff --git a/plugins/paragraphs/builds/compromise-paragraphs.mjs b/plugins/paragraphs/builds/compromise-paragraphs.mjs
new file mode 100644
index 000000000..c8a1b91fa
--- /dev/null
+++ b/plugins/paragraphs/builds/compromise-paragraphs.mjs
@@ -0,0 +1 @@
+const t=function(t,e){let s=[];return t.forEach((t=>{let r=e(t);r.found&&(s=s.concat(r.ptrs))})),t[0].update(s)};var e={api:function(e){class Paragraphs{constructor(t){this.viewType="Paragraphs",this.views=t}get found(){return this.views.length>0}get length(){return this.views.length}text(t){return function(t,e){let s=[];return t.forEach((t=>{s+=e(t)})),s}(this.views,(e=>e.text(t)))}json(){return function(t,e){let s=[];return t.forEach((t=>{s.push(t[e]())})),s}(this.views,"json")}match(e){return t(this.views,(t=>t.match(e)))}not(e){return t(this.views,(t=>t.match(e)))}sentences(){return t(this.views,(t=>t))}terms(){return t(this.views,(t=>t.terms()))}filter(t){let e=this.views.filter((e=>e.some(t)));return this.update(e)}forEach(t){return this.views.forEach((e=>{e.forEach(t)})),this}map(t){let e=this.views.map((e=>t(e)));return this.update(e)}has(t){return this.views.some((e=>e.has(t)))}if(t){let e=this.views.filter((e=>e.has(t)));return this.update(e)}ifNo(t){let e=this.views.filter((e=>!e.has(t)));return this.update(e)}eq(t){let e=this.views[t];return e?this.update([e]):this.update([])}first(){return this.eq(0)}last(){return this.eq(this.length-1)}debug(){this.views.forEach((t=>{console.log("\n=-=-=-=-"),t.debug()}))}update(t){return new Paragraphs(t)}}e.prototype.paragraphs=function(){const t=/\n\n/;let e=[],s=[];this.all().forEach((r=>{let i=r.lastTerm();s.push(r.ptrs[0]),t.test(i.post())&&(e.push(s),s=[])})),s.length&&e.push(s);let r=e.map((t=>this.update(t)));return new Paragraphs(r)}}};export{e as default};
diff --git a/plugins/paragraphs/package-lock.json b/plugins/paragraphs/package-lock.json
new file mode 100644
index 000000000..27a0dcb0a
--- /dev/null
+++ b/plugins/paragraphs/package-lock.json
@@ -0,0 +1,86 @@
+{
+ "name": "compromise-paragraphs",
+ "version": "0.1.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "compromise-paragraphs",
+ "version": "0.1.0",
+ "license": "MIT",
+ "devDependencies": {},
+ "peerDependencies": {
+ "compromise": ">=14.0.0"
+ }
+ },
+ "node_modules/compromise": {
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.6.0.tgz",
+ "integrity": "sha512-19qcqR9+emdigy/AxXqb6IiWqeeh6zGODSJWd3AObWze6AwjZdQ/oqrg+SbxW0JEhGkBrfqFtJRKt1/DCOP1Og==",
+ "peer": true,
+ "dependencies": {
+ "efrt": "2.7.0",
+ "grad-school": "0.0.5",
+ "suffix-thumb": "4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/efrt": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/efrt/-/efrt-2.7.0.tgz",
+ "integrity": "sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/grad-school": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/grad-school/-/grad-school-0.0.5.tgz",
+ "integrity": "sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/suffix-thumb": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/suffix-thumb/-/suffix-thumb-4.0.2.tgz",
+ "integrity": "sha512-CCvCAr7JyeQoO+/lyq3P2foZI/xJz5kpG3L6kg2CaOf9K2/gaM9ixy/JTuRwjEK38l306zE7vl3JoOZYmLQLlA==",
+ "peer": true
+ }
+ },
+ "dependencies": {
+ "compromise": {
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.6.0.tgz",
+ "integrity": "sha512-19qcqR9+emdigy/AxXqb6IiWqeeh6zGODSJWd3AObWze6AwjZdQ/oqrg+SbxW0JEhGkBrfqFtJRKt1/DCOP1Og==",
+ "peer": true,
+ "requires": {
+ "efrt": "2.7.0",
+ "grad-school": "0.0.5",
+ "suffix-thumb": "4.0.2"
+ }
+ },
+ "efrt": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/efrt/-/efrt-2.7.0.tgz",
+ "integrity": "sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ==",
+ "peer": true
+ },
+ "grad-school": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/grad-school/-/grad-school-0.0.5.tgz",
+ "integrity": "sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ==",
+ "peer": true
+ },
+ "suffix-thumb": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/suffix-thumb/-/suffix-thumb-4.0.2.tgz",
+ "integrity": "sha512-CCvCAr7JyeQoO+/lyq3P2foZI/xJz5kpG3L6kg2CaOf9K2/gaM9ixy/JTuRwjEK38l306zE7vl3JoOZYmLQLlA==",
+ "peer": true
+ }
+ }
+}
diff --git a/plugins/paragraphs/package.json b/plugins/paragraphs/package.json
new file mode 100644
index 000000000..0cefe97da
--- /dev/null
+++ b/plugins/paragraphs/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "compromise-paragraphs",
+ "description": "plugin for nlp-compromise",
+ "version": "0.1.0",
+ "author": "Spencer Kelly (http://spencermounta.in)",
+ "main": "./src/plugin.js",
+ "unpkg": "./builds/compromise-paragraphs.min.js",
+ "module": "./builds/compromise-paragraphs.mjs",
+ "type": "module",
+ "types": "index.d.ts",
+ "sideEffects": false,
+ "exports": {
+ ".": {
+ "import": "./src/plugin.js",
+ "require": "./builds/compromise-paragraphs.cjs"
+ }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/spencermountain/compromise.git"
+ },
+ "homepage": "https://github.com/spencermountain/compromise/tree/master/plugins/paragraphs",
+ "scripts": {
+ "test": "tape \"./tests/**/*.test.js\" | tap-dancer --color always",
+ "testb": "TESTENV=prod tape \"./tests/**/*.test.js\" | tap-dancer --color always",
+ "watch": "amble ./scratch.js",
+ "build": "rollup -c --silent"
+ },
+ "files": [
+ "builds/",
+ "src/",
+ "index.d.ts"
+ ],
+ "peerDependencies": {
+ "compromise": ">=14.0.0"
+ },
+ "devDependencies": {},
+ "license": "MIT"
+}
\ No newline at end of file
diff --git a/plugins/paragraphs/rollup.config.js b/plugins/paragraphs/rollup.config.js
new file mode 100644
index 000000000..2c0cf28bf
--- /dev/null
+++ b/plugins/paragraphs/rollup.config.js
@@ -0,0 +1,23 @@
+import { terser } from 'rollup-plugin-terser'
+import sizeCheck from 'rollup-plugin-filesize-check'
+import { nodeResolve } from '@rollup/plugin-node-resolve';
+
+const opts = { keep_classnames: true, module: true }
+
+export default [
+ {
+ input: 'src/plugin.js',
+ output: [{ file: 'builds/compromise-paragraphs.cjs', format: 'umd', name: 'compromiseParagraphs' }],
+ plugins: [nodeResolve(), sizeCheck({ expect: 5, warn: 15 })],
+ },
+ {
+ input: 'src/plugin.js',
+ output: [{ file: 'builds/compromise-paragraphs.min.js', format: 'umd', name: 'compromiseParagraphs' }],
+ plugins: [nodeResolve(), terser(opts), sizeCheck({ expect: 5, warn: 15 })],
+ },
+ {
+ input: 'src/plugin.js',
+ output: [{ file: 'builds/compromise-paragraphs.mjs', format: 'esm' }],
+ plugins: [nodeResolve(), terser(opts), sizeCheck({ expect: 5, warn: 15 })],
+ }
+]
diff --git a/plugins/paragraphs/src/api.js b/plugins/paragraphs/src/api.js
new file mode 100644
index 000000000..a8200e669
--- /dev/null
+++ b/plugins/paragraphs/src/api.js
@@ -0,0 +1,145 @@
+
+const concatArr = function (views, fn) {
+ let arr = []
+ views.forEach(m => {
+ arr.push(m[fn]())
+ })
+ return arr
+}
+
+const concatStr = function (views, cb) {
+ let str = []
+ views.forEach(m => {
+ str += cb(m)
+ })
+ return str
+}
+
+const concatDoc = function (views, cb) {
+ let ptrs = []
+ views.forEach(m => {
+ let res = cb(m)
+ if (res.found) {
+ ptrs = ptrs.concat(res.ptrs)
+ }
+ })
+ return views[0].update(ptrs)
+}
+
+
+const api = function (View) {
+
+
+
+ class Paragraphs {
+ constructor(views) {
+ this.viewType = 'Paragraphs'
+ this.views = views
+ }
+ // is the view not-empty?
+ get found() {
+ return this.views.length > 0
+ }
+ // how many matches we have
+ get length() {
+ return this.views.length
+ }
+
+ text(fmt) {
+ return concatStr(this.views, (m) => m.text(fmt))
+ }
+ json() {
+ return concatArr(this.views, 'json')
+ }
+ match(reg) {
+ return concatDoc(this.views, (view) => view.match(reg))
+ }
+ not(reg) {
+ return concatDoc(this.views, (view) => view.match(reg))
+ }
+ sentences() {
+ return concatDoc(this.views, (view) => view)
+ }
+ terms() {
+ return concatDoc(this.views, (view) => view.terms())
+ }
+ filter(fn) {
+ let res = this.views.filter(p => {
+ return p.some(fn)
+ })
+ return this.update(res)
+ }
+ forEach(fn) {
+ this.views.forEach(p => {
+ p.forEach(fn)
+ })
+ return this
+ }
+ map(fn) {
+ let res = this.views.map(view => {
+ return fn(view)
+ })
+ return this.update(res)
+ }
+ // boolean
+ has(reg) {
+ return this.views.some(view => view.has(reg))
+ }
+ if(reg) {
+ let views = this.views.filter(view => view.has(reg))
+ return this.update(views)
+ }
+ ifNo(reg) {
+ let views = this.views.filter(view => !view.has(reg))
+ return this.update(views)
+ }
+ eq(num) {
+ let p = this.views[num]
+ if (p) {
+ return this.update([p])
+ }
+ return this.update([])
+ }
+ first() {
+ return this.eq(0)
+ }
+ last() {
+ return this.eq(this.length - 1)
+ }
+ debug() {
+ this.views.forEach((view) => {
+ console.log('\n=-=-=-=-')//eslint-disable-line
+ view.debug()
+ })
+ }
+
+ // overloaded - keep Paragraphs class
+ update(views) {
+ let m = new Paragraphs(views)
+ return m
+ }
+ }
+
+ /** */
+ View.prototype.paragraphs = function () {
+ const hasTwoNewline = /\n\n/
+ let all = []
+ let run = []
+ this.all().forEach(s => {
+ let end = s.lastTerm()
+ run.push(s.ptrs[0])
+ if (hasTwoNewline.test(end.post())) {
+ all.push(run)
+ run = []
+ }
+ })
+ if (run.length) {
+ all.push(run)
+ }
+ let views = all.map(ptr => {
+ return this.update(ptr)
+ })
+ return new Paragraphs(views)
+ }
+}
+export default api
\ No newline at end of file
diff --git a/plugins/paragraphs/src/plugin.js b/plugins/paragraphs/src/plugin.js
new file mode 100644
index 000000000..083c10a1a
--- /dev/null
+++ b/plugins/paragraphs/src/plugin.js
@@ -0,0 +1,5 @@
+import api from './api.js'
+
+export default {
+ api,
+}
\ No newline at end of file
diff --git a/plugins/paragraphs/tests/_lib.js b/plugins/paragraphs/tests/_lib.js
new file mode 100644
index 000000000..c3c8ebe68
--- /dev/null
+++ b/plugins/paragraphs/tests/_lib.js
@@ -0,0 +1,15 @@
+import build from '../../../builds/one/compromise-one.mjs'
+import src from '../../../src/one.js'
+import plgBuild from '../builds/compromise-paragraphs.mjs'
+import plg from '../src/plugin.js'
+let nlp;
+
+if (process.env.TESTENV === 'prod') {
+ console.warn('== production build test 🚀 ==') // eslint-disable-line
+ nlp = build
+ nlp.plugin(plgBuild)
+} else {
+ nlp = src
+ nlp.plugin(plg)
+}
+export default nlp
diff --git a/plugins/paragraphs/tests/misc.test.js b/plugins/paragraphs/tests/misc.test.js
new file mode 100644
index 000000000..2b05298c4
--- /dev/null
+++ b/plugins/paragraphs/tests/misc.test.js
@@ -0,0 +1,65 @@
+import test from 'tape'
+import nlp from './_lib.js'
+const here = '[paragraph/misc] '
+
+
+
+test('paragraph-basic', function (t) {
+ let str = `What's with these homies dissin' my girl? Why do they gotta front?
+
+What did we ever do to these guys that made them so violent?
+
+Woo-hoo, but you know I'm yours.
+Woo-hoo, and I know you're mine.
+Woo-hoo, and that's for all time
+ `
+
+ let doc = nlp(str).paragraphs()
+
+ t.equal(doc.length, 3, 'three-paragraphs')
+
+ let m = doc.eq(0)
+ t.equal(m.sentences().length, 2, 'two sentences in first paragraph')
+
+ t.equal(doc.json().length, 3, 'three-json objects')
+
+ let one = doc.filter(p => {
+ return p.has('these guys')
+ })
+ t.equal(one.length, 1, 'filter-one')
+ t.equal(/^What did we ever do /.test(one.text()), true, 'filter-text')
+
+ t.end()
+})
+
+
+
+test('paragraph-tests', function (t) {
+ let txt = `What's with these homies dissin' my girl? Why do they gotta front? What did we ever do to these guys that made them so violent?
+
+Second paragraph! Oh yeah! my friends`
+
+ let doc = nlp(txt)
+ let res = doc.paragraphs()
+ t.equal(res.found, true, here + 'found')
+ t.equal(res.length, 2, here + 'length')
+
+ // match
+ let m = res.match('^what did')
+ t.equal(m.length, 1, here + 'match')
+ t.equal(m.growRight('. .').text(), 'What did we ever', here + 'match-text')
+
+ t.equal(res.has('foo'), false, here + 'has')
+ t.equal(res.has('my girl'), true, here + 'has2')
+ t.equal(res.if('homies').length, 1, here + 'if')
+
+ t.ok(res.first(), here + 'first')
+ t.ok(res.last(), here + 'last')
+ t.ok(res.terms(), here + 'terms')
+ res.forEach(p => p.toUpperCase())
+ t.equal(res.length, 2, here + 'forEach')
+ let r = res.map(p => p.toLowerCase())
+ t.equal(r.length, 2, here + 'map')
+
+ t.end()
+})
diff --git a/plugins/speech/package-lock.json b/plugins/speech/package-lock.json
index a97e8c195..a0080494d 100644
--- a/plugins/speech/package-lock.json
+++ b/plugins/speech/package-lock.json
@@ -1,51 +1,85 @@
{
"name": "compromise-speech",
- "version": "0.0.1-next",
+ "version": "0.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "compromise-speech",
- "version": "0.0.1-next",
+ "version": "0.1.0",
"license": "MIT",
"devDependencies": {},
"peerDependencies": {
- "compromise": ">=12.0.0"
+ "compromise": ">=14.0.0"
}
},
"node_modules/compromise": {
- "version": "13.11.4",
- "resolved": "https://registry.npmjs.org/compromise/-/compromise-13.11.4.tgz",
- "integrity": "sha512-nBITcNdqIHSVDDluaG6guyFFCSNXN+Hu87fU8VlhkE5Z0PwTZN1nro2O7a8JcUH88nB5EOzrxd9zKfXLSNFqcg==",
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.6.0.tgz",
+ "integrity": "sha512-19qcqR9+emdigy/AxXqb6IiWqeeh6zGODSJWd3AObWze6AwjZdQ/oqrg+SbxW0JEhGkBrfqFtJRKt1/DCOP1Og==",
"peer": true,
"dependencies": {
- "efrt-unpack": "2.2.0"
+ "efrt": "2.7.0",
+ "grad-school": "0.0.5",
+ "suffix-thumb": "4.0.2"
},
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/efrt": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/efrt/-/efrt-2.7.0.tgz",
+ "integrity": "sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/grad-school": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/grad-school/-/grad-school-0.0.5.tgz",
+ "integrity": "sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ==",
+ "peer": true,
"engines": {
"node": ">=8.0.0"
}
},
- "node_modules/efrt-unpack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/efrt-unpack/-/efrt-unpack-2.2.0.tgz",
- "integrity": "sha512-9xUSSj7qcUxz+0r4X3+bwUNttEfGfK5AH+LVa1aTpqdAfrN5VhROYCfcF+up4hp5OL7IUKcZJJrzAGipQRDoiQ==",
+ "node_modules/suffix-thumb": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/suffix-thumb/-/suffix-thumb-4.0.2.tgz",
+ "integrity": "sha512-CCvCAr7JyeQoO+/lyq3P2foZI/xJz5kpG3L6kg2CaOf9K2/gaM9ixy/JTuRwjEK38l306zE7vl3JoOZYmLQLlA==",
"peer": true
}
},
"dependencies": {
"compromise": {
- "version": "13.11.4",
- "resolved": "https://registry.npmjs.org/compromise/-/compromise-13.11.4.tgz",
- "integrity": "sha512-nBITcNdqIHSVDDluaG6guyFFCSNXN+Hu87fU8VlhkE5Z0PwTZN1nro2O7a8JcUH88nB5EOzrxd9zKfXLSNFqcg==",
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.6.0.tgz",
+ "integrity": "sha512-19qcqR9+emdigy/AxXqb6IiWqeeh6zGODSJWd3AObWze6AwjZdQ/oqrg+SbxW0JEhGkBrfqFtJRKt1/DCOP1Og==",
"peer": true,
"requires": {
- "efrt-unpack": "2.2.0"
+ "efrt": "2.7.0",
+ "grad-school": "0.0.5",
+ "suffix-thumb": "4.0.2"
}
},
- "efrt-unpack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/efrt-unpack/-/efrt-unpack-2.2.0.tgz",
- "integrity": "sha512-9xUSSj7qcUxz+0r4X3+bwUNttEfGfK5AH+LVa1aTpqdAfrN5VhROYCfcF+up4hp5OL7IUKcZJJrzAGipQRDoiQ==",
+ "efrt": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/efrt/-/efrt-2.7.0.tgz",
+ "integrity": "sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ==",
+ "peer": true
+ },
+ "grad-school": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/grad-school/-/grad-school-0.0.5.tgz",
+ "integrity": "sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ==",
+ "peer": true
+ },
+ "suffix-thumb": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/suffix-thumb/-/suffix-thumb-4.0.2.tgz",
+ "integrity": "sha512-CCvCAr7JyeQoO+/lyq3P2foZI/xJz5kpG3L6kg2CaOf9K2/gaM9ixy/JTuRwjEK38l306zE7vl3JoOZYmLQLlA==",
"peer": true
}
}
diff --git a/plugins/speed/package-lock.json b/plugins/speed/package-lock.json
index df2208c9e..0fdb02ffb 100644
--- a/plugins/speed/package-lock.json
+++ b/plugins/speed/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "compromise-speed",
- "version": "0.1.0",
+ "version": "0.1.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "compromise-speed",
- "version": "0.1.0",
+ "version": "0.1.1",
"license": "MIT",
"devDependencies": {
"compromise": "14.3.1",
diff --git a/plugins/speed/package.json b/plugins/speed/package.json
index bff2a4170..a4909b5c8 100644
--- a/plugins/speed/package.json
+++ b/plugins/speed/package.json
@@ -36,7 +36,6 @@
"compromise": ">=14.0.0"
},
"devDependencies": {
- "compromise": "14.3.1",
"nlp-corpus": "^4.4.0"
},
"license": "MIT"
diff --git a/plugins/stats/package-lock.json b/plugins/stats/package-lock.json
index a74bcc7d1..1fe286f02 100644
--- a/plugins/stats/package-lock.json
+++ b/plugins/stats/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "compromise-stats",
- "version": "0.0.3",
+ "version": "0.1.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "compromise-stats",
- "version": "0.0.3",
+ "version": "0.1.1",
"license": "MIT",
"dependencies": {
"efrt": "^2.5.0"
diff --git a/scratch.js b/scratch.js
index de88c52fc..6be6aaf2c 100644
--- a/scratch.js
+++ b/scratch.js
@@ -1,140 +1,94 @@
/* eslint-disable no-console, no-unused-vars */
-import nlp from './src/three.js'
-// import plg from './plugins/dates/src/plugin.js'
+import nlp from './src/one.js'
+// import plg from './plugins/paragraphs/src/plugin.js'
// nlp.plugin(plg)
-// nlp.verbose('tagger')
let txt = ''
-let doc
+// let doc
// let m
-// bug 3
-// let doc = nlp("Dr. John Smith-McDonald...")
+// nlp.verbose('tagger')
+
+
+// let doc = nlp('When Dona Valeria finds out that Fernando Jose is in a relationship, she gets mad at her son for dating someone beneath their social status')
+// doc.compute('coreference')
+
+
+
+// // bug 3
+// let doc = nlp("Dr. John Smith-McDonald...? ")
// let opts = {
// keepPunct: false,
-// abbreviations: false,
+// keepSpace: false,
// case: false,
// }
-// console.log(doc.text(opts))
+// console.log(doc.text(opts) + '|')
+
+// console.log(nlp('two turtledoves and a partridge in a pear tree').nouns().isSingular().out('array'))
+// let doc = nlp('hello there after words')
+// let regs = doc.match('(after|words)+').docs[0].map(t => {
+// return { id: t.id, optional: true }
+// })
-// const doc = nlp("foobar. he was demanding his rights after. walking his plank after")
-// let net = nlp.buildNet([{ match: 'his .', ifNo: ['demanding', 'rights'] }])
-// doc.match(net).debug()
+// let m = doc.match('hello there')
+// console.log(doc.replaceWith('a hoy hoy').text())
+// console.log(m.json({ sentence: true }))
+// m.growRight(regs).debug()
+// let doc = nlp('hello there')
+// console.log(doc.replaceWith('a hoy hoy').text())
+
+
+let world = nlp.world()
+world.model.one.postPunctuation['='] = true
+console.log(nlp('=cool=').docs[0])
+
+
+// console.log(nlp('$sorta').docs[0])
+// console.log(nlp('....... the rest was history!.. - ').docs[0])
+// nlp('~sorta').match('sorta').debug()
let arr = [
- // "Stances include regular, goofy foot & this one ",
- // "He got in touch with me last night and wants me to meet him today at 2 pm",
- // "Life's a schoolyard, I ain't gettin' picked last",
- // "I've tried the flautas, enchiladas, and juevos rancheros and while none of them were the absolute best mexican dishes I've ever had, I was not disappointed at all.",
- // "St. Nicholas shall leave the helm and that the only cargo shall be black cats.",
- // "we need the fastest, most reliable ways .",
- // "A moment later, he dropped the phone, walked to the other room, and started crying so hard.",
- // "Why are there people that doubleclick?",
- // "Anyway we r movin off now only lor.",
-
-
- // "The money generated by the industry kept the city insulated from much of the economic loss suffered by the rest of the country during the Great Depression.",
- // "a run of the mill food court",
- // "a disappointment which I could not have foreseen.",
- // "feeling a dim sort of sweat rising up inside his clothes.",
- // "If we can selflessly confront evil for the sake of good in a land so far away, then surely we can make this land all it should be.",
-
-
-
- // "UPDATE: /u/Averyhonestguy has raised a very sobering point",
- // "Bike Share rolls out Pride themed bikes in New York",
- // "C'mon, Luisa, you have a chance to be the bigger person here!",
- // "Do quick and easy exercises at home.",
- // "Determine whether you have the necessary qualities for the profession.",
- // "Be sure to say goodbye to the interviewers before you leave.",
- // "Make room for flexibility in your schedule.",
- // "Reduce medications during less stressful periods.",
- // "Focus on her qualities and accomplishments",
- // "Sweeten baked goods.",
-
- // "After my first class on a Wednesday i knew id be sore.",
- // "without the least reserve.",
- // "If you turn me on to anything",
- // "Consider the track record of the manufacturer and any previous experience with them or their consoles, also remember to consider reliability issues with either console",
- // "government-funded research",
- // "lifeguard patrolled beaches",
- // "Pride themed bikes",
- // "Tell Monica I say goodbye.",
- // "Reading ARP related article lor.",
-
-
- 'end to end',
- `employing natural`,
- `need to renew`,
- `is home`,
- `seem to be well adjusted`,
- `did Arnold`,
- `more power to innovate`,
- `creepy`,
- `Legend says`,
- `not being true`,
- `are phrased to elicit`,
- `find myself singing`,
- `feeling threatened`,
- `privatized firms may face`,
- // `want to see`,
- // `Try to see`,
- // `lift & extend`,
- // `by crossing`,
- // `Avoid cuddling`,
- // `start exercising`,
- // `Avoid sending romantic messages`,
- // `Be more`,
- // `don't become discouraged`,
- // `such as teaching`,
- // `held annually is called`,
-
- // "they might have been spared",
- // "the King's courage was unshaken",
- // "there it is",
- // "auction games are brought up",
- // "a plate had been broken",
- // " the economic loss suffered by the country",
- // "i've been knocked down",
- // "At this point we're frustrated but the hotel"
-]
+
+ // 'Caring for Kaneohe since 1986',
+ // 'Boost user engagement',
+ // 'Work to improve lives',
+ // 'A swaging machine works by using two or four',
+ // 'NMDAR signaling increases RanBP1 expression',
+ // 'Notes on eastern American poetry',
+ // 'call ahead and reserve one',
+ // 'in the room where you usually nurse',
+ 'We Sell All Brands',
+ 'Hillary Rodham Clinton',
+ 'place tea bags in hot water',
+ // 'while the therapist watches',
+ // 'All right relax'
+ // `If you notice swelling`,
+ // `and whisk to fully incorporate`,
+ // `Going shopping alone`,
+ // `when the killer strikes`,
+ // `Your refusal may cause hurt and disappointment`,
+ // 'Carpenter\'s one year of coaching',
+ // `Holly objects to Nia's character`,
+ // ' visa & travel assistance',
+ // 'Let the dishwasher run for an entire cycle',
+ // 'by encouraging carpooling',
+ // 'Ohio beaver trapping season starts in late December ',
+ // 'We Personally Guarantee Everything We Sell',
+ // 'we personally guarantee',
+ // // 'unless we win',
+ // // 'and we offer',
+ // "method for measuring",
+ // "responsibility for setting",
+ // "Attack and resolve your issues",
+]
txt = arr[0]
-// txt = "when the rain pours, come and have a drink"
-// doc = nlp(txt)
-// doc.verbs().debug()
-// console.log(doc.sentences().json()[0].sentence)
-
-// [ { form: 'simple-present', tense: 'PresentTense', copula: true } ]
-
-// let doc = nlp(`Remove me 1. A some text. B some text. C some text`)
-// console.log(doc)
-// doc.match('Remove me 1').forEach((m) => doc.remove(m))
-// console.log(doc)
-// // let res = doc.match('* some text$').prepend('prefix')
-// doc.match('* some text$').forEach(m => m.prepend('prefix'))
-// doc.all()
-// console.log(doc)
-// console.log(doc.text())//`Prefix A some text. Prefix B some text. Prefix C some text`
-// console.log(doc.text() === `Prefix A some text. Prefix B some text. Prefix C some text`)
-
-// console.log(doc.verbs().conjugate())
-// console.log(doc.verbs().toGerund().text())
-
-
-// date issues:
-// 'the month before christmas' vs 'a month before christmas'
-// middle september
-// end of september
-// first half of march
-// week of june 3rd
-// fridays in june
-// every saturday
-// now
-// until christmas
\ No newline at end of file
+// let doc = nlp(txt).debug()
+// doc.match('#Conjunction #Adjective #Noun').debug()
+
diff --git a/scripts/test/stress.js b/scripts/test/stress.js
index c60c45206..aef066238 100644
--- a/scripts/test/stress.js
+++ b/scripts/test/stress.js
@@ -12,7 +12,7 @@ for (let i = 0; i < texts.length; i++) {
.forEach(s => {
s.verbs().forEach(vb => {
if (vb.terms().not('(#Adverb|#Auxiliary|#Negative|#PhrasalVerb)').length > 1) {
- console.log(vb.text())
+ // console.log(vb.text())
}
})
diff --git a/src/1-one/change/api/concat.js b/src/1-one/change/api/concat.js
index bc5448bbc..84bd74904 100644
--- a/src/1-one/change/api/concat.js
+++ b/src/1-one/change/api/concat.js
@@ -1,5 +1,3 @@
-import { spliceArr } from './lib/insert.js'
-
const isArray = (arr) => Object.prototype.toString.call(arr) === '[object Array]'
// append a new document, somehow
@@ -32,14 +30,20 @@ const combineViews = function (home, input) {
export default {
// add string as new match/sentence
concat: function (input) {
- const { methods, document, world } = this
// parse and splice-in new terms
if (typeof input === 'string') {
- let json = methods.one.tokenize.fromString(input, world)
- let ptrs = this.fullPointer
- let lastN = ptrs[ptrs.length - 1][0]
- spliceArr(document, lastN + 1, json)
- return this.compute('index')
+ let more = this.fromText(input)
+ // easy concat
+ if (!this.found || !this.ptrs) {
+ this.document = this.document.concat(more.document)
+ } else {
+ // if we are in the middle, this is actually a splice operation
+ let ptrs = this.fullPointer
+ let at = ptrs[ptrs.length - 1][0]
+ this.document.splice(at, 0, ...more.document)
+ }
+ // put the docs
+ return this.all().compute('index')
}
// plop some view objects together
if (typeof input === 'object' && input.isView) {
diff --git a/src/1-one/change/api/replace.js b/src/1-one/change/api/replace.js
index b484b8f45..759dddea0 100644
--- a/src/1-one/change/api/replace.js
+++ b/src/1-one/change/api/replace.js
@@ -46,6 +46,9 @@ fns.replaceWith = function (input, keep = {}) {
// original.freeze()
let oldTags = (original.docs[0] || []).map(term => Array.from(term.tags))
// slide this in
+ if (typeof input === 'string') {
+ input = this.fromText(input).compute('id')
+ }
main.insertAfter(input)
// are we replacing part of a contraction?
if (original.has('@hasContraction') && main.contractions) {
@@ -69,6 +72,13 @@ fns.replaceWith = function (input, keep = {}) {
if (keep.case && m.docs[0] && m.docs[0][0] && m.docs[0][0].index[1] === 0) {
m.docs[0][0].text = titleCase(m.docs[0][0].text)
}
+ // console.log(input.docs[0])
+ // let regs = input.docs[0].map(t => {
+ // return { id: t.id, optional: true }
+ // })
+ // m.after('(a|hoy)').debug()
+ // m.growRight('(a|hoy)').debug()
+ // console.log(m)
return m
}
diff --git a/src/1-one/lookup/api/buildTrie/index.js b/src/1-one/lookup/api/buildTrie/index.js
index 0e76d1b61..156e658a3 100644
--- a/src/1-one/lookup/api/buildTrie/index.js
+++ b/src/1-one/lookup/api/buildTrie/index.js
@@ -3,7 +3,7 @@
const tokenize = function (phrase, world) {
const { methods, model } = world
- let terms = methods.one.tokenize.splitTerms(phrase, model).map(methods.one.tokenize.splitWhitespace)
+ let terms = methods.one.tokenize.splitTerms(phrase, model).map(t => methods.one.tokenize.splitWhitespace(t, model))
return terms.map(term => term.text.toLowerCase())
}
diff --git a/src/1-one/match/methods/match/03-notIf.js b/src/1-one/match/methods/match/03-notIf.js
new file mode 100644
index 000000000..110857f61
--- /dev/null
+++ b/src/1-one/match/methods/match/03-notIf.js
@@ -0,0 +1,19 @@
+import fromHere from './02-from-here.js'
+
+const notIf = function (results, not, docs) {
+ results = results.filter(res => {
+ let [n, start, end] = res.pointer
+ let terms = docs[n].slice(start, end)
+ for (let i = 0; i < terms.length; i += 1) {
+ let slice = terms.slice(i)
+ let found = fromHere(slice, not, i, terms.length)
+ if (found !== null) {
+ return false
+ }
+ }
+ return true
+ })
+ return results
+}
+
+export default notIf
\ No newline at end of file
diff --git a/src/1-one/match/methods/match/index.js b/src/1-one/match/methods/match/index.js
index acc99694d..f9996f049 100644
--- a/src/1-one/match/methods/match/index.js
+++ b/src/1-one/match/methods/match/index.js
@@ -1,6 +1,8 @@
import failFast from './01-failFast.js'
import fromHere from './02-from-here.js'
import getGroup from './03-getGroup.js'
+import notIf from './03-notIf.js'
+
// make proper pointers
const addSentence = function (res, n) {
@@ -77,6 +79,9 @@ const runMatch = function (docs, todo, cache) {
return docs[n].length === res.pointer[2]
})
}
+ if (todo.notIf) {
+ results = notIf(results, todo.notIf, docs)
+ }
// grab the requested group
results = getGroup(results, group)
// add ids to pointers
diff --git a/src/1-one/match/methods/match/term/doesMatch.js b/src/1-one/match/methods/match/term/doesMatch.js
index e66a08ab6..55fee69d2 100644
--- a/src/1-one/match/methods/match/term/doesMatch.js
+++ b/src/1-one/match/methods/match/term/doesMatch.js
@@ -17,6 +17,10 @@ const doesMatch = function (term, reg, index, length) {
if (reg.end === true && index !== length - 1) {
return false
}
+ // match an id
+ if (reg.id !== undefined && reg.id === term.id) {
+ return true
+ }
//support a text match
if (reg.word !== undefined) {
// check case-sensitivity, etc
diff --git a/src/1-one/output/api/_fmts.js b/src/1-one/output/api/_fmts.js
index 061807ce7..3e74efebb 100644
--- a/src/1-one/output/api/_fmts.js
+++ b/src/1-one/output/api/_fmts.js
@@ -10,6 +10,7 @@ const fmts = {
form: 'normal',
},
machine: {
+ keepSpace: false,
whitespace: 'some',
punctuation: 'some',
case: 'none',
@@ -17,6 +18,7 @@ const fmts = {
form: 'machine',
},
root: {
+ keepSpace: false,
whitespace: 'some',
punctuation: 'some',
case: 'some',
diff --git a/src/1-one/output/api/out.js b/src/1-one/output/api/out.js
index 27ea85d0b..b9dc2625d 100644
--- a/src/1-one/output/api/out.js
+++ b/src/1-one/output/api/out.js
@@ -93,7 +93,11 @@ const methods = {
/** */
debug: debug,
/** */
- out: out,
+ out,
+ /** */
+ wrap: function (obj) {
+ return wrap(this, obj)
+ },
}
export default methods
diff --git a/src/1-one/output/api/text.js b/src/1-one/output/api/text.js
index 4305d19b7..df94e7f3e 100644
--- a/src/1-one/output/api/text.js
+++ b/src/1-one/output/api/text.js
@@ -8,26 +8,30 @@ const isObject = val => {
export default {
/** */
text: function (fmt) {
- let opts = {
- keepSpace: true,
- keepPunct: true,
- }
+ let opts = {}
if (fmt && typeof fmt === 'string' && fmts.hasOwnProperty(fmt)) {
opts = Object.assign({}, fmts[fmt])
} else if (fmt && isObject(fmt)) {
- opts = Object.assign({}, opts, fmt)//todo: fixme
+ opts = Object.assign({}, fmt)//todo: fixme
}
- if (this.pointer) {
+ if (opts.keepSpace === undefined && this.pointer) {
opts.keepSpace = false
+ }
+ if (opts.keepPunct === undefined && this.pointer) {
let ptr = this.pointer[0]
if (ptr && ptr[1]) {
opts.keepPunct = false
} else {
opts.keepPunct = true
}
- } else {
+ }
+ // set defaults
+ if (opts.keepPunct === undefined) {
opts.keepPunct = true
}
+ if (opts.keepSpace === undefined) {
+ opts.keepSpace = true
+ }
return textFromDoc(this.docs, opts)
},
}
diff --git a/src/1-one/output/api/wrap.js b/src/1-one/output/api/wrap.js
index a3a070a45..a3d74b86d 100644
--- a/src/1-one/output/api/wrap.js
+++ b/src/1-one/output/api/wrap.js
@@ -26,6 +26,7 @@ const wrap = function (doc, obj) {
if (starts.hasOwnProperty(t.id)) {
let { fn, end } = starts[t.id]
let m = doc.update([[n, i, end]])
+ text += terms[i].pre || ''
text += fn(m)
i = end - 1
text += terms[i].post || ''
diff --git a/src/1-one/sweep/methods/buildNet/01-parse.js b/src/1-one/sweep/methods/buildNet/01-parse.js
index 434678699..f999ed9b3 100644
--- a/src/1-one/sweep/methods/buildNet/01-parse.js
+++ b/src/1-one/sweep/methods/buildNet/01-parse.js
@@ -68,6 +68,9 @@ const parse = function (matches, world) {
if (typeof obj.ifNo === 'string') {
obj.ifNo = [obj.ifNo]
}
+ if (obj.notIf) {
+ obj.notIf = parseMatch(obj.notIf, {}, world)
+ }
// cache any requirements up-front
obj.needs = getNeeds(obj.regs)
let { wants, count } = getWants(obj.regs)
diff --git a/src/1-one/sweep/methods/sweep/04-runMatch.js b/src/1-one/sweep/methods/sweep/04-runMatch.js
index b22ee696f..95c71e4f1 100644
--- a/src/1-one/sweep/methods/sweep/04-runMatch.js
+++ b/src/1-one/sweep/methods/sweep/04-runMatch.js
@@ -18,9 +18,14 @@ const runMatch = function (maybeList, document, docCache, methods, opts) {
// const no = m.ifNo[k]
// // quick-check cache
// if (docCache[n].has(no)) {
- // // console.log(no)
- // if (terms.find(t => t.normal === no || t.tags.has(no))) {
- // // console.log('+' + no)
+ // if (no.startsWith('#')) {
+ // let tag = no.replace(/^#/, '')
+ // if (terms.find(t => t.tags.has(tag))) {
+ // console.log('+' + tag)
+ // return
+ // }
+ // } else if (terms.find(t => t.normal === no || t.tags.has(no))) {
+ // console.log('+' + no)
// return
// }
// }
diff --git a/src/1-one/tag/api/tag.js b/src/1-one/tag/api/tag.js
index 16086a7e5..dec8f1edf 100644
--- a/src/1-one/tag/api/tag.js
+++ b/src/1-one/tag/api/tag.js
@@ -59,6 +59,7 @@ const fns = {
/** return only the terms that can be this tag */
canBe: function (tag) {
+ tag = tag.replace(/^#/, '')
let tagSet = this.model.one.tagSet
// everything can be an unknown tag
if (!tagSet.hasOwnProperty(tag)) {
diff --git a/src/1-one/tokenize/methods/02-terms/01-hyphens.js b/src/1-one/tokenize/methods/02-terms/01-hyphens.js
index 1511aa6bc..e3b160fd5 100644
--- a/src/1-one/tokenize/methods/02-terms/01-hyphens.js
+++ b/src/1-one/tokenize/methods/02-terms/01-hyphens.js
@@ -5,6 +5,10 @@ const hasHyphen = function (str, model) {
}
const { prefixes, suffixes } = model.one
+ // l-theanine, x-ray
+ if (parts[0].length === 1 && /[a-z]/i.test(parts[0])) {
+ return false
+ }
//dont split 're-do'
if (prefixes.hasOwnProperty(parts[0])) {
return false
diff --git a/src/1-one/tokenize/methods/03-whitespace/index.js b/src/1-one/tokenize/methods/03-whitespace/index.js
index fbbdc7962..9aaff12b8 100644
--- a/src/1-one/tokenize/methods/03-whitespace/index.js
+++ b/src/1-one/tokenize/methods/03-whitespace/index.js
@@ -1,8 +1,8 @@
import tokenize from './tokenize.js'
-const parseTerm = txt => {
+const parseTerm = (txt, model) => {
// cleanup any punctuation as whitespace
- let { str, pre, post } = tokenize(txt)
+ let { str, pre, post } = tokenize(txt, model)
const parsed = {
text: str,
pre: pre,
diff --git a/src/1-one/tokenize/methods/03-whitespace/punctuation.js b/src/1-one/tokenize/methods/03-whitespace/punctuation.js
deleted file mode 100644
index 270994b31..000000000
--- a/src/1-one/tokenize/methods/03-whitespace/punctuation.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const allowBefore = [
- '#', //#hastag
- '@', //@atmention
- '_',//underscore
- // '\\-',//-4 (escape)
- '+',//+4
- '.',//.4
-]
-const allowAfter = [
- '%',//88%
- '_',//underscore
- '°',//degrees, italian ordinal
- // '\'',// \u0027
-]
-
-export { allowBefore, allowAfter }
\ No newline at end of file
diff --git a/src/1-one/tokenize/methods/03-whitespace/tokenize.js b/src/1-one/tokenize/methods/03-whitespace/tokenize.js
index 258024064..5d9b9fc30 100644
--- a/src/1-one/tokenize/methods/03-whitespace/tokenize.js
+++ b/src/1-one/tokenize/methods/03-whitespace/tokenize.js
@@ -1,62 +1,73 @@
//all punctuation marks, from https://en.wikipedia.org/wiki/Punctuation
-import { allowBefore, allowAfter } from './punctuation.js'
-let beforeReg = new RegExp(`[${allowBefore.join('')}]+$`, '')
-let afterReg = new RegExp(`^[${allowAfter.join('')}]+`, '')
//we have slightly different rules for start/end - like #hashtags.
-const endings = /[\p{Punctuation}\s]+$/u
-const startings = /^[\p{Punctuation}\s]+/u
-const hasApostrophe = /['’]/
+const isLetter = /\p{Letter}/u
+const isNumber = /[\p{Number}\p{Currency_Symbol}]/u
const hasAcronym = /^[a-z]\.([a-z]\.)+/i
-const shortYear = /^'[0-9]{2}/
-const isNumber = /^-[0-9]/
+const chillin = /[sn]['’]$/
-const normalizePunctuation = function (str) {
+const normalizePunctuation = function (str, model) {
+ // quick lookup for allowed pre/post punctuation
+ let { prePunctuation, postPunctuation, emoticons } = model.one
let original = str
let pre = ''
let post = ''
- // adhoc cleanup for pre
- str = str.replace(startings, found => {
- // punctuation symboles like '@' to allow at start of term
- let m = found.match(beforeReg)
- if (m) {
- pre = found.replace(beforeReg, '')
- return m
+ let chars = Array.from(str)
+
+ // punctuation-only words, like '<3'
+ if (emoticons.hasOwnProperty(str.trim())) {
+ return { str: str.trim(), pre, post: ' ' } //not great
+ }
+
+ // pop any punctuation off of the start
+ let len = chars.length
+ for (let i = 0; i < len; i += 1) {
+ let c = chars[0]
+ // keep any declared chars
+ if (prePunctuation[c] === true) {
+ continue//keep it
}
- // support years like '97
- if (pre === `'` && shortYear.test(str)) {
- pre = ''
- return found
+ // keep '+' or '-' only before a number
+ if ((c === '+' || c === '-') && isNumber.test(chars[1])) {
+ break//done
}
- // support prefix negative signs like '-45'
- if (found === '-' && isNumber.test(str)) {
- return found
+ // '97 - year short-form
+ if (c === "'" && c.length === 3 && isNumber.test(chars[1])) {
+ break//done
}
- pre = found //keep it
- return ''
- })
- // ad-hoc cleanup for post
- str = str.replace(endings, found => {
- // punctuation symboles like '@' to allow at start of term
- let m = found.match(afterReg)
- if (m) {
- post = found.replace(afterReg, '')
- return m
+ // start of word
+ if (isLetter.test(c) || isNumber.test(c)) {
+ break //done
}
+ // punctuation
+ pre += chars.shift()//keep going
+ }
- // keep s-apostrophe - "flanders'" or "chillin'"
- if (hasApostrophe.test(found) && /[sn]['’]$/.test(original) && hasApostrophe.test(pre) === false) {
- post = post.replace(hasApostrophe, '')
- return `'`
+ // pop any punctuation off of the end
+ len = chars.length
+ for (let i = 0; i < len; i += 1) {
+ let c = chars[chars.length - 1]
+ // keep any declared chars
+ if (postPunctuation[c] === true) {
+ continue//keep it
}
- //keep end-period in acronym
- if (hasAcronym.test(str) === true) {
- post = found.replace(/^\./, '')
- return '.'
+ // start of word
+ if (isLetter.test(c) || isNumber.test(c)) {
+ break //done
}
- post = found//keep it
- return ''
- })
+ // F.B.I.
+ if (c === '.' && hasAcronym.test(original) === true) {
+ continue//keep it
+ }
+ // keep s-apostrophe - "flanders'" or "chillin'"
+ if (c === "'" && chillin.test(original) === true) {
+ continue//keep it
+ }
+ // punctuation
+ post = chars.pop() + post//keep going
+ }
+
+ str = chars.join('')
//we went too far..
if (str === '') {
// do a very mild parse, and hope for the best.
diff --git a/src/1-one/tokenize/methods/parse.js b/src/1-one/tokenize/methods/parse.js
index ef2b01868..0e39a67e3 100644
--- a/src/1-one/tokenize/methods/parse.js
+++ b/src/1-one/tokenize/methods/parse.js
@@ -11,7 +11,7 @@ const parse = function (input, world) {
input = sentences.map((txt) => {
let terms = splitTerms(txt, model)
// split into [pre-text-post]
- terms = terms.map(splitWhitespace)
+ terms = terms.map(t => splitWhitespace(t, model))
// add normalized term format, always
terms.forEach((t) => {
normalize(t, world)
diff --git a/src/1-one/tokenize/model/index.js b/src/1-one/tokenize/model/index.js
index b55c26939..273bbd450 100644
--- a/src/1-one/tokenize/model/index.js
+++ b/src/1-one/tokenize/model/index.js
@@ -3,6 +3,7 @@ import { lexicon, abbreviations } from './lexicon.js'
import prefixes from './prefixes.js'
import suffixes from './suffixes.js'
import unicode from './unicode.js'
+import { prePunctuation, postPunctuation, emoticons } from './punctuation.js'
export default {
one: {
@@ -10,7 +11,10 @@ export default {
abbreviations,
prefixes,
suffixes,
+ prePunctuation,
+ postPunctuation,
lexicon, //give this one forward
unicode,
+ emoticons
},
}
diff --git a/src/1-one/tokenize/model/prefixes.js b/src/1-one/tokenize/model/prefixes.js
index d70c574cd..ff94d1399 100644
--- a/src/1-one/tokenize/model/prefixes.js
+++ b/src/1-one/tokenize/model/prefixes.js
@@ -27,6 +27,8 @@ export default [
'tri',
'un',
'out', //out-lived
+ 'ex',//ex-wife
+
// 'counter',
// 'mid',
// 'out',
diff --git a/src/1-one/tokenize/model/punctuation.js b/src/1-one/tokenize/model/punctuation.js
new file mode 100644
index 000000000..7b98fc906
--- /dev/null
+++ b/src/1-one/tokenize/model/punctuation.js
@@ -0,0 +1,42 @@
+// https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5Cp%7Bpunctuation%7D
+
+// punctuation to keep at start of word
+const prePunctuation = {
+ '#': true, //#hastag
+ '@': true, //@atmention
+ '_': true,//underscore
+ '°': true,
+ // '+': true,//+4
+ // '\\-',//-4 (escape)
+ // '.',//.4
+ // zero-width chars
+ '\u200B': true,
+ '\u200C': true,
+ '\u200D': true,
+ '\uFEFF': true
+}
+
+// punctuation to keep at end of word
+const postPunctuation = {
+ '%': true,//88%
+ '_': true,//underscore
+ '°': true,//degrees, italian ordinal
+ // '\'',// sometimes
+ // zero-width chars
+ '\u200B': true,
+ '\u200C': true,
+ '\u200D': true,
+ '\uFEFF': true
+}
+
+const emoticons = {
+ '<3': true,
+ '3': true,
+ '<\\3': true,
+ ':^P': true,
+ ':^p': true,
+ ':^O': true,
+ ':^3': true,
+}
+
+export { prePunctuation, postPunctuation, emoticons }
\ No newline at end of file
diff --git a/src/2-two/postTagger/model/_misc.js b/src/2-two/postTagger/model/_misc.js
index c4a7f351c..0ec73eb42 100644
--- a/src/2-two/postTagger/model/_misc.js
+++ b/src/2-two/postTagger/model/_misc.js
@@ -38,16 +38,6 @@ let matches = [
// right after
{ match: '[right] (before|after|in|into|to|toward)', group: 0, tag: '#Adverb', reason: 'right-into' },
-
- // double-prepositions
- // rush out of
- {
- match: '#Verb [(out|for|through|about|around|in|down|up|on|off)] #Preposition',
- group: 0,
- ifNo: ['#Copula'],//were out
- tag: 'Particle',
- reason: 'rush-out',
- },
// at about
{ match: '#Preposition [about]', group: 0, tag: 'Adjective', reason: 'at-about' },
// dude we should
diff --git a/src/2-two/postTagger/model/adjective/adj-adverb.js b/src/2-two/postTagger/model/adjective/adj-adverb.js
index a24996e41..8bd2d0658 100644
--- a/src/2-two/postTagger/model/adjective/adj-adverb.js
+++ b/src/2-two/postTagger/model/adjective/adj-adverb.js
@@ -1,7 +1,6 @@
const adverbAdj = `(dark|bright|flat|light|soft|pale|dead|dim|faux|little|wee|sheer|most|near|good|extra|all)`
export default [
// kinda sparkly
- // { match: `#Adverb [#Adverb]$`, ifNo: ['very', 'really', 'so'], group: 0, tag: 'Adjective', reason: 'kinda-sparkly' },
{ match: `#Adverb [#Adverb] (and|or|then)`, group: 0, tag: 'Adjective', reason: 'kinda-sparkly-and' },
// dark green
{ match: `[${adverbAdj}] #Adjective`, group: 0, tag: 'Adverb', reason: 'dark-green' },
diff --git a/src/2-two/postTagger/model/adjective/adjective.js b/src/2-two/postTagger/model/adjective/adjective.js
index 88054483a..167242653 100644
--- a/src/2-two/postTagger/model/adjective/adjective.js
+++ b/src/2-two/postTagger/model/adjective/adjective.js
@@ -18,17 +18,17 @@ export default [
// jury is out - preposition ➔ adjective
{ match: '#Copula #Adjective? [(out|in|through)]$', group: 0, tag: 'Adjective', reason: 'still-out' },
// shut the door
- { match: '^[#Adjective] (the|your) #Noun', group: 0, ifNo: ['all', 'even'], tag: 'Infinitive', reason: 'shut-the' },
+ { match: '^[#Adjective] (the|your) #Noun', group: 0, notIf: '(all|even)', tag: 'Infinitive', reason: 'shut-the' },
// the said card
{ match: 'the [said] #Noun', group: 0, tag: 'Adjective', reason: 'the-said-card' },
// a myth that uncovered wounds heal
- {
- match: '#Noun (that|which|whose) [#PastTense] #Noun',
- ifNo: '#Copula',
- group: 0,
- tag: 'Adjective',
- reason: 'that-past-noun',
- },
+ // {
+ // match: '#Noun (that|which|whose) [#PastTense] #Noun',
+ // ifNo: '#Copula',
+ // group: 0,
+ // tag: 'Adjective',
+ // reason: 'that-past-noun',
+ // },
{ match: 'too much', tag: 'Adverb Adjective', reason: 'bit-4' },
{ match: 'a bit much', tag: 'Determiner Adverb Adjective', reason: 'bit-3' },
diff --git a/src/2-two/postTagger/model/adverb.js b/src/2-two/postTagger/model/adverb.js
index f8d5415ff..fea8a5b35 100644
--- a/src/2-two/postTagger/model/adverb.js
+++ b/src/2-two/postTagger/model/adverb.js
@@ -14,7 +14,7 @@ export default [
// all singing
{ match: '[all] #Verb', group: 0, tag: 'Adverb', reason: 'all-verb' },
// sing like an angel
- { match: '#Verb [like]', group: 0, ifNo: ['#Modal', '#PhrasalVerb'], tag: 'Adverb', reason: 'verb-like' },
+ { match: '#Verb [like]', group: 0, notIf: '(#Modal|#PhrasalVerb)', tag: 'Adverb', reason: 'verb-like' },
//barely even walk
{ match: '(barely|hardly) even', tag: 'Adverb', reason: 'barely-even' },
//even held
@@ -28,7 +28,7 @@ export default [
//cheering hard - dropped -ly's
{
match: '#PresentTense [(hard|quick|long|bright|slow|fast|backwards|forwards)]',
- ifNo: '#Copula',
+ notIf: '#Copula',
group: 0,
tag: 'Adverb',
reason: 'lazy-ly',
diff --git a/src/2-two/postTagger/model/nouns/nouns.js b/src/2-two/postTagger/model/nouns/nouns.js
index 8c44f6439..76021c84a 100644
--- a/src/2-two/postTagger/model/nouns/nouns.js
+++ b/src/2-two/postTagger/model/nouns/nouns.js
@@ -11,7 +11,7 @@ export default [
// my first thought
{ match: '#Possessive #Ordinal [#PastTense]', group: 0, tag: 'Noun', reason: 'first-thought' },
//the nice swim
- { match: '(the|this|those|these) #Adjective [%Verb|Noun%]', group: 0, tag: 'Noun', ifNo: '#Copula', reason: 'the-adj-verb' },
+ { match: '(the|this|those|these) #Adjective [%Verb|Noun%]', group: 0, tag: 'Noun', notIf: '#Copula', reason: 'the-adj-verb' },
// the truly nice swim
{ match: '(the|this|those|these) #Adverb #Adjective [#Verb]', group: 0, tag: 'Noun', reason: 'determiner4' },
//the wait to vote
@@ -19,9 +19,9 @@ export default [
//a sense of
{ match: '#Determiner [#Verb] of', group: 0, tag: 'Noun', reason: 'the-verb-of' },
//the threat of force
- { match: '#Determiner #Noun of [#Verb]', group: 0, tag: 'Noun', ifNo: '#Gerund', reason: 'noun-of-noun' },
+ { match: '#Determiner #Noun of [#Verb]', group: 0, tag: 'Noun', notIf: '#Gerund', reason: 'noun-of-noun' },
// ended in ruins
- { match: '#PastTense #Preposition [#PresentTense]', group: 0, ifNo: ['#Gerund'], tag: 'Noun', reason: 'ended-in-ruins' },
+ { match: '#PastTense #Preposition [#PresentTense]', group: 0, notIf: '#Gerund', tag: 'Noun', reason: 'ended-in-ruins' },
//'u' as pronoun
{ match: '#Conjunction [u]', group: 0, tag: 'Pronoun', reason: 'u-pronoun-2' },
{ match: '[u] #Verb', group: 0, tag: 'Pronoun', reason: 'u-pronoun-1' },
@@ -43,7 +43,7 @@ export default [
{ match: `a #Noun+ or #Adverb+? [#Verb]`, group: 0, tag: 'Noun', reason: 'noun-or-noun' },
// walk the walk
{ match: '(the|those|these|a|an) #Adjective? [#Infinitive]', group: 0, tag: 'Noun', reason: 'det-inf' },
- { match: '(the|those|these|a|an) #Adjective? [#PresentTense]', ifNo: ['#Gerund', '#Copula'], group: 0, tag: 'Noun', reason: 'det-pres' },
+ { match: '(the|those|these|a|an) #Adjective? [#PresentTense]', notIf: '(#Gerund|#Copula)', group: 0, tag: 'Noun', reason: 'det-pres' },
// ==== Actor ====
//Aircraft designer
@@ -67,7 +67,7 @@ export default [
//Los Angeles's fundraiser
{ match: '#Place+ #Possessive', tag: 'Possessive', reason: 'place-possessive' },
// Ptolemy's experiments
- { match: '#Possessive #PresentTense', ifNo: '#Gerund', tag: 'Noun', reason: 'possessive-verb' }, // anna's eating vs anna's eating lunch
+ { match: '#Possessive #PresentTense', notIf: '#Gerund', tag: 'Noun', reason: 'possessive-verb' }, // anna's eating vs anna's eating lunch
// 10th of a second
{ match: '#Value of a [second]', group: 0, unTag: 'Value', tag: 'Singular', reason: '10th-of-a-second' },
// 10 seconds
@@ -84,8 +84,6 @@ export default [
{ match: '[#PresentTense] (of|by|for) (a|an|the) #Noun #Copula', group: 0, tag: 'Plural', reason: 'photographs-of' },
// fight and win
{ match: '#Infinitive and [%Noun|Verb%]', group: 0, tag: 'Infinitive', reason: 'fight and win' },
- // bride and groom
- // { match: '#Noun and [%Noun|Verb%]', group: 0, tag: 'Singular', ifNo: ['#ProperNoun'], reason: 'bride-and-groom' },
// peace and flowers and love
{ match: '#Noun and [#Verb] and #Noun', group: 0, tag: 'Noun', reason: 'peace-and-flowers' },
// the 1992 classic
diff --git a/src/2-two/postTagger/model/numbers/money.js b/src/2-two/postTagger/model/numbers/money.js
index 625eb85ac..043c91b8a 100644
--- a/src/2-two/postTagger/model/numbers/money.js
+++ b/src/2-two/postTagger/model/numbers/money.js
@@ -1,21 +1,7 @@
export default [
{ match: '#Money and #Money #Currency?', tag: 'Money', reason: 'money-and-money' },
-
- // // $5.032 is invalid money
- // doc
- // .match('#Money')
- // .not('#TextValue')
- // .match('/\\.[0-9]{3}$/')
- // .unTag('#Money', 'three-decimal money')
-
- // cleanup currency false-positives
- // { match: '#Currency #Verb', ifNo: '#Value', unTag: 'Currency', reason: 'no-currency' },
// 6 dollars and 5 cents
{ match: '#Value #Currency [and] #Value (cents|ore|centavos|sens)', group: 0, tag: 'money', reason: 'and-5-cents' },
// maybe currencies
{ match: '#Value (mark|rand|won|rub|ore)', tag: '#Money #Currency', reason: '4 mark' },
]
-
-// {match:'', tag:'',reason:''},
-// {match:'', tag:'',reason:''},
-// {match:'', tag:'',reason:''},
diff --git a/src/2-two/postTagger/model/person/ambig-name.js b/src/2-two/postTagger/model/person/ambig-name.js
index f5440b6cd..c65ed061d 100644
--- a/src/2-two/postTagger/model/person/ambig-name.js
+++ b/src/2-two/postTagger/model/person/ambig-name.js
@@ -1,42 +1,6 @@
const personAdj = '(misty|rusty|dusty|rich|randy|sandy|young|earnest|frank|brown)'
export default [
- // ===person-date===
- // in june
- // { match: `(in|during|on|by|after|#Date) [${personDate}]`, group: 0, tag: 'Date', reason: 'in-june' },
- // // june 1992
- // { match: `${personDate} (#Value|#Date)`, tag: 'Date', reason: 'june-5th' },
- // // June Smith
- // { match: `${personDate} #ProperNoun`, tag: 'Person', reason: 'june-smith', safe: true },
- // // june m. Cooper
- // { match: `${personDate} #Acronym? #ProperNoun`, tag: 'Person', ifNo: '#Month', reason: 'june-smith-jr' },
- // // ---person-month---
- // //give to april
- // {
- // match: `#Infinitive #Determiner? #Adjective? #Noun? (to|for) [${personMonth}]`,
- // group: 0,
- // tag: 'Person',
- // reason: 'ambig-person',
- // },
- // // remind june
- // { match: `#Infinitive [${personMonth}]`, group: 0, tag: 'Person', reason: 'infinitive-person' },
- // // april will
- // { match: `[${personMonth}] #Modal`, group: 0, tag: 'Person', reason: 'ambig-modal' },
- // // would april
- // { match: `#Modal [${personMonth}]`, group: 0, tag: 'Person', reason: 'modal-ambig' },
- // // it is may
- // { match: `#Copula [${personMonth}]`, group: 0, tag: 'Person', reason: 'is-may' },
- // may is
- // { match: `[%Person|Date%] #Copula`, group: 0, tag: 'Person', reason: 'may-is' },
- // may the
- // { match: `[%Person|Date%] the`, group: 0, tag: 'Date', reason: 'may-the' },
- // of may
- // { match: `of [%Person|Date%]`, group: 0, tag: 'Date', reason: 'of-may' },
- // // with april
- // { match: `(that|with|for) [${personMonth}]`, group: 0, tag: 'Person', reason: 'that-month' },
- // // may 5th
- // { match: `[${personMonth}] the? #Value`, group: 0, tag: 'Month', reason: 'may-5th' },
-
// ===person-date===
{ match: '%Person|Date% #Acronym? #ProperNoun', tag: 'Person', reason: 'jan-thierson' },
// ===person-noun===
diff --git a/src/2-two/postTagger/model/person/person-phrase.js b/src/2-two/postTagger/model/person/person-phrase.js
index 13ecc74ca..e75f36e03 100644
--- a/src/2-two/postTagger/model/person/person-phrase.js
+++ b/src/2-two/postTagger/model/person/person-phrase.js
@@ -53,9 +53,9 @@ export default [
//Foo Ford
{ match: '[#ProperNoun] #Person', group: 0, tag: 'Person', reason: 'proper-person', safe: true },
// john keith jones
- { match: '#Person [#ProperNoun #ProperNoun]', group: 0, tag: 'Person', ifNo: '#Possessive', reason: 'three-name-person', safe: true },
+ { match: '#Person [#ProperNoun #ProperNoun]', group: 0, tag: 'Person', notIf: '#Possessive', reason: 'three-name-person', safe: true },
//John Foo
- { match: '#FirstName #Acronym? [#ProperNoun]', group: 0, tag: 'LastName', ifNo: '#Possessive', reason: 'firstname-titlecase' },
+ { match: '#FirstName #Acronym? [#ProperNoun]', group: 0, tag: 'LastName', notIf: '#Possessive', reason: 'firstname-titlecase' },
// john stewart
{ match: '#FirstName [#FirstName]', group: 0, tag: 'LastName', reason: 'firstname-firstname' },
//Joe K. Sombrero
@@ -66,7 +66,7 @@ export default [
// ==== Honorics ====
{ match: '[(private|general|major|rear|prime|field|count|miss)] #Honorific? #Person', group: 0, tag: 'Honorific', reason: 'ambg-honorifics' },
// dr john foobar
- { match: '#Honorific #FirstName [#Singular]', group: 0, tag: 'LastName', ifNo: '#Possessive', reason: 'dr-john-foo', safe: true },
+ { match: '#Honorific #FirstName [#Singular]', group: 0, tag: 'LastName', notIf: '#Possessive', reason: 'dr-john-foo', safe: true },
//his-excellency
{ match: '[(his|her) (majesty|honour|worship|excellency|honorable)] #Person', group: 0, tag: 'Honorific', reason: 'his-excellency' },
// Lieutenant colonel
diff --git a/src/2-two/postTagger/model/verbs/imperative.js b/src/2-two/postTagger/model/verbs/imperative.js
index 01023a4b9..d5b4a3e22 100644
--- a/src/2-two/postTagger/model/verbs/imperative.js
+++ b/src/2-two/postTagger/model/verbs/imperative.js
@@ -1,5 +1,5 @@
// this is really hard to do
-const notIf = ['i', 'we', 'they'] //we do not go
+const notIf = '(i|we|they)' //we do not go
export default [
// do not go
{ match: '^do not? [#Infinitive #Particle?]', notIf, group: 0, tag: 'Imperative', reason: 'do-eat' },
@@ -11,14 +11,12 @@ export default [
{ match: '^[#Infinitive] it #Comparative', notIf, group: 0, tag: 'Imperative', reason: 'do-it-better' },
// do it again
{ match: '^[#Infinitive] it (please|now|again|plz)', notIf, group: 0, tag: 'Imperative', reason: 'do-it-please' },
- // go!
- // { match: '^[#Infinitive]$', group: 0, tag: 'Imperative', reason: 'go' },
// go quickly.
- { match: '^[#Infinitive] (#Adjective|#Adverb)$', group: 0, tag: 'Imperative', ifNo: ['so', 'such', 'rather', 'enough'], reason: 'go-quickly' },
+ { match: '^[#Infinitive] (#Adjective|#Adverb)$', group: 0, tag: 'Imperative', notIf: '(so|such|rather|enough)', reason: 'go-quickly' },
// turn down the noise
{ match: '^[#Infinitive] (up|down|over) #Determiner', group: 0, tag: 'Imperative', reason: 'turn-down' },
// eat my shorts
- { match: '^[#Infinitive] (your|my|the|some|a|an)', group: 0, ifNo: 'like', tag: 'Imperative', reason: 'eat-my-shorts' },
+ { match: '^[#Infinitive] (your|my|the|some|a|an)', group: 0, notIf: 'like', tag: 'Imperative', reason: 'eat-my-shorts' },
// tell him the story
{ match: '^[#Infinitive] (him|her|it|us|me)', group: 0, tag: 'Imperative', reason: 'tell-him' },
// avoid loud noises
diff --git a/src/2-two/postTagger/model/verbs/noun-gerund.js b/src/2-two/postTagger/model/verbs/noun-gerund.js
index f0b803ea1..e18731527 100644
--- a/src/2-two/postTagger/model/verbs/noun-gerund.js
+++ b/src/2-two/postTagger/model/verbs/noun-gerund.js
@@ -18,4 +18,9 @@ export default [
// finish listening
// { match: '#Infinitive [#Gerund]', group: 0, tag: 'Activity', reason: 'finish-listening' },
// the ruling party
+
+ // responsibility for setting
+ { match: '#Singular for [%Noun|Gerund%]', group: 0, tag: 'Gerund', reason: 'noun-for-gerund' },
+ // better for training
+ { match: '#Comparative (for|at) [%Noun|Gerund%]', group: 0, tag: 'Gerund', reason: 'better-for-gerund' },
]
diff --git a/src/2-two/postTagger/model/verbs/phrasal.js b/src/2-two/postTagger/model/verbs/phrasal.js
index 5c3026a6b..4fa235975 100644
--- a/src/2-two/postTagger/model/verbs/phrasal.js
+++ b/src/2-two/postTagger/model/verbs/phrasal.js
@@ -8,7 +8,7 @@ export default [
// walk in on
{
match: '[#Verb (in|out|up|down|off|back)] (on|in)',
- ifNo: ['#Copula'],
+ notIf: '#Copula',
tag: 'PhrasalVerb Particle',
reason: 'walk-in-on',
},
diff --git a/src/2-two/postTagger/model/verbs/verb-noun.js b/src/2-two/postTagger/model/verbs/verb-noun.js
index 9ae59a985..f13c46712 100644
--- a/src/2-two/postTagger/model/verbs/verb-noun.js
+++ b/src/2-two/postTagger/model/verbs/verb-noun.js
@@ -46,7 +46,7 @@ export default [
// teaches/taught
{ match: '(taught|teaches|learns|learned) [#PresentTense]', group: 0, tag: 'Noun', reason: 'teaches-x' },
// use reverse
- { match: '(try|use|attempt|build|make) [#Verb]', ifNo: ['#Copula', '#PhrasalVerb'], group: 0, tag: 'Noun', reason: 'do-verb' },
+ { match: '(try|use|attempt|build|make) [#Verb]', notIf: '(#Copula|#PhrasalVerb)', group: 0, tag: 'Noun', reason: 'do-verb' },
// checkmate is
{ match: '^[#Infinitive] (is|was)', group: 0, tag: 'Noun', reason: 'checkmate-is' },
// get much sleep
@@ -54,7 +54,7 @@ export default [
// cause i gotta
{ match: '[cause] #Pronoun #Verb', group: 0, tag: 'Conjunction', reason: 'cause-cuz' },
// the cardio dance party
- { match: 'the #Singular [#Infinitive] #Noun', group: 0, tag: 'Noun', ifNo: '#Pronoun', reason: 'cardio-dance' },
+ { match: 'the #Singular [#Infinitive] #Noun', group: 0, tag: 'Noun', notIf: '#Pronoun', reason: 'cardio-dance' },
// that should smoke
{ match: '#Determiner #Modal [#Noun]', group: 0, tag: 'PresentTense', reason: 'should-smoke' },
@@ -69,7 +69,7 @@ export default [
},
// assign all tasks
- { match: '#Verb (all|every|each|most|some|no) [#PresentTense]', ifNo: '#Modal', group: 0, tag: 'Noun', reason: 'all-presentTense' }, // PresentTense/Noun ambiguities
+ { match: '#Verb (all|every|each|most|some|no) [#PresentTense]', notIf: '#Modal', group: 0, tag: 'Noun', reason: 'all-presentTense' }, // PresentTense/Noun ambiguities
// big dreams, critical thinking
// have big dreams
{ match: '(had|have|#PastTense) #Adjective [#PresentTense]', group: 0, tag: 'Noun', reason: 'adj-presentTense' },
@@ -120,13 +120,13 @@ export default [
{ match: 'there (are|were) #Adjective? [#PresentTense]', group: 0, tag: 'Plural', reason: 'there-are' },
// 30 trains
- { match: '#Value [#PresentTense]', group: 0, ifNo: ['one', '1', '#Copula', '#Infinitive'], tag: 'Plural', reason: '2-trains' },
+ { match: '#Value [#PresentTense]', group: 0, notIf: '(one|1|#Copula|#Infinitive)', tag: 'Plural', reason: '2-trains' },
// compromises are possible
{ match: '[#PresentTense] (are|were) #Adjective', group: 0, tag: 'Plural', reason: 'compromises-are-possible' },
// hope i helped
{ match: '^[(hope|guess|thought|think)] #Pronoun #Verb', group: 0, tag: 'Infinitive', reason: 'suppose-i' },
//pursue its dreams
- { match: '#PresentTense #Possessive [#PresentTense]', ifNo: '#Gerund', group: 0, tag: 'Plural', reason: 'pursue-its-dreams' },
+ { match: '#PresentTense #Possessive [#PresentTense]', notIf: '#Gerund', group: 0, tag: 'Plural', reason: 'pursue-its-dreams' },
// our unyielding support
{ match: '#Possessive #Adjective [#Verb]', group: 0, tag: 'Noun', reason: 'our-full-support' },
// they do serve fish
@@ -134,9 +134,16 @@ export default [
// tastes good
{ match: '[(tastes|smells)] #Adverb? #Adjective', group: 0, tag: 'PresentTense', reason: 'tastes-good' },
// are you plauing golf
- { match: '^are #Pronoun [#Noun]', group: 0, ifNo: ['here', 'there'], tag: 'Verb', reason: 'are-you-x' },
+ { match: '^are #Pronoun [#Noun]', group: 0, notIf: '(here|there)', tag: 'Verb', reason: 'are-you-x' },
// ignoring commute
- { match: '#Copula #Gerund [#PresentTense] !by?', group: 0, tag: 'Noun', ifNo: ['going'], reason: 'ignoring-commute' },
+ { match: '#Copula #Gerund [#PresentTense] !by?', group: 0, tag: 'Noun', notIf: 'going', reason: 'ignoring-commute' },
// noun-pastTense variables
{ match: '#Determiner #Adjective? [(shed|thought|rose|bid|saw|spelt)]', group: 0, tag: 'Noun', reason: 'noun-past' },
+
+ // how to watch
+ { match: 'how to [%Noun|Verb%]', group: 0, tag: 'Verb', reason: 'how-to-noun' },
+ // ready to stream
+ { match: '(ready|available|difficult|hard|easy|made|attempt|try) to [%Noun|Verb%]', group: 0, tag: 'Verb', reason: 'ready-to-noun' },
+ // bring to market
+ { match: '(bring|went|go|drive|run|bike) to [%Noun|Verb%]', group: 0, tag: 'Noun', reason: 'bring-to-noun' },
]
diff --git a/src/2-two/postTagger/model/verbs/verbs.js b/src/2-two/postTagger/model/verbs/verbs.js
index 3a05e6686..aedd31dbc 100644
--- a/src/2-two/postTagger/model/verbs/verbs.js
+++ b/src/2-two/postTagger/model/verbs/verbs.js
@@ -21,7 +21,7 @@ export default [
{ match: 'will #Adverb? not? #Adverb? [be] #Adjective', group: 0, tag: 'Copula', reason: 'be-copula' },
// ==== Infinitive ====
//march to
- { match: '[march] (up|down|back|toward)', notIf: ['#Date'], group: 0, tag: 'Infinitive', reason: 'march-to' },
+ { match: '[march] (up|down|back|toward)', notIf: '#Date', group: 0, tag: 'Infinitive', reason: 'march-to' },
//must march
{ match: '#Modal [march]', group: 0, tag: 'Infinitive', reason: 'must-march' },
// may be
@@ -47,7 +47,7 @@ export default [
//had to walk
{ match: `(had|has) to [#Noun] (#Determiner|#Possessive)`, group: 0, tag: 'Infinitive', reason: 'had-to-noun' },
// have read
- { match: `have [#PresentTense]`, group: 0, tag: 'PastTense', ifNo: ['come', 'gotten'], reason: 'have-read' },
+ { match: `have [#PresentTense]`, group: 0, tag: 'PastTense', notIf: '(come|gotten)', reason: 'have-read' },
// does that work
{ match: `(does|will|#Modal) that [work]`, group: 0, tag: 'PastTense', reason: 'does-that-work' },
// sounds fun
diff --git a/src/2-two/preTagger/compute/tagger/2nd-pass/01-case.js b/src/2-two/preTagger/compute/tagger/2nd-pass/01-case.js
index e4c9a4700..87627a2e8 100644
--- a/src/2-two/preTagger/compute/tagger/2nd-pass/01-case.js
+++ b/src/2-two/preTagger/compute/tagger/2nd-pass/01-case.js
@@ -17,6 +17,22 @@ const nope = {
ml: true,
}
+// 'Buy Our Affordable Cars!'
+// const isAllTitleCase = function (terms) {
+// if (terms.length <= 3) {
+// return false
+// }
+// let count = 0
+// terms.forEach(term => {
+// if (titleCase.test(term.text)) {
+// count += 1
+// }
+// })
+// if (count >= terms.length - 2) {
+// return true
+// }
+// return false
+// }
// if it's a unknown titlecase word, it's a propernoun
const checkCase = function (terms, i, model) {
@@ -30,6 +46,10 @@ const checkCase = function (terms, i, model) {
if (notProper.find(tag => term.tags.has(tag))) {
return null
}
+ // ignore 'Buy Our Affordable Cars!'
+ // if (isAllTitleCase(terms)) {
+ // return null
+ // }
fillTags(terms, i, model)
if (!term.tags.has('Noun')) {
term.tags.clear()
diff --git a/src/2-two/preTagger/compute/tagger/3rd-pass/03-orgWords.js b/src/2-two/preTagger/compute/tagger/3rd-pass/03-orgWords.js
index b7d307a2e..be560358e 100644
--- a/src/2-two/preTagger/compute/tagger/3rd-pass/03-orgWords.js
+++ b/src/2-two/preTagger/compute/tagger/3rd-pass/03-orgWords.js
@@ -1,6 +1,6 @@
const isTitleCase = (str) => /^\p{Lu}[\p{Ll}'’]/u.test(str)
-const isOrg = function (term, i) {
+const isOrg = function (term, i, yelling) {
if (!term) {
return false
}
@@ -11,7 +11,7 @@ const isOrg = function (term, i) {
return true
}
// allow anything titlecased to be an org
- if (isTitleCase(term.text)) {
+ if (!yelling && isTitleCase(term.text)) {
// only tag a titlecased first-word, if it checks-out
if (i === 0) {
return term.tags.has('Singular')
@@ -21,16 +21,16 @@ const isOrg = function (term, i) {
return false
}
-const tagOrgs = function (terms, i, world) {
+const tagOrgs = function (terms, i, world, yelling) {
const orgWords = world.model.two.orgWords
const setTag = world.methods.one.setTag
let term = terms[i]
let str = term.machine || term.normal
- if (orgWords[str] === true && isOrg(terms[i - 1])) {
+ if (orgWords[str] === true && isOrg(terms[i - 1], i - 1, yelling)) {
setTag([terms[i]], 'Organization', world, null, '3-[org-word]')
// loop backwards, tag organization-like things
for (let t = i; t >= 0; t -= 1) {
- if (isOrg(terms[t], t)) {
+ if (isOrg(terms[t], t, yelling)) {
setTag([terms[t]], 'Organization', world, null, '3-[org-word]')
} else {
break
diff --git a/src/2-two/preTagger/compute/tagger/3rd-pass/07-imperative.js b/src/2-two/preTagger/compute/tagger/3rd-pass/07-imperative.js
new file mode 100644
index 000000000..db1075a78
--- /dev/null
+++ b/src/2-two/preTagger/compute/tagger/3rd-pass/07-imperative.js
@@ -0,0 +1,11 @@
+// '[place] tea bags in hot water'
+const imperative = function (terms, world) {
+ const setTag = world.methods.one.setTag
+ if (terms.length > 4 && terms[0].switch === 'Noun|Verb') {
+ let hasVerb = terms.slice(0, 5).some(t => t.tags.has('Verb'))
+ if (hasVerb === false) {
+ setTag([terms[0]], 'Imperative', world, null, '3-[imperative]')
+ }
+ }
+}
+export default imperative
\ No newline at end of file
diff --git a/src/2-two/preTagger/compute/tagger/index.js b/src/2-two/preTagger/compute/tagger/index.js
index c8cd66223..29b753211 100644
--- a/src/2-two/preTagger/compute/tagger/index.js
+++ b/src/2-two/preTagger/compute/tagger/index.js
@@ -11,8 +11,9 @@ import checkAcronym from './3rd-pass/01-acronym.js'
import neighbours from './3rd-pass/02-neighbours.js'
import orgWords from './3rd-pass/03-orgWords.js'
import nounFallback from './3rd-pass/04-fallback.js'
-import switches from './3rd-pass/06-switches.js'
import checkHyphen from './3rd-pass/05-prefixes.js'
+import switches from './3rd-pass/06-switches.js'
+// import imperative from './3rd-pass/07-imperative.js'
const second = {
tagSwitch,
@@ -30,16 +31,29 @@ const third = {
orgWords,
nounFallback,
switches,
+ // imperative
+}
+
+// is it all yelling-case?
+const ignoreCase = function (terms) {
+ // allow 'John F Kennedy'
+ if (terms.filter(t => !t.tags.has('ProperNoun')).length <= 3) {
+ return false
+ }
+ const lowerCase = /^[a-z]/
+ return terms.every(t => !lowerCase.test(t.text))
}
-//
+
// these methods don't care about word-neighbours
-const secondPass = function (terms, model, world) {
+const secondPass = function (terms, model, world, yelling) {
for (let i = 0; i < terms.length; i += 1) {
// mark Noun|Verb on term metadata
second.tagSwitch(terms, i, model)
// is it titlecased?
- second.checkCase(terms, i, model)
+ if (yelling === false) {
+ second.checkCase(terms, i, model)
+ }
// look at word ending
second.checkSuffix(terms, i, model)
// try look-like rules
@@ -51,7 +65,7 @@ const secondPass = function (terms, model, world) {
}
}
-const thirdPass = function (terms, model, world) {
+const thirdPass = function (terms, model, world, yelling) {
for (let i = 0; i < terms.length; i += 1) {
// let these tags get layered
let found = third.checkAcronym(terms, i, model)
@@ -64,28 +78,29 @@ const thirdPass = function (terms, model, world) {
}
for (let i = 0; i < terms.length; i += 1) {
// Johnson LLC
- third.orgWords(terms, i, world)
+ third.orgWords(terms, i, world, yelling)
// support 'out-lived'
second.checkHyphen(terms, i, model)
// verb-noun disambiguation, etc
third.switches(terms, i, world)
}
+ // place tea bags
+ // third.imperative(terms, world)
}
const preTagger = function (view) {
const { methods, model, world } = view
- // assign known-words
- // view.compute('lexicon')
// roughly split sentences up by clause
let document = methods.two.quickSplit(view.docs)
// start with all terms
for (let n = 0; n < document.length; n += 1) {
let terms = document[n]
- // firstPass(terms, model)
+ // is it all upper-case?
+ const yelling = ignoreCase(terms)
// guess by the letters
- secondPass(terms, model, world)
+ secondPass(terms, model, world, yelling)
// guess by the neighbours
- thirdPass(terms, model, world)
+ thirdPass(terms, model, world, yelling)
}
return document
}
diff --git a/src/2-two/preTagger/methods/transform/nouns/toPlural/_rules.js b/src/2-two/preTagger/methods/transform/nouns/toPlural/_rules.js
index 6cfe701d8..236f11b30 100644
--- a/src/2-two/preTagger/methods/transform/nouns/toPlural/_rules.js
+++ b/src/2-two/preTagger/methods/transform/nouns/toPlural/_rules.js
@@ -2,7 +2,7 @@
const suffixes = {
a: [
[/(antenn|formul|nebul|vertebr|vit)a$/i, '$1ae'],
- [/([ti])a$/i, '$1a'],
+ [/ia$/i, 'ia'],
],
e: [
[/(kn|l|w)ife$/i, '$1ives'],
diff --git a/src/2-two/preTagger/model/clues/_verb.js b/src/2-two/preTagger/model/clues/_verb.js
index 03617ae7a..b00f6c700 100644
--- a/src/2-two/preTagger/model/clues/_verb.js
+++ b/src/2-two/preTagger/model/clues/_verb.js
@@ -36,6 +36,9 @@ export default {
must: v,
us: v,
me: v,
+ let: v,
+ even: v,
+ when: v,
// them: v,
he: v,
she: v,
diff --git a/src/2-two/preTagger/model/lexicon/_data.js b/src/2-two/preTagger/model/lexicon/_data.js
index 63f582847..3d26021de 100644
--- a/src/2-two/preTagger/model/lexicon/_data.js
+++ b/src/2-two/preTagger/model/lexicon/_data.js
@@ -15,23 +15,21 @@ export default {
"Unit|Noun": "true¦cEfDgChBinchAk9lb,m6newt5oz,p4qt,t1y0;ardEd;able1b0ea1sp;!l,sp;spo1;a,oundAt,x;on9;!b,g,i1l,m,p0;h,s;!les;!b,elvin,g,m;!es;g,z;al,b;eet,oot,t;m,up0;!s",
"Value": "true¦a few",
"Imperative": "true¦come here",
- "PhrasalVerb": "true¦0:81;1:7Q;2:8E;3:84;4:7J;5:8H;6:7P;7:7E;8:7C;9:86;A:7Z;B:89;C:87;D:80;E:6L;F:6J;G:6C;a8Lb74c66d61e60f4Yg4Hh3Wiron0j3Sk3Nl34m2Qn2Oo2Mp23quietEr1Os0HtXuVvacuum 1wKyammerAzH;ero Dip IonH;e0k0;by,up;aOeJhIiHor7Writ38;mp0n35pe0r8s8;eel Dip 8Q;aJiHn2T;gh Hrd0;in,up;n Dr H;d2in,oF;it 6Hk8lk Irm 0Zsh Ht7Av5F;aw3d2o5up;aw3in,o85;rgeAsH;e 1herG;aWeUhSiOoNrJuHypM;ckGrn H;d2in,oFup;aIiHot0y 2P;ckleEp 8B;ckEdH;e 0O;neEp 30s4Z;ck JdIe Hghte5Yme0p o0Jre0;aw3ba4d2in,up;e 6Iy 1;by,oC;ink Hrow 6V;ba4ov6up;aHe 6Gll5G;m 1r 53;ckAke Ilk H;ov6shit,u5H;aHba4d2in,oFup;ba4ft6p5Mw3;a0Mc0Le0Fh0Bi08l04m03n02o01pWquar4XtNuLwH;earJiH;ngItch H;aw3ba4o7P; by;ck Hit 1m 1ss0;in,o7Cup;aNe11iMoKrIuH;c37d2P;aigh23iH;ke 6Xn3L;p Hrm25;by,in,oC;n32r 1tc44;c31mp0nd Hr7Gve9y 1;ba4d2up;ar2ZeKiJlIrHurA;ingAuc8;a3Rit 5S;l18n 1;e6All0;ber 1rt0und like;ap 56ow D;ash 5Xoke0;eep IiHow 7;c1Mp 1;in,oH;ff,v6;de13gn IngHt 5Sz8; al5Nle0;in,o5up;aJoHu5B;ot Hut0w 6V;aw3ba4f3SoC;c2HdeGk5Qve9;e Lll1Hnd Krv8tH; Htl4W;d2f5Cin,o5upH;!on;aw3ba4d2in,o2Nup;o6Eto;al5Jout0rap5J;il9v8;aUeRiQoMuH;b 5Cle0n Hstl8;aJba4d2inIoHt3Lu0Y;ut,v6;!to;c2HrBw3;ll Jot IuH;g33nd9;a2Hf3Ao5;arBin,o5;ng 5Jp9;aHel9inGnt0;c5Sd H;o3Bup;c1Ut0;aVeUiSlQoOrLsyc2RuH;ll Jt H;aHba4d2in,oFt3Rup;p3Ww3;ap3Vd2in,o5t3Pup;attleAess IiKoH;p 1;ah1Zon;iHp 5Xr4DurEwer 5X;nt0;ay4TuH;gGmp 7;ck Hg0leAn 7p4Q;oFup;el 50ncilG;c4Iir 2Xn0ss JtIy H;ba4oC; d2c2E;aw3ba4in,oF;pHw4D;e4Ct D;arrowEerd0oH;d9teE;aReOiNoJuH;ddl8lH;l 3X;c13nkeyJp 7uth9ve H;aHd2in,o5up;l42w3; wi3Z;ss0x 1;asur8lIss H;a1Oup;t 7;ke In 7rHs1Xx0;k 7ry9;do,o4Wup;aXeSiNoHuck0;aLc3Vg KoHse0;k Hse3T;aft6ba4d2forw2Sin4Jov6uH;nd6p;in,oF;d 7;e 05ghtKnJsIvH;e 3F;ten 4Z;e 1k 1; 1e3K;ave Jt IvelH; o4I;d2go,in,o5up;in,oH;pen,ut;c8p 1sh HtchAugh9y26;in44o5;eIick9nock H;d2o4Bup;eHyG;l 2Zp H;aw3ba4d2fZin,oFto,up;aJoIuH;ic8mpG;ke3CtE;c3Lzz 1;aWeRiOoLuH;nIrrHsh 7;y 1;kerEt H;arBd2;lHneGrse35;d He 1;ba4d2fast,o04up;de It H;ba4on,up;aw3o5;aHlp0;d Jl 2Hr Ht 1;fHof;rom;in,oWu1K;cKm 1nIve Hz2C;it,to;d Hg 2NkerK;d2in,o5;k 1;aUeOive Nloss 28oJrIunH; f0O;in3Oow 2I; Hof 27;aIb1Fit,oHrBt0Qu1A;ff,n,v6;bo5ft6hMw3;aw3ba4d2in,oFrise,up,w3;ar 7ek0t H;aIb1Ad2in,oHrBup;ff,n,ut,v6;cIhHl25rBt,w3;ead;ross;d aInH;g 1;bo5;a0Be04iVlRoNrJuH;ck He2A;arBup;eIighten HownAy 1;aw3oC;eHshe1W; 1z8;lJol H;aHwi1P;bo5rB;d 7low 1;aIeHip0;sh0;g 7ke0mHrHttenE;e 30;gOlMnKrIsHzzle0;h 2Y;e Hm 1;aw3ba4up;d0isH;h 1;e Hl 1I;aw3fMin,o5;ht ba4ure0;eMnIsH;s 1;cJd H;fHoC;or;e D;dZl 1;cLll Hrm0t15;ap08bJd2in,oItH;hrough;ff,ut,v6;a4ehi29;e H;d2oCup;a0Ndge0nd 0Ry8;oKrH;aIess 7op H;aw3bXin,o1W;gAwA; 0Kubl10;a01hYleaXoKrHut 18;ackAeep Hoss D;by,d2in,oHup;n,ut;me KoIuntH; o1Y;k 7l H;d2oC;aNbMforKin,oJtIuH;nd6;ogeth6;n,ut,v6;th,wH;ard;a4y;pHrBw3;art;n 7;eHipG;ck Der H;on,up;lPncel0rLsJtch IveG; in;o1Gup;h Dt H;doubt,oC;ry IvH;e 04;aw3oF;ff,n,ut;l ImE; d2;aHba4d2o17up;rBw3;a0Ne0Fl08oZrMuH;bblJckl00il06lk 7ndl00rHst WtIy 17zz9;n 0BsH;t D;e H;ov6;anSeaQiIush H;oCup;ghMng H;aJba4d2fHin,o5up;orH;th;bo5lHrBw3;ong;teH;n 1;k H;d2in,o5up;ch0;arOg 7iMn8oKssJttlIunce Hx D;aw3ba4;e 7; arB;k Dt 1;e 1;l 7;d2up;d 1;aMeed0oHurt0;cJw H;aw3ba4d2o5up;ck;k H;in,oY;ck0nk0st9; oMaKef 1nd H;d2ov6up;er;up;r0t H;d2in,oRup;ff,nH;to;ck Nil0nJrgIsH;h D;ainAe D;g DkA; on;in,o5; o5;aw3d2oHup;ff,ut;ay;cQdMsk Juction9; oC;ff;arBo5;ouH;nd;d H;d2oHup;ff,n;own;t H;o5up;ut",
+ "PhrasalVerb": "true¦0:82;1:7R;2:8F;3:85;4:7K;5:8I;6:7Q;7:7F;8:7D;9:87;A:80;B:8A;C:88;D:81;E:6M;F:6K;G:6D;a8Mb75c66d61e60f4Yg4Hh3Wiron0j3Sk3Nl34m2Qn2Oo2Mp23quietEr1Os0HtXuVvacuum 1wKyammerAzH;ero Dip IonH;e0k0;by,up;aOeJhIiHor7Xrit38;mp0n35pe0r8s8;eel Dip 8R;aJiHn2T;gh Hrd0;in,up;n Dr H;d2in,oF;it 6Ik8lk Irm 0Zsh Ht7Bv5F;aw3d2o5up;aw3in,o86;rgeAsH;e 1herG;aWeUhSiOoNrJuHypM;ckGrn H;d2in,oFup;aIiHot0y 2P;ckleEp 8C;ckEdH;e 0O;neEp 30s4Z;ck JdIe Hghte5Zme0p o0Jre0;aw3ba4d2in,up;e 6Jy 1;by,oC;ink Hrow 6W;ba4ov6up;aHe 6Hll5H;m 1r 53;ckAke Ilk H;ov6shit,u5I;aHba4d2in,oFup;ba4ft6p5Nw3;a0Mc0Le0Fh0Bi08l04m03n02o01pWquar4XtNuLwH;earJiH;ngItch H;aw3ba4o7Q; by;ck Hit 1m 1ss0;in,o7Dup;aNe11iMoKrIuH;c37d2P;aigh23iH;ke 6Yn3L;p Hrm25;by,in,oC;n32r 1tc44;c31mp0nd Hr7Hve9y 1;ba4d2up;ar2ZeKiJlIrHurA;ingAuc8;a3Rit 5T;l18n 1;e6Bll0;ber 1rt0und like;ap 57ow D;ash 5Yoke0;eep IiHow 7;c1Mp 1;in,oH;ff,v6;de13gn IngHt 5Tz8; al5Ole0;in,o5up;aJoHu5C;ot Hut0w 6W;aw3ba4f3SoC;c2HdeGk5Rve9;e Lll1Hnd Krv8tH; Htl4X;d2f5Din,o5upH;!on;aw3ba4d2in,o2Nup;o6Fto;al5Kout0rap5K;il9v8;aUeRiQoMuH;b 5Dle0n Hstl8;aJba4d2inIoHt3Lu0Y;ut,v6;!to;c2HrBw3;ll Jot IuH;g33nd9;a2Hf3Ao5;arBin,o5;ng 5Kp9;aHel9inGnt0;c5Td H;o3Bup;c1Ut0;aVeUiSlQoOrLsyc2RuH;ll Jt H;aHba4d2in,oFt3Sup;p3Xw3;ap3Wd2in,o5t3Qup;attleAess IiKoH;p 1;ah1Zon;iHp 5Yr4EurEwer 5Y;nt0;ay4UuH;gGmp 7;ck Hg0leAn 7p4R;oFup;el 51ncilG;c4Jir 2Xn0ss JtIy H;ba4oC; d2c2E;aw3ba4in,oF;pHw4E;e4Dt D;arrowEerd0oH;d9teE;aReOiNoJuH;ddl8lH;l 3Y;c13nkeyJp 7uth9ve H;aHd2in,o5up;l43w3; wi40;ss0x 1;asur8lIss H;a1Oup;t 7;ke In 7rHs1Xx0;k 7ry9;do,o4Xup;aXeSiNoHuck0;aLc3Wg KoHse0;k Hse3U;aft6ba4d2forw2Tin4Kov6uH;nd6p;in,oF;d 7;e 05ghtKnJsIvH;e 3G;ten 50;e 1k 1; 1e3L;ave Jt IvelH; o4J;d2go,in,o5up;in,oH;pen,ut;c8p 1sh HtchAugh9y27;in45o5;eIick9nock H;d2o4Cup;eHyG;l 30p H;aw3ba4d2fZin,oFto,up;aJoIuH;ic8mpG;ke3DtE;c3Mzz 1;aWeRiOoLuH;nIrrHsh 7;y 1;kerEt H;arBd2;lHneGrse36;d He 1;ba4d2fast,o04up;de It H;ba4on,up;aw3o5;aHlp0;d Jl 2Ir Ht 1;fHof;rom;in,oWu1L;cKm 1nIve Hz2D;it,to;d Hg 2OkerK;d2in,o5;k 1;aUeOive Nloss 29oJrIunH; f0O;ab hold,in3Pow 2J; Hof 28;aIb1Git,oHrBt0Qu1B;ff,n,v6;bo5ft6hMw3;aw3ba4d2in,oFrise,up,w3;ar 7ek0t H;aIb1Bd2in,oHrBup;ff,n,ut,v6;cIhHl26rBt,w3;ead;ross;d aInH;g 1;bo5;a0Be04iVlRoNrJuH;ck He2B;arBup;eIighten HownAy 1;aw3oC;eHshe1X; 1z8;lJol H;aHwi1Q;bo5rB;d 7low 1;aIeHip0;sh0;g 7ke0mHrHttenE;e 31;gOlMnKrIsHzzle0;h 2Z;e Hm 1;aw3ba4up;d0isH;h 1;e Hl 1J;aw3fMin,o5;ht ba4ure0;eMnIsH;s 1;cJd H;fHoC;or;e D;d00l 1;cLll Hrm0t16;ap09bJd2in,oItH;hrough;ff,ut,v6;a4ehi2A;e H;d2oCup;a0Odge0nd 0Sy8;oKrH;aIess 7op H;aw3bYin,o1X;gAwA; 0Lubl11;a02hZleaYoLrHut 19;ackAeep IoH;ss Dwd0;by,d2in,oHup;n,ut;me KoIuntH; o1Y;k 7l H;d2oC;aNbMforKin,oJtIuH;nd6;ogeth6;n,ut,v6;th,wH;ard;a4y;pHrBw3;art;n 7;eHipG;ck Der H;on,up;lPncel0rLsJtch IveG; in;o1Gup;h Dt H;doubt,oC;ry IvH;e 04;aw3oF;ff,n,ut;l ImE; d2;aHba4d2o17up;rBw3;a0Ne0Fl08oZrMuH;bblJckl00il06lk 7ndl00rHst WtIy 17zz9;n 0BsH;t D;e H;ov6;anSeaQiIush H;oCup;ghMng H;aJba4d2fHin,o5up;orH;th;bo5lHrBw3;ong;teH;n 1;k H;d2in,o5up;ch0;arOg 7iMn8oKssJttlIunce Hx D;aw3ba4;e 7; arB;k Dt 1;e 1;l 7;d2up;d 1;aMeed0oHurt0;cJw H;aw3ba4d2o5up;ck;k H;in,oY;ck0nk0st9; oMaKef 1nd H;d2ov6up;er;up;r0t H;d2in,oRup;ff,nH;to;ck Nil0nJrgIsH;h D;ainAe D;g DkA; on;in,o5; o5;aw3d2oHup;ff,ut;ay;cQdMsk Juction9; oC;ff;arBo5;ouH;nd;d H;d2oHup;ff,n;own;t H;o5up;ut",
"Verb": "true¦born,cannot,gonna,has,keep tabs,m0;ake sure,sg",
"Demonym": "true¦0:15;1:12;a0Vb0Oc0Dd0Ce08f07g04h02iYjVkTlPmLnIomHpEqatari,rCs7t5u4v3welAz2;am0Gimbabwe0;enezuel0ietnam0I;gAkrai1;aiwTex0hai,rinida0Ju2;ni0Prkmen;a5cotti4e3ingapoOlovak,oma0Spaniard,udRw2y0W;ede,iss;negal0Cr09;sh;mo0uT;o5us0Jw2;and0;a2eru0Fhilippi0Nortugu07uerto r0S;kist3lesti1na2raguay0;ma1;ani;ami00i2orweP;caragu0geri2;an,en;a3ex0Lo2;ngo0Drocc0;cedo1la2;gasy,y07;a4eb9i2;b2thua1;e0Cy0;o,t01;azakh,eny0o2uwaiI;re0;a2orda1;ma0Ap2;anO;celandic,nd4r2sraeli,ta01vo05;a2iB;ni0qi;i0oneU;aiAin2ondur0unO;di;amEe2hanai0reek,uatemal0;or2rm0;gi0;ilipino,ren8;cuadoVgyp4mira3ngli2sto1thiopi0urope0;shm0;ti;ti0;aPominUut3;a9h6o4roat3ub0ze2;ch;!i0;lom2ngol5;bi0;a6i2;le0n2;ese;lifor1m2na3;bo2eroo1;di0;angladeshi,el6o4r3ul2;gaE;azi9it;li2s1;vi0;aru2gi0;si0;fAl7merBngol0r5si0us2;sie,tr2;a2i0;li0;genti2me1;ne;ba1ge2;ri0;ni0;gh0r2;ic0;an",
"Organization": "true¦0:4D;a3Gb2Yc2Ed26e22f1Xg1Ph1Ki1Hj1Fk1Dl18m0Wn0Jo0Gp09qu08r01sTtGuBv8w3xiaomi,y1;amaha,m13ou1w13;gov,tu2Z;a3e1orld trade organizati2S;lls fargo,st1;fie28inghou2I;l1rner br3I;gree37l street journ29m17;an halOeriz2Nisa,o1;dafo2Ol1;kswagMvo;b4kip,n2ps,s1;a tod2Yps;es3Ai1;lev33ted natio30;er,s; mobi2Qaco beQd bNeAgi frida9h3im horto2Ymz,o1witt31;shi3Xy1;ota,s r 00;e 1in lizzy;b3carpen37daily ma31guess w2holli0rolling st1Rs1w2;mashing pumpki2Tuprem0;ho;ea1lack eyed pe3Lyrds;ch bo1tl0;ys;l2n3Ds1xas instrumen1J;co,la m15;efoni0Cus;a7e4ieme2Lnp,o2pice gir5quare04ta1ubaru;rbucks,to2R;ny,undgard1;en;a2x pisto1;ls;g1Nrs;few2Ainsbury2QlesforYmsu22;.e.m.,adiohead,b6e3oyal 1yana30;b1dutch she4;ank;aders dige1Gd 1max,vl1R;bu1c1Zhot chili peppe2Nlobst2C;ll;c,s;ant30izno2I;a5bs,e3fiz28hilip morrCi2r1;emier2Audenti16;nk floyd,zza hut;psi2Btro1uge0A;br2Vchina,n2V;lant2Nn1yp12; 2ason20da2I;ld navy,pec,range juli2xf1;am;us;aAb9e6fl,h5i4o1sa,vid3wa;k2tre dame,vart1;is;ia;ke,ntendo,ss0L;l,s;c,st1Htflix,w1; 1sweek;kids on the block,york09;a,c;nd1Vs2t1;ional aca2Io,we0Q;a,cYd0O;aBcdonaldAe7i5lb,o3tv,y1;spa1;ce;b1Mnsanto,ody blu0t1;ley crue,or0O;crosoft,t1;as,subisM;dica2rcedes benz,talli1;ca;id,re;'s,s;c's milk,tt14z1Z;'ore08a3e1g,ittle caesa1K;novo,x1;is,mark; 1bour party;pres0Bz boy;atv,fc,kk,m1od1J;art;iffy lu0Moy divisi0Gpmorgan1sa;! cha07;bm,hop,n1tv;g,te1;l,rpol;asbro,ewlett pack1Ri3o1sbc,yundai;me dep1n1L;ot;tac1zbollah;hi;eneral 6hq,ithub,l5mb,o2reen d0Lu1;cci,ns n ros0;ldman sachs,o1;dye1g0E;ar;axo smith kli03encoV;electr0Km1;oto0W;a4bi,da,edex,i2leetwood mac,o1rito l0D;rd,xcX;at,nancial1restoY; tim0;cebook,nnie mae;b08sa,u3xxon1; m1m1;ob0H;!rosceptics;aiml0Be6isney,o4u1;nkin donu2po0Xran dur1;an;ts;j,w j1;on0;a,f lepp0Zll,peche mode,r spiegZstiny's chi1;ld;aIbc,hEiCloudflaBnn,o3r1;aigsli5eedence clearwater reviv1ossra06;al;ca c7inba6l4m1o0Bst06;ca2p1;aq;st;dplPg1;ate;se;ola;re;a,sco1tigroup;! systems;ev2i1;ck fil-a,na daily;r1y;on;dbury,pital o1rl's jr;ne;aEbc,eBf9l5mw,ni,o1p,rexiteeU;ei3mbardiIston 1;glo1pizza;be;ng;o2ue c1;roV;ckbuster video,omingda1;le; g1g1;oodriL;cht2e ge0rkshire hathaw1;ay;el;idu,nana republ3s1xt5y5;f,kin robbi1;ns;ic;bYcTdidSerosmith,iRlKmEnheuser-busDol,pple9r6s3utodesk,v2y1;er;is,on;hland1sociated F; o1;il;by4g2m1;co;os; compu2bee1;'s;te1;rs;ch;c,d,erican3t1;!r1;ak; ex1;pre1;ss; 5catel2ta1;ir;!-lu1;ce1;nt;jazeera,qae1;da;g,rbnb;as;/dc,a3er,tivision1;! blizz1;ard;demy of scienc0;es;ba",
"Possessive": "true¦any2its,my,no4o0somet3their1yo0;ur0;!s;o1t0;hing;ne",
- "Noun|Verb": "true¦0:7R;1:6J;2:7N;3:7Y;4:7X;5:81;6:6W;7:7H;a7Hb6Sc5Rd55e4Xf4Ag40h3Si3Mj3Lk3Jl39m30n2Wo2Sp1Zques7Jr1Bs05tRuPvKwAy9z8;ip,o6A;awn,e1Uie4P;aFeaEhCiAo8re7J;nd0r8;k,ry;mp,n8pe,re,sh,tne81;!d,g;e6Ei8;p,st6;r,th0;it,r8s4t2ve,x;ehou1ra80;aBiAo8;i8lunte0te,w;ce,d;be,ew,s6V;cuum,l36;p8sh0;da4gra4Wlo4T;aJeIhrHiGoFrBu9wi8y4J;n,st;n8rn;e,n5Z;aAe9i8u7;bu4ck,gg0m,p;at,nd;ck,de,in,nsf0p,v5V;ll,ne,r3Oss,t73u2;ck,e,me,p,re;e4Iow,u7;ar,e,st;g,l8rg5Zs4x;k,ly;a0Cc07e04hZiXkVlTmSnRou69pNtDu9w8;ea6Dit2;b1Vit,m,pp9r8spe5;ge,pri1vey;l8o58;e55y;aFeEiDoBr9u8y6;dy,ff,mb6;a69e8i4C;am,ss,t2;cking,p,r8;e,m;ck,t2;m,p;ck,in,ke,ll,mp,nd,r8te,y;!e,t;aAeed,i9la4Hons6Jr8y;ay,e3Xink6u3;n,r6Fte;n,rk;ee1Cow;e0Di6o3Z;eep,i8;ce,p,t;ateboa5Wi8;!p;de,gn8ze;!al;aBeAi9o8;ck,p,w;ft,p,v0;d,i2Y;pe,re;a9ed,n8rv13t;se,t1U;l,r2t;aBhedu6oAr8;at2e8;en,w;re,ut;le,n,r0G;crifi3il;aTeCiBoAu8;b,in,le,n,s8;h,t;a7ck,ll,ot;de,ng,p,s19;as5BcMdo,el,fKgJje5lImGnFo0SpDque7sAturn,v8wa59;e8i1F;al,r1;er5Go9t,u8;lt,me;l5Ert;air,ea8ly,o3V;l,t;dezvo22t;a8edy;ke,rk;ea1i3B;a4Xist0r4A;act5Borm,u8;nd,se;a8o4Uru4N;ll;ck,i1ke,l44n8tS;ge,k;aXeUhSiPlLoHr9u8;mp,n2rcha1sh;ai1eDiCo8u3H;be,ceAdu3gr8je5mi1te7;am8e5B;!me;ed,ss;ce,de;s8y;er4Rs;iAl8ol,p,re,s2Ow0;i8l;ce,sh;nt,s4F;a9e26u8;g,n3S;ce,n8y;!t;ck,l9n8pe,t,vot;!e;e,ot;a1o8;ne,tograph;ak,e9n,r8t;fu3Sm3V;!l;cka3Hi9n,rt8ss,t2u1;!y;nt,r;bAff0il,o9r8utli2Q;d0ie4Q;ze;je5;a3JeAo8;d,t8;e,i3;ed,gle5rd,t;aDeBiAo9u8;rd0;d2Rnit42p,ve;lk,n2Vrr41ss,x;asu0Yn3Mr8ss;ge,it;il,n9p,rk2Ws8t2;h,k;da4oeuv0U;aEeBiAo8ump;a8bby,ck,g,ok,ve;d,n;cen1ft,m36nCst;a9c0Av8;el,y;ch,d,p,se;b9c8nd,t2un2;e,k;el,o22;e2Ai8no3A;ck,ll,ss;am,o14ui3;mpCn9r35ss8;ue;cr17dex,flu9ha6k,se1Ttervi8voi3;ew;en3;a5le1O;aCeAi9o8u3R;ld,no1Rok,pe,r1st,u1;ghlight,ke,re,t;a8lp;d,t;nd9r8te;bo2Zm,ne3Gve7;!le;aGeek,lo3EoFrAu8;ar8e3Di0Ln;antee,d;aAi9o8umb6;om,u2A;nd,p;d8sp;e,ua4;of,ssip;in,me,ng,s,te,ze;aTePiKlHoErAu8;el,n8zz;c2Ed;a9o8y;st,wn;c8me;tuM;c9g,ol,r8;ce,e1Mm;us;a9e0Iip,o8y;at,od,w;g,re,sh,vo0Y;eBgAl9n8re,sh,t,x;an3i0E;e,m,t0;ht,uC;ld;a9e8n3;d,l;r,tu8;re;ce,il,ll,rm,vo21;cho,nEsCx8ye;cAerci1hib1Kp8tra5;eri8o0I;en3me2J;el,han15;ca8tima4;pe;count0d,gine0vy;aReLiFoDr9u8ye;b,mp,pli24;aAe9i8;ft,nk,ve;am,ss;ft,in;cu04d0Vubt,wnlo8;ad;p,sAv8;e,i8or3;de;char0Qli9p8;at2lay,u4;ke;al,ba4cBfeAl9ma0Vpos0Zsi8tail;gn,re;ay,ega4;at,ct;liVr8;ea1;ma0Hn3r8te;e,t;a05ent04hXlUoErAu8;be,r8t;e,l;aft,eAo9u8y;sh;p,ss,wd;d0Lep;de,in,lLmFnAok,py,re,st,u8v0;gh,n8p6;sTt;ceAdu5glomeBstru5t8veG;a5r8;a7ol;nt8rn;ra4;biCfoBmAp8;le8ou07romi1;me1B;a05e1Au4;rt;ne;lap1o8;r,ur;a9i8;ck,p;im,w;a9e8ip;at,ck,er;iBllenNmpi08n9r8uffe0E;ge,m,t;ge,n8;el;n,r;er,re;ke,ll,mp,p,r9sh,t2u1ve;se;d,e;aSePiOlLoHrBu8ypa0M;bb6ck6dg9ff0l8rn,st,zz;ly;et;anCeaBi9oad8;ca7;be,d8;ge;ch,k;ch,d;aAmb,ne,o9ss,tt6x,ycott;le;k,st,t;rd,st;a9e8itz,oN;nd;me;as,d,ke,te;a9nef8t;it;r,t;il,lan3nArga9s8;e,h;in;!d,g,k;cZdRffilQge,iPlt0nMppJrFssDttBuc9wa8;rd;ti8;on;a8empt;ck;i7ocK;st;ch9mo8;ur;!i8;ve;e9roa2;ch;al;ch8sw0;or;er;d,m,r;ia4;dCv8;an3o8;ca4;te;ce;i5re8;ss;ct;c8he,t;eAo8;rd,u8;nt;nt,ss",
+ "Noun|Verb": "true¦0:8D;1:71;2:8K;3:89;4:7R;5:8J;6:8N;7:7O;8:83;9:7B;A:8R;a85b7Dc6Bd5Oe5Ef4Qg4Eh45i3Yj3Xk3Vl3Km3An36o32p28ques87r1Ls0DtXuVvQwEyDzB;ip,oB;ne,om;awn,e5Die55;aKeIhFiDoBre86;nd0rB;k,ry,sh4H;ck,mp,nBpe,re,sh,tne8P;!d,g;e6YiB;p,sB;k,t4;aBed;r,th0;it,rBs5t3ve,x;ehou1raA;aEiDoB;iBlunte0m7te,w;ce,d;be,ew,s7;cuum,l3F;pBsh0;da5gra5Dlo5A;aOeNhrMiLoJrEuCwiBy4Z;n,st;nBrn;e,n6H;aDeCiBu8;bu5ck,gg0m,p;at,k,nd;ck,de,in,nsBp,v6D;f0i7C;ll,ne,p,r40ss,t7OuB;ch,r;ck,e,me,p,re;e4Xow,u8;ar,e,st,xt;g,lBng4rg6Fs5x;k,ly;a0Hc0Ce09h04i02k00lYmXnWou6RpRtHuDwB;ea6ViB;pe,t3;b1Zit,m,ppCrBspe6;ge,pri1vey;lBo5N;e5Ky;aIeHiGoErCuBy4;dy,ff,mb4;a6ReBi4Qo4Qugg4;am,ss,t3;cking,p,rB;e,m;ck,t3;m,p;ck,in,ke,ll,mp,nd,p4rBte,y;!e,t;aEeed,iDla5YoCrBy;ay,e4Bink4u2;ns70t;n,r6Xte;n,rk;ap,ee1Fow;e3Qi4o4C;eep,iB;ce,p,t;ateboa6DiB;!p;de,gnBp,ze;!al;aEeDiCoBuff4;ck,p,re,w;ft,p,v0;d,i38;pe,re,ve;aCed,nBrv16t;se,t20;l,r3t;aEhedu4oDrB;at3eBo3A;en,w;re,ut;le,n,r1Y;crifi2il;aVeEiDoCuB;b,in,le,n,s50;a8ck,ll,ot,u5;de,ng,p,s1F;as5TcQdo,el,fOgNje6lMmKnJo0WpHque8sDturn,vBwa5R;eBi1M;al,r1;er5ZoDpe6tCuB;lt,me;!a4B;l5Wrt;air,eaBly,o49;l,t;dezvo2Ct;aBedy;ke,rk;ea1i4R;a5Eist0r4O;act5Ter1Aorm,uB;nd,se;a2Lo5Bru7;c0Xi1ke,l4JnBp,t1B;ge,k;a01eYhWiUlQoLrCuB;mp,n3rcha1sh;aIeGiFoBu3W;be,ceDdu2grBje6mi1te8;amBe5U;!me;ed,ss;ce,de,nt;sBy;er5As;cti2i1;iElCol,p,re,sBw0;e,i4Xt;iBl;ce,sh;nt,s4V;aCe2IuB;g,n9;ce,nBy;!t;ck,lBn0Ppe,t,vot;e,ot;a1oB;ne,tograph;ak,eCn,rBt;fu48m7;!l,r;cka9iCn,rtBss,t3u1;!y;nt,r;bDff0il,oCrButli34;b7d0ieA;ze;je6;a3ZeDoB;d,tB;e,i2;ed,gle6rd,t;aGeEiDoCuB;rd0;d35ld,nit4Kp,ve;lk,n3Orr4Jss,x;asu18n43rBss;ge,it;il,nDp,rk3AsCtB;ch,t0;h,k;da5oeuv13;aIeFiEoBump;aCbby,ck,g,oBve;k,t;d,n;cen1ft,m7nFst;aCc0He3vB;el,y;ch,d,k,p,se;bCcBnd,p,t3un3;e,k;el,o2E;e2MiBno3P;ck,ll,ss;am,o1Fui2;mpGnCr3KssB;ue;cr1Idex,fluDha4k,se25terBvoi2;e8fa2viB;ew;en2;a6le1Z;aGeEiDoBuA;ld,no22ok,pBr1st,u1;!e;ghlight,ke,re,t;aBd9lp;d,t;ndCrBte;bo3Dm,ne3Uve8;!le;aLeek,loKoIrDuB;arBe3Ri0Un;antee,d;aDiCoBumb4;om,u2M;nd,p;dBsp;e,ua5;of,ssB;ip;ss,w;in,me,ng,s,te,ze;aXeTiOlLoHrDuB;el,nBss,zz;c2Pd;aCoBy;st,wn;cBgme,me;tuQ;cDg,il,ld,ol,rB;ce,e1VmB;!at;us;aCe1Rip,oBy;at,ck,od,w;g,re,sh,vo15;eEgDlCnBre,sh,t,x;an2i1N;e,m,t0;ht,uF;ld;aCeBn2;d,l;r,tuB;re;ce,il,ll,rm,vo2C;cho,d9nJsHxDyeB;!baB;ll;cDerci1hib7pBtra6;eriBo0N;en2meA;el,han9;caBtima5;pe;count0d,gine0vy;aVePiJoHrCuBye;b,el,mp,pli2D;aEeDiCoB;ne,p;ft,nk,p,ve;am,ss;ft,in;cu08d9ubt,wnloB;ad;p,sDvB;e,iBor2;de;char9liCpB;at3lay,u5;ke;al,ba5cEfeDlCma11pos7siBtail;gn,re;ay,ega5;at,ct;liZrB;ea1;b,ma9n2rBte;e,t;a09ent08h01irc4lYoHrDuB;be,e,rBt;e,l,ve;aDeCoBu0Ey;p,ss,wd;d7ep;ft,sh;a3de,in,lPmJnDok,py,re,st,uBv0;gh,nBp4;sXt;ceEdu6fli6glomeFsDtBveK;a6rB;a8ol;eAtru6;ntBrn;ra5;biFfoEmDpB;leBou0Cromi1;meA;a0AeAu5;rt;ne;lap1oB;r,ur;aCiB;ck,p;im,w;aCeBip;at,ck,er;iEllen9mpi0EnCrBuffe0L;ge,m,t;ge,nB;el;n,r;er,re;ke,ll,mp,noe,p,rRsCt3u1ve;se;h,t;aXeUiTlQoMrEuBypa0T;bb4ck4dgCff0lBrn,st,zz;ly;et;anHeFiDoadCuB;sh;ca8;be,d9;ge;aBed;ch,k;ch,d;aDmb,nCoBss,tt4x,ycott;k,st,t;d,e;rd,st;aCeBitz,oRur;nd;me;as,d,ke,nd,te;aCnef7t;it;r,t;il,lan2nErgaDsCtt4;le;e,h;in;!d,g,k;c03dVffilUge,iTlt0nQppNrJsGttEucCwaB;rd;tiB;on;aBempt;ck;k,sB;i8ocN;st;chCmoB;ur;!iB;ve;eCroa3;ch;al;chBg0sw0;or;er;d,m,r;ia5;dFvB;an2oB;ca5;te;ce;i6reB;ss;ct;cBhe,t;eDoB;rd,uA;nt;nt,ss",
"Actor": "true¦aJbGcFdCfAgardenIh9instructPjournalLlawyIm8nurse,opeOp5r3s1t0;echnCherapK;ailNcientJoldiGu0;pervKrgeon;e0oofE;ceptionGsearC;hotographClumbColi1r0sychologF;actitionBogrammB;cem6t5;echanic,inist9us4;airdress8ousekeep8;arm7ire0;fight6m2;eputy,iet0;ici0;an;arpent2lerk;ricklay1ut0;ch0;er;ccoun6d2ge7r0ssis6ttenda7;chitect,t0;ist;minist1v0;is1;rat0;or;ta0;nt",
"Honorific|Noun": "true¦aRbNcGdFexcellency,field marEjudge,king,lCm9officOp5queen,r2s0taoiseach,vice4;e0ultJ;cretary,rgeaB;abbi,e0;ar0verend; adN;astGr0;eside6i0ofessF;me ministGnce0;!ss;a1is0;sus,tD;gistrate,r2yA;ady,ieutena0ord;nt;shE;oct6utcheA;aptain,hance4o0;lonel,mmand6n0rporBunci3;gress0stable;m0wom0;an;ll0;or;aron1rigadi0;er;!e0;ss;d0yatullah;mir0;al",
"Pronoun": "true¦'em,elle,h3i2me,she4th0us,we,you;e0ou;m,y;!l,t;e0im;!'s",
- "Singular": "true¦0:4I;1:59;2:58;3:4V;4:4T;5:4O;6:4S;7:52;8:4J;a4Sb47c3Ad2Xe2Qf2Gg25h1Tin1Qjel3k1Ol1Km1An17o13p0Mqu0Lr0CsTtJuGvCw9;a9ha3Com2C;f0i4Wt0Dy9;! arou4F;arn4GeAo9;cabula41l53;gKr9;di6t1K;nc35p2SrAs 9;do3Ss56;bani2in1; rex,aHeGhi8iEoDrBuAv9;! show;m2Jn5rntIto15;agedy,ib9o45;e,u2P;p5rq3E;c,de,er,m9;etD;am,mp3A;ct5le4x return;aQcOeNhMi2kKoJtEuBy9;ll9n28st4Q;ab2Q;bAnri1Bper bowl,r9;f0roga2;st3Etot1;aCepBipe3Ro1CrAudent9;! lo1L;ang0i8;fa1Gmo1G;ff0t31;loi42meo17;elet14i9;er,ll,rm3M;ack,or49;ab0Vcurity gu2E;e4ho9;l30ol;la33ndwi0J;av0XeChetor5iAo9;de4om;te,v9;erb0O;bCcBf9publ5r0Pspi2;er9orm0;e4r1;it1ord label;a2u42;estion mark,ot29;aMeKhJiHlFort1rAu9yram1D;ddi8ppy,rpo0K;eCie3Io9;bl3Vs9;pe6t9;a2itu2;diction,mi0Froga7ss relea0F;a9ebisci2;q28te,y0;cn5e9g;!r;armaci39otocoH;dest1ncil,r9t1;cen3Hsp3I;nAr2Ste9;!nt;el2Sop3;bj3EcApia2rde1thers,ve9wn0;n,rview;cu9e0G;pi0;aAit25ot9umb0;a26hi8;n2Arra7;aFeEiDoAu9é0H;m0Tr1;mAnopo3pRrni8sq1Qt9u14;h0i36;!my;li0Xn0A;d5nu,t1;mm1nAte9yf3;ri1;!d11;aurea2iBu9;ddi2n9;ch;ght bulb,p0C;ey9ittL;!no2;cAdices,itia7se6te4vert9;eb1L;en7ide4;aJeaFighDo9uman right,ygie10;le,meAsp1Jtb9;ed;! r9;un; scho12ri9;se;dAv9;en; start,pho9;ne;m,ndful,ze;aHeFirl1KlaQoErAu9;l3y;an9enadi0id;a16d9; slam,fa9mo9;th0;d,lf0;lat0Dntlem9;an;df3r9;l5n1D;aHeGiElDol3rAun9;er1;ee market,iAon9;ti0;e16ga2;ame,ow0u2;nan9ref3;ci0;lla,t14;br5mi3n0Uth0;conoEffDgg,lecto0MnCs1Xth5venBxAyel9;id;ampTempl0Ite4;i8t;er1K;e6i1J;my;adKeGiDoAr9u0P;agonf3i0;cAg1Fi3or,ssi0wn9;si0M;to0BumenB;ale6gniAnn0s9vide0O;conte4incen7tri6;ta0A;aBc1fAni1te9;c7rre4;ault 05err1;th;!dy;aXeVhOiNlLoDr9;edit cBit5uc9;ib9;le;ard;efficFke,lDmmuniqNnBpi0rr1t11u9yo2;ri0s9;in;ne6s9;ervatoVuI;ic,lQum9;ni0L;ie4;er9ie4;gy,ic;ty,vil wL;aDeqCocoBr9;istmas car9ysanthemum;ol;la2;ue;ndeli0racter9;ist5;ili8llDr9;e1tifica2;hi0naFpErCshi0t9ucus;erpi9hedr1;ll9;ar;bohyd9ri0;ra2;it1;ry;aPeOiMlemLoHrDu9;ddhiYnBr9tterf3;glar9i1;!y;ny;eakBiAo9;!th0;de;faRthroC;dy,g,roBwl,y9;!frie9;nd;ugh;ish;cyc9oH;liK;an,l3;nki8r9;!ri0;er;ng;cTdNllLnIppeti2rray,sFtBu9;nt,to9;psy;hAt5;ic;ie9le2;st;ce4pe6;ct;nt;ecAoma3tiA;ly;do2;er9y;gy; hominDjAvan9;tage;ec7;ti9;ve;em;cru1eAqui9;tt1;ta2;te;al",
+ "Singular": "true¦0:4I;1:5A;2:59;3:4W;4:4T;5:4O;6:4S;7:53;8:4J;a4Sb47c3Ad2Xe2Qf2Gg25h1Tin1Qjel3k1Ol1Km1An17o13p0Mqu0Lr0CsTtJuGvCw9x 52;a9ha3Com2C;f0i4Wt0Dy9;! arou4F;arn4GeAo9;cabula41l54;gKr9;di6t1K;nc35p2SrAs 9;do3Ss57;bani2in1; rex,aHeGhi8iEoDrBuAv9;! show;m2Jn5rntIto15;agedy,ib9o45;e,u2P;p5rq3E;c,de,er,m9;etD;am,mp3A;ct5le4x return;aQcOeNhMi2kKoJtEuBy9;ll9n28st4R;ab2Q;bAnri1Bper bowl,r9;f0roga2;st3Etot1;aCepBipe3Ro1CrAudent9;! lo1L;ang0i8;fa1Gmo1G;ff0t31;loi42meo17;elet14i9;er,ll,rm3M;ack,or4A;ab0Vcurity gu2E;e4ho9;l30ol;la33ndwi0J;av0XeChetor5iAo9;de4om;te,v9;erb0O;bCcBf9publ5r0Pspi2;er9orm0;e4r1;it1ord label;a2u43;estion mark,ot29;aMeKhJiHlFort1rAu9yram1D;ddi8ppy,rpo0K;eCie3Io9;bl3Ws9;pe6t9;a2itu2;diction,mi0Froga7ss relea0F;a9ebisci2;q28te,y0;cn5e9g;!r;armaci39otocoH;dest1ncil,r9t1;cen3Isp3J;nAr2Ste9;!nt;el2Sop3;bj3FcApia2rde1thers,ve9wn0;n,rview;cu9e0G;pi0;aAit25ot9umb0;a26hi8;n2Arra7;aFeEiDoAu9é0H;m0Tr1;mAnopo3pRrni8sq1Qt9u14;h0i37;!my;li0Xn0A;d5nu,t1;mm1nAte9yf3;ri1;!d11;aurea2iBu9;ddi2n9;ch;ght bulb,p0C;ey9ittL;!no2;cAdices,itia7se6te4vert9;eb1L;en7ide4;aJeaFighDo9uman right,ygie10;le,meAsp1Jtb9;ed;! r9;un; scho12ri9;se;dAv9;en; start,pho9;ne;m,ndful,ze;aHeFirl1KlaQoErAu9;l3y;an9enadi0id;a16d9; slam,fa9mo9;th0;d,lf0;lat0Dntlem9;an;df3r9;l5n1D;aHeGiElDol3rAun9;er1;ee market,iAon9;ti0;e16ga2;ame,ow0u2;nan9ref3;ci0;lla,t14;br5mi3n0Uth0;conoEffDgg,lecto0MnCs1Yth5venBxAyel9;id;ampTempl0Ite4;i8t;er1L;e6i1K;my;adKeGiDoAr9u0P;agonf3i0;cAg1Gi3or,ssi0wn9;si0M;to0BumenB;ale6gniAnn0s9vide0O;conte4incen7tri6;ta0A;aBc1fAni1te9;c7rre4;ault 05err1;th;!dy;aXeVhOiNlLoDr9;edit cBit5uc9;ib9;le;ard;efficFke,lDmmuniqNnBpi0rr1t12u9yo2;ri0s9;in;ne6s9;ervatoVuI;ic,lQum9;ni0L;ie4;er9ie4;gy,ic;ty,vil wL;aDeqCocoBr9;istmas car9ysanthemum;ol;la2;ue;ndeli0racter9;ist5;ili8llDr9;e1tifica2;hi0naFpErCshi0t9ucus;erpi9hedr1;ll9;ar;bohyd9ri0;ra2;it1;ry;aPeOiMlemLoHrDu9;ddhiYnBr9tterf3;glar9i1;!y;ny;eakBiAo9;!th0;de;faRthroC;dy,g,roBwl,y9;!frie9;nd;ugh;ish;cyc9oH;liK;an,l3;nki8r9;!ri0;er;ng;cUdOllMnJppeti2rIsFtBu9;nt,to9;psy;hAt5;ic;ie9le2;st;ce4pe6;ct;nt;ray;ecAoma3tiA;ly;do2;er9y;gy; hominDjAvan9;tage;ec7;ti9;ve;em;cru1eAqui9;tt1;ta2;te;al",
"Preposition": "true¦-,aMbJcIdHexcept,fFinEmid,notwithstandiSoCpTqua,sBt7u4v2w0;/o,hereOith0;! whEin,oS;ersus,i0;a,s-a-vis;n1p0;!on;like,til;h0ill,owards;an,r0;ough0u;!oJ;ans,ince,o that,uch D;f0n1ut;!f;!to;or,r0;om;espite,own,u3;hez,irca;ar1e0oAy;sides,tween;ri6;bo7cross,ft6lo5m3propos,round,s1t0;!op;! long 0;as;id0ong0;!st;ng;er;ut",
"SportsTeam": "true¦0:1A;1:1H;2:1G;a1Eb16c0Td0Kfc dallas,g0Ihouston 0Hindiana0Gjacksonville jagua0k0El0Bm01newToQpJqueens parkIreal salt lake,sAt5utah jazz,vancouver whitecaps,w3yW;ashington 3est ham0Rh10;natio1Oredski2wizar0W;ampa bay 6e5o3;ronto 3ttenham hotspur;blue ja0Mrapto0;nnessee tita2xasC;buccanee0ra0K;a7eattle 5heffield0Kporting kansas0Wt3;. louis 3oke0V;c1Frams;marine0s3;eah15ounG;cramento Rn 3;antonio spu0diego 3francisco gJjose earthquak1;char08paA; ran07;a8h5ittsburgh 4ortland t3;imbe0rail blaze0;pirat1steele0;il3oenix su2;adelphia 3li1;eagl1philNunE;dr1;akland 3klahoma city thunder,rlando magic;athle0Mrai3;de0; 3castle01;england 7orleans 6york 3;city fc,g4je0FknXme0Fred bul0Yy3;anke1;ian0D;pelica2sain0C;patrio0Brevolut3;ion;anchester Be9i3ontreal impact;ami 7lwaukee b6nnesota 3;t4u0Fvi3;kings;imberwolv1wi2;rewe0uc0K;dolphi2heat,marli2;mphis grizz3ts;li1;cXu08;a4eicesterVos angeles 3;clippe0dodDla9; galaxy,ke0;ansas city 3nE;chiefs,roya0E; pace0polis colU;astr06dynamo,rockeTtexa2;olden state warrio0reen bay pac3;ke0;.c.Aallas 7e3i05od5;nver 5troit 3;lio2pisto2ti3;ge0;broncZnuggeM;cowbo4maver3;ic00;ys; uQ;arCelKh8incinnati 6leveland 5ol3;orado r3umbus crew sc;api5ocki1;brow2cavalie0india2;bengaWre3;ds;arlotte horAicago 3;b4cubs,fire,wh3;iteB;ea0ulR;diff3olina panthe0; c3;ity;altimore 9lackburn rove0oston 5rooklyn 3uffalo bilN;ne3;ts;cel4red3; sox;tics;rs;oriol1rave2;rizona Ast8tlanta 3;brav1falco2h4u3;nited;aw9;ns;es;on villa,r3;os;c5di3;amondbac3;ks;ardi3;na3;ls",
- "Uncountable": "true¦0:2T;1:20;a2Gb27c1Xd1Oe1Gf1Ag13h0Wi0Pj0Ok0Nl0Im08n06o05pZrUsIt8v6w2;a4i3oo2;d,l;ldlife,ne;rm7t25;ernacul1Ui2;neg1Tol0Otae;eAh8oothpas1Nr3un2yranny;a,gst1V;aff29ea18o3ue nor2;th;oZu2;ble2se1Ft;!shoot1X;er2und1V;e,mod2B;a,nnis;aBcene0IeAh9il8ki7o6p5t3u2weepstak1;g1Hnshi11;ati01e2;am,el;ace23eci1;ap,cc1N;n,ttl1;k,v1L;eep,ingl1;na14ri1;d0Nfe1Vl2nd,t0B;m1Kt;a5e3ic2;e,ke0V;c2laxa0Ssearch;ogni0Rrea0R;bi1in;aVe6hys0last1Ko4re2;amble,mis1s2ten1K;en1Jsu0C;l2rk;it0yB;a1Otr06;bstetr0vercrowd16xyg0Z;a2ews;il polWtional securi1G;a9e7o4u2;m2s1A;ps;n2o19;ey,o2;gamy;a2chan0rchandi16tallurgy;sl1t;chine2themat0; learn0Ury;aught0Se5i4ogi3u2;ck,g0W;c,st0;ce,ghtn0Qngui19teraRv0P;ath0OisuRss;ara08indergart0Hnowled0T;azz,ewelC;ce,gnor7mp4n2;formaYter2;net,sta04;a2ort4;ti2;en0Y;an0X;a5eHisto4o2;ckey,mework,ne2rserad6spitali0Q;s0Py;ry;ir,libXppiFs2;h2te;ish;ene5l4o3r2um,ymna0R;aCeed;lf,re;utYyce0C; 2t0;edit03po2;ol;aLicElour,o4urni2;tu2;re;od,rgive2uriXwl;ne2;ss;conom0duca8lectr7n5quip6th0very3xper2;ti03;body,o2thT;ne;joy2tertain2;ment;ici01on0;tiQ;e8i5o3raugh2ynasZ;ts;pe,wnstai2;rs;abet1s2;honTrepu2;te;b2miP;ut;aAelci9h6iv0l4o2urrency;al,ld w2nfusiFral,ttFusco8;ar;ass0oth1;es;aos,e3ick2;en;eGw7;us;d,rI;a7eef,i5lood,read,u2;nt3tt2;er;ing;lliarDs2;on;g2ss;ga2;ge;cDdviCeroAir9m5ni4ppeal court,rithmet3spi2thlet0;rin;ic;se;en4n2;es2;ty;ds;craft;b0d2naut0;ynam0;ce;id,ou2;st0;ics",
- "Person|Noun": "true¦a04bYcVdOeMfLgJhGjCkitXlBm9olive,p6r3s2triniXv0wang;an,enus,iol0;a,et;ky,on5umm00;ay,e1o0uby;bin,d,se;ed,x;atNe0ol;aFn0;ny;a0eloQ;x,ya;a8eo,iD;a2e1o0;lDy;an,w3;de,smi4y;a0iKol8;ll,z0;el;ail,e0;ne;aith,ern,lo;a0dDmir,ula,ve;rl;a4e3i1ol0;ly;ck,x0;ie;an,ja;i0wn;sy;h0liff,rystal;ari0in,ristian;ty;ak4e3i2r0;an0ook;dy;ll;nedict,rg;er;l0rt;fredo,ma",
- "Noun|Gerund": "true¦0:25;1:24;2:1V;3:1H;4:1X;5:1N;a24b1Nc1Bd16en14f0Yg0Wh0Ti0Rjog1Zk0Pl0Lm0In0Go0Cp05ques08rWsGtBunderAvolunt15w6yDzo2;a8ed5i3or7r6;ap1Nest1Bi1;ki0r1N;i1r2s1Ttc1T;st1Mta4;al4e9hin4i8ra6y1J;c4di0i2v6;el15;mi0p1G;a1Xs1;ai12cIeHhFin1OkatDlZmo4nowCpeBt9u7w6;ea3im1T;f02r6;fi0vi0J;a1Kretc1Iu6;d1AfJ;l0Wn5;b7i0;eb6i0;oar5;ip14o6;rte2u1;a1r0At1;h7o3re6;a1Ge2;edu0Noo0N;aDe9i5o7u6;li0n2;o6wi0;fi0;a8c7hear1Cnde3por1struct6;r1Au3;or5yc0G;di0so2;p0Qti0;aBeacekAla9o7r6ublis0X;a0Peten5in1oces16;iso2si6;tio2;n2yi0;ee0K;cka0Tin1rt0K;f8pe7rgani6vula1;si0zi0;ni0ra1;fe3;e6ur0W;gotia1twor4;a7e6i2onito3;e1ssa0L;nufactu3rke1;a8ea7i6od0Jyi0;cen0Qf1s1;r2si0;n5ug0E;i6n0J;c4lS;ci0magi2n6ro2;nova1terac1;andPea1i7o6un1;l5wO;ki0ri0;athe3rie6ui5;vi0;ar0CenHi8l7or6ros1un5;ecas1mat1;ir1oo5;l7n6;anDdi0;i0li0;di0gin6;ee3;a8eba1irec1oub1r6umO;awi0es05i6;n4vi0;n6ti0;ci0;aFelebra1hDlBo8r6ur7;aw6os00;li0;a7di0lo3mplai2n6o4pi0ve3;duc1sul1;cMti0;apDea3imIo6ubI;ni0tK;a6ee3;n1t1;m9s1te3;ri0;aJeGitElDoBr9u6;il5ll7r6;pi0;yi0;an5;di0;a1m6o4;bi0;esHoa1;c6i0;hi0;gin2lon6t1;gi0;ni0;bys7c4ki0;ki0;it1;c9dverti8gi0rg7ssu6;mi0;ui0;si0;coun1ti0;ti0;ng",
+ "Uncountable": "true¦0:2T;1:28;2:20;a2Hb28c1Yd1Pe1Hf1Bg14h0Xi0Qj0Pk0Ol0Jm09n07o06p00rVsJt9v7w3;a5i4oo3;d,l;ldlife,ne;rm8t1;ernacul1Vi3;neg1Uol0Ptae;eBh9oothpas1Or4un3yranny;a,gst1W;aff2Aea19o4ue nor3;th;o00u3;ble3se1Gt;!shoot1Y;er3und1;e,mod2C;a,nnis;aCcene0JeBhAil9ki8o7p6t4u3weepstak2;g1Inshi12shi;ati02e3;am,el;ace24eci2;ap,cc1;n,ttl2;k,v1;eep,ingl2;na15ri2;d0Ofe1Wl3nd,t0C;m1Lt;a6e4ic3;e,ke0W;c3laxa0Tsearch;ogni0Srea0S;bi2in;aWe7hys0last1Lo5re3;amble,mis2s3ten1L;en1Ksu0D;l3rk;it0yC;a1Ptr07;bstetr0vercrowd17xyg10;a3ews;il polXtional securi1H;aAe8o5u3;m3s1B;ps;n3o1A;ey,o3;gamy;a3chan0rchandi17tallurgy;sl2t;chine3themat0; learn0Vry;aught1e6i5ogi4u3;ck,g0X;c,st0;ce,ghtn0Rngui1AteraSv1;ath1isuSss;ara09indergart0Inowled0U;azz,ewelD;ce,gnor8mp5n3;formaZter3;net,sta05;a3ort5;ti3;en0Z;an0Y;a6eIisto5o3ung1;ckey,mework,ne3rserad7spitali0R;s0Qy;ry;ir,libYppiGs3;h3te;ish;ene6l5o4r3um,ymna0S;aDeed;lf,re;utZyce0D; 3t0;edit04po3;ol;aMicFlour,o5urni3;tu3;re;od,rgive3uri1wl;ne3;ss;conom0duca9lectr8n6quip7th0very4xper3;ti04;body,o3thU;ne;joy3tertain3;ment;ici02on0;tiR;e9i6o4raugh3ynas00;ts;pe,wnstai3;rs;abet2s3;honUrepu3;te;b3miQ;ut;aBelciAh7iv0l5o3urrency;al,ld w3nfusiGral,ttGusco9;ar;ass0oth2;es;aos,e4ick3;en;eHw8;us;d,rJ;a8eef,i6lood,read,u3;nt4tt1;er;ing;lliarEs3;on;g3ss;ga3;ge;cEdviDeroBirAm6ni5ppeal court,rithmet4spi3thlet0;rin;ic;se;en5n3;es3;ty;ds;craft;b0d3naut0;ynam0;ce;id,ou3;st0;ics",
"Unit": "true¦a09b06cZdYexXfTgRhePin00joule0DkMlJmDnan0AoCp9quart0Dsq ft,t7volts,w6y2ze3°1µ0;g,s;c,f,n;dXear1o0;ttT; 0s 0;old;att06b;erPon0;!ne04;ascals,e1i0;cZnt02;rcent,tL;hms,uI;/s,e4i0m²,²,³;/h,cro2l0;e0liM;!²;grNsT;gEtL;it1u0;menSx;erRreR;b5elvins,ilo1m0notQ;/h,ph,²;!byIgrGmEs;ct0rtzN;aLogrE;allonLb0ig5rD;ps;a2emtGl0t6; oz,uid ou0;nceH;hrenheit,radG;aby9;eci3m1;aratDe1m0oulombD;²,³;lsius,nti0;gr2lit1m0;et0;er8;am7;b1y0;te5;l,ps;c2tt0;os0;econd1;re0;!s",
- "Adj|Noun": "true¦0:0T;a0Sb0Nc0Dde0Ce07f01g00homel09iYjuXlWmQnPoOpMrJsBt7u4va2w1;atershed,elcome;gabo4nilla,ria1;b0Ent;ndergr1pstairs;adua0Kou1;nd;a3e1oken,ri0;en,r1;min0ror0C;boo,n;e6ist00o4qua3ta2u1well;bordina0Dper6;b04ndard;re,t;cial06l1;e,ve0H;cret,n1ri0;ior;e1outiJubbish;ar,laVnt0p1;resentaUublican;atie0Beriodic0otenti0r1;emiOincip0;ffiYpposi01v0;agging,ovel;aRe4in3o1;biQdernUr1;al,t0;iature,or;di1tr04;an,um;attFiber0;stice,veniK;de0mpressionNn1;cumbeYdividu0noXstaY;enious,old;a4e2i1luid;ne;llow,m1;aDinH;t,vo1;riJuriJ;l3pRx1;c1ecu7pM;ess;d1iF;er;mographMriva3;hiDlassLo1rude;m4n2opera1;tive;cre9stitueHtemporary,vertab1;le;m2p1;anion,lex;er2un1;ist;ci0;lank,o4r1;i2u1;te;ef;ttom,urgeois;cadem6d3l2nim0rab;al;ert;oles1ult;ce1;nt;ic",
+ "Noun|Gerund": "true¦0:25;1:24;2:1V;3:1H;4:1X;5:1N;a24b1Nc1Bd16en14f0Yg0Wh0Ti0Rjog1Zk0Pl0Lm0In0Go0Cp05ques08rWsGtBunderAvolunt15w6yDzo2;a8ed5i3or7r6;ap1Nest1Bi1;ki0r1N;i1r2s1Ttc1T;st1Mta4;al4e9hin4i8ra6y1J;c4di0i2v6;el15;mi0p1G;a1Xs1;ai12cIeHhFin1OkatDlZmo4nowCpeBt9u7w6;ea3im1T;f02r6;fi0vi0J;a1Kretc1Iu6;d1AfJ;l0Wn5;b7i0;eb6i0;oar5;ip14o6;rte2u1;a1r0At1;h7o3re6;a1Ge2;edu0Noo0N;aDe9i5o7u6;li0n2;o6wi0;fi0;a8c7hear1Cnde3por1struct6;r1Au3;or5yc0G;di0so2;p0Qti0;aBeacekAla9o7r6ublis0X;a0Peten5in1oces16;iso2si6;tio2;n2yi0;ee0K;cka0Tin1rt0K;f8pe7rgani6vula1;si0zi0;ni0ra1;fe3;e6ur0W;gotia1twor4;a7e6i2onito3;e1ssa0L;nufactu3rke1;a8ea7i6od0Jyi0;cen0Qf1s1;r2si0;n5ug0E;i6n0J;c4lS;ci0magi2n6ro2;nova1terac1;andPea1i7o6un1;l5wO;ki0ri0;athe3rie6ui5;vi0;ar0CenHi8l7or6ros1un5;ecas1mat1;ir1oo5;l7n6;anDdi0;i0li0;di0gin6;ee3;a8eba1irec1oub1r6umO;awi0es05i6;n4vi0;n6ti0;ci0;aFelebra1hDlBo8r6ur7;aw6os00;li0;a7di0lo3mplai2n6o4pi0ve3;duc1sul1;cMti0;apDea3imIo6ubI;ni0tK;a6ee3;n1t1;m9s1te3;ri0;aJeGitElDoBr9u6;il5ll7r6;pi0;yi0;an5;di0;a1m6o4;bi0;esHoa1;c6i0;hi0;gin2lon6t1;gi0;ni0;bys7c4ki0;ki0;it1;c9dverti8gi0rg7ssu6;mi0;ui0;si0;coun1ti0;ti0;ng",
"ProperNoun": "true¦barbie,c4diego,e3f2kirby,m0nis,riel;ercedes,i0;ckey,ssy;inn,ranco;lmo,uro;atalina,hristi",
"Ordinal": "true¦eBf7nin5s3t0zeroE;enDhir1we0;lfCn7;d,t3;e0ixt8;cond,vent7;et0th;e6ie7;i2o0;r0urt3;tie4;ft1rst;ight0lev1;e0h,ie1;en0;th",
"Cardinal": "true¦bEeBf5mEnine7one,s4t0zero;en,h2rDw0;e0o;lve,n5;irt6ousands,ree;even2ix2;i3o0;r1ur0;!t2;ty;ft0ve;e2y;ight0lev1;!e0y;en;illions",
@@ -39,7 +37,7 @@ export default {
"City": "true¦0:6Y;1:5Y;2:6D;3:5R;4:5O;a65b50c4Fd45e41f3Tg3Eh36i2Xj2Sk2Bl20m1In18o15p0Tq0Rr0Ks01tPuOvLwDxiBy9z5;a7h5i4Juri4L;a5e5ongsh0;ng3E;greb,nzib5D;ang2e5okoha3Punfu;katerin3Erev0;a5n0N;m5En;arsBeAi6roclBu5;h0xi,zh5M;c7n5;d5nipeg,terth4;hoek,s1I;hi5Wkl37;l60xford;aw;a6ern2i5ladivost5Jolgogr6F;en3lni6M;lenc4Vncouv3Rr3ughn;lan bat1Brumqi,trecht;aDbilisi,eCheBi9o8r7u5;l1Zn60r5;in,ku;ipoli,ondh5Z;kyo,m2Zron1OulouS;an5jua3l2Umisoa69ra3;j4Ushui; hag60ssaloni2I;gucigal26hr0l av1U;briz,i6llinn,mpe57ng5rtu,shk2S;i3Fsh0;an,chu1n0p2Fyu0;aEeDh8kopje,owe1Gt7u5;ra5zh4Y;ba0Ht;aten is56ockholm,rasbou65uttga2W;an8e6i5;jiazhua1llo1m5Vy0;f51n5;ya1zh4I;gh3Lt4R;att46o1Wv45;cramen16int ClBn5o paulo,ppo3Srajevo; 7aa,t5;a 5o domin3F;a3fe,m1M;antonBdie3Dfrancisco,j5ped3Osalvad0K;o5u0;se;em,z26;lou57peters25;aAe9i7o5;me,sar5t58;io;ga,o5yadh;! de janei3F;cife,ykjavik;b4Sip4lei2Inc2Pwalpindi;ingdao,u5;ez2i0P;aEeDhCiBo8r7u6yong5;ya1;eb56ya1;ag50etor3M;rt5zn0; 5la4Do;au prin0Melizabe25sa04;ls3Qrae58tts27;iladelph3Hnom pe1Boenix;r22tah tik3F;lerZnaji,r4Nt5;na,r33;ak45des0Km1Nr6s5ttawa;a3Wlo;an,d06;a7ew5ing2Govosibir1Kyc; 5cast37;del25orlea45taip15;g8iro4Un5pl2Xshv34v0;ch6ji1t5;es,o1;a1o1;a6o5p4;ya;no,sa0X;aFeCi9o6u5;mb2Bni27sc3Z;gadishu,nt6s5;c14ul;evideo,re30;ami,l6n15s5;kolc,sissauga;an,waukee;cca,d5lbour2Nmph40ndo1D;an,ell5i3;in,ín;cau,drAkass2Sl9n8r5shh47;aca6ib5rakesh,se2L;or;i1Sy;a4BchEdal0Zi44;mo;id;aCeiAi8o6u5vRy2;anLckn0Odhia3;n5s angel26;d2g bea1N;brev2Be3Jma5nz,sb2verpo28;!ss27;c5pzig;est17; p6g5ho2Xn0Dusan25;os;az,la34;aHharFiClaipeBo9rak0Eu7y5;iv,o5;to;ala lump4n5;mi1sh0;hi0Ilka2Ypavog4si5wlo2;ce;da;ev,n5rkuk;gst2sha5;sa;k5toum;iv;bIdu3llakuric0Rmpa3Dn6ohsiu1ra5un1Jwaguc0R;c0Qj;d5o,p4;ah1Uy;a7e6i5ohannesW;l1Wn0;dd34rusalem;ip4k5;ar2I;bad0mph1PnBrkutVs8taYz5̇zm7;m6tapala5;pa;ir;fah0l6tanb5;ul;am2Wi2H;che2d5;ianap2Ko20;aAe7o5yder2T; chi mi5ms,nolulu;nh;f6lsin5rakli2;ki;ei;ifa,lifax,mCn5rb1Dva3;g8nov01oi;aFdanEenDhCiPlasgBo9raz,u5;a5jr23;dal6ng5yaquil;zh1J;aja2Lupe;ld coa1Athen5;bu2P;ow;ent;e0Uoa;sk;lw7n5za;dhi5gt1E;nag0U;ay;aisal26es,o8r6ukuya5;ma;ankfu5esno;rt;rt5sh0; wor6ale5;za;th;d5indhov0Pl paso;in5mont2;bur5;gh;aBe8ha0Xisp4o7resd0Lu5;b5esseldorf,rb0shanbe;ai,l0I;ha,nggu0rtmu13;hradSl6nv5troit;er;hi;donghIe6k09l5masc1Wr es sala1IugavpiY;i0lU;gu,je2;aJebu,hAleve0Vo5raio02uriti1N;lo7n6penhag0Ar5;do1Lk;akKst0V;gUm5;bo;aBen8i6ongqi1ristchur5;ch;ang m7ca5ttago1;go;g6n5;ai;du,zho1;ng5ttogr12;ch8sha,zh07;i9lga8mayenJn6pe town,r5;acCdiff;ber17c5;un;ry;ro;aVeNhKirmingh0UoJr9u5;chareSdapeSenos air7r5s0tu0;g5sa;as;es;a9is6usse5;ls;ba6t5;ol;ne;sil8tisla7zzav5;il5;le;va;ia;goZst2;op6ubaneshw5;ar;al;iBl9ng8r5;g6l5n;in;en;aluru,hazi;fa5grade,o horizonte;st;ji1rut;ghd09kGnAot9r7s6yan n4;ur;el,r05;celo3ranquil07;na;ou;du1g6ja lu5;ka;alo6k5;ok;re;ng;ers5u;field;a02bZccYddis abaXgartaWhmedUizawl,lQmNnHqaXrEsBt7uck5;la5;nd;he7l5;an5;ta;ns;h5unci2;dod,gab5;at;li5;ngt2;on;a6chora5kaLtwerp;ge;h7p5;ol5;is;eim;aravati,m0s5;terd5;am; 6buquerq5eppo,giers,maty;ue;basrah al qadim5mawsil al jadid5;ah;ab5;ad;la;ba;ra;idj0u dha5;bi;an;lbo6rh5;us;rg",
"Region": "true¦0:2N;1:2T;2:2K;a2Qb2Dc1Zd1Ues1Tf1Rg1Lh1Hi1Cj18k13l10m0Pn07o05pZqWrTsKtFuCv9w5y3zacatec2U;akut0o0Du3;cat2k07;a4est 3isconsin,yomi1M;bengal,vi6;rwick2Bshington3;! dc;er4i3;rgin0;acruz,mont;dmurt0t3;ah,tar3; 2La0X;a5e4laxca1Rripu1Xu3;scaDva;langa1nnessee,x2F;bas0Vm3smNtar25;aulip2Dil nadu;a8i6o4taf11u3ylh1F;ffYrr04s1A;me1Cno1Quth 3;cVdU;ber0c3kkim,naloa;hu2ily;n4skatchew2xo3;ny; luis potosi,ta catari1;a3hode9;j3ngp07;asth2shahi;ingh25u3;e3intana roo;bec,en5reta0R;ara7e5rince edward3unjab; i3;sl0B;i,nnsylv3rnambu0B;an0;!na;axa0Ydisha,h3klaho20ntar3reg6ss0Bx0G;io;aJeDo5u3;evo le3nav0W;on;r3tt17va scot0;f8mandy,th3; 3ampton16;c5d4yo3;rk14;ako1N;aroli1;olk;bras1Mva0Cw3; 4foundland3;! and labrador;brunswick,hamp0Xjers4mexiSyork3;! state;ey;galOyarit;a9eghala0Mi5o3;nta1r3;dov0elos;ch5dlanCn4ss3zor11;issippi,ouri;as geraOneso18;ig2oac2;dhy12harasht0Gine,ni4r3ssachusetts;anhao,i el,ylF;p3toba;ur;anca0Ie3incoln0IouisH;e3iR;ds;a5e4h3omi;aka06ul1;ntucky,ra01;bardino,lmyk0ns0Qr3;achay,el0nata0X;alis5har3iangxi;kh3;and;co;daho,llino6n3owa;d4gush3;et0;ia1;is;a5ert4i3un2;dalFm0D;fordZ;mpYrya1waii;ansu,eorg0lou7oa,u3;an4erre3izhou,jarat;ro;ajuato,gdo3;ng;cesterS;lori3uji2;da;sex;ageTe6o4uran3;go;rs3;et;lawaLrbyK;aEeaDh8o3rimea ,umbr0;ahui6l5nnectic4rsi3ventry;ca;ut;i02orado;la;e4hattisgarh,i3uvash0;apQhuahua;chn4rke3;ss0;ya;ra;lFm3;bridge6peche;a8ihar,r7u3;ck3ryat0;ingham3;shi3;re;emen,itish columb0;h0ja cal7lk6s3v6;hkorto3que;st2;an;ar0;iforn0;ia;dygea,guascalientes,lAndhr8r4ss3;am;izo1kans4un3;achal 6;as;na;a 3;pradesh;a5ber4t3;ai;ta;ba4s3;ka;ma",
"Country": "true¦0:39;1:2M;a2Xb2Ec22d1Ye1Sf1Mg1Ch1Ai14j12k0Zl0Um0Gn05om3DpZqat1KrXsKtCu6v4wal3yemTz2;a25imbabwe;es,lis and futu2Y;a2enezue32ietnam;nuatu,tican city;.5gTkraiZnited 3ruXs2zbeE;a,sr;arab emirat0Kkingdom,states2;! of am2Y;k.,s.2; 28a.;a7haBimor-les0Bo6rinidad4u2;nis0rk2valu;ey,me2Ys and caic1U; and 2-2;toba1K;go,kel0Znga;iw2Wji2nz2S;ki2U;aCcotl1eBi8lov7o5pa2Cri lanka,u4w2yr0;az2ed9itzerl1;il1;d2Rriname;lomon1Wmal0uth 2;afr2JkLsud2P;ak0en0;erra leoEn2;gapo1Xt maart2;en;negKrb0ychellY;int 2moa,n marino,udi arab0;hele25luc0mart20;epublic of ir0Dom2Duss0w2;an26;a3eHhilippinTitcairn1Lo2uerto riM;l1rtugE;ki2Cl3nama,pua new0Ura2;gu6;au,esti2;ne;aAe8i6or2;folk1Hth3w2;ay; k2ern mariana1C;or0N;caragua,ger2ue;!ia;p2ther19w zeal1;al;mib0u2;ru;a6exi5icro0Ao2yanm05;ldova,n2roc4zamb9;a3gol0t2;enegro,serrat;co;c9dagasc00l6r4urit3yot2;te;an0i15;shall0Wtin2;ique;a3div2i,ta;es;wi,ys0;ao,ed01;a5e4i2uxembourg;b2echtenste11thu1F;er0ya;ban0Hsotho;os,tv0;azakh1Ee3iriba03o2uwait,yrgyz1E;rWsovo;eling0Jnya;a2erF;ma15p1B;c6nd5r3s2taly,vory coast;le of m19rael;a2el1;n,q;ia,oI;el1;aiSon2ungary;dur0Mg kong;aAermany,ha0Pibralt9re7u2;a5ern4inea2ya0O;!-biss2;au;sey;deloupe,m,tema0P;e2na0M;ce,nl1;ar;bTmb0;a6i5r2;ance,ench 2;guia0Dpoly2;nes0;ji,nl1;lklandTroeT;ast tim6cu5gypt,l salv5ngl1quatorial3ritr4st2thiop0;on0; guin2;ea;ad2;or;enmark,jibou4ominica3r con2;go;!n B;ti;aAentral african 9h7o4roat0u3yprQzech2; 8ia;ba,racao;c3lo2morPngo-brazzaville,okFsta r03te d'ivoiK;mb0;osD;i2ristmasF;le,na;republic;m2naTpe verde,yman9;bod0ero2;on;aFeChut00o8r4u2;lgar0r2;kina faso,ma,undi;azil,itish 2unei;virgin2; is2;lands;liv0nai4snia and herzegoviGtswaGuvet2; isl1;and;re;l2n7rmuF;ar2gium,ize;us;h3ngladesh,rbad2;os;am3ra2;in;as;fghaFlCmAn5r3ustr2zerbaijH;al0ia;genti2men0uba;na;dorra,g4t2;arct6igua and barbu2;da;o2uil2;la;er2;ica;b2ger0;an0;ia;ni2;st2;an",
- "Place": "true¦aUbScOdNeMfLgHhGiEjfk,kClAm8new eng7ord,p5s4t2u1vostok,wake is7y0;akutCyz;laanbaatar,pO;ahiti,he 0;bronx,hamptons;akhalFfo,oho,under2yd;acifTek,h0itcairn;l,x;land;a0co,idHuc;gadRlibu,nhattR;a0gw,hr;s,x;osrae,rasnoyar0ul;sk;ax,cn,nd0st;ianKochina;arlem,kg,nd,ovd;ay village,re0;at 0enwich;brita0lakB;in;co,ra;urope,verglad8;en,fw,own2xb;dg,gk,h0lt;a1ina0uuk;town;morro,tham;cn,e0kk,rooklyn;l air,verly hills;frica,m7n2r3sia,tl1zor0;es;!ant2;adyr,tar0;ct0;ic0; oce0;an;ericas,s",
+ "Place": "true¦aVbTcPdOeNfMgIhHiFjfk,kDlBm9new eng8or7p5s4t2u1vostok,wake is8y0;akutDyz;laanbaatar,pP;ahiti,he 0;bronx,hamptons;akhalGfo,oho,under3yd;acifUek,h0itcairn;l,x;ange county,d;land;a0co,idHuc;gadRlibu,nhattR;a0gw,hr;s,x;osrae,rasnoyar0ul;sk;ax,cn,nd0st;ianKochina;arlem,kg,nd,ovd;ay village,re0;at 0enwich;brita0lakB;in;co,ra;urope,verglad8;en,fw,own2xb;dg,gk,h0lt;a1ina0uuk;town;morro,tham;cn,e0kk,rooklyn;l air,verly hills;frica,m7n2r3sia,tl1zor0;es;!ant2;adyr,tar0;ct0;ic0; oce0;an;ericas,s",
"WeekDay": "true¦fri2mon2s1t0wednesd3;hurs1ues1;aturd1und1;!d0;ay0;!s",
"Month": "true¦dec0february,july,nov0octo1sept0;em0;ber",
"Date": "true¦ago,t0week end,yesterd2;mr2o0;d0morrow;ay;!w",
@@ -49,18 +47,20 @@ export default {
"LastName": "true¦0:9G;1:9W;2:9O;3:9Y;4:9I;5:8L;6:9L;7:A1;8:9F;9:8A;A:78;B:6G;C:6K;a9Vb8Nc7Ld6Ye6Tf6Fg5Wh59i55j4Qk45l3Nm2Sn2Fo27p1Oquispe,r18s0Ft05vVwOxNyGzD;aytsAEhD;aDou,u;ng,o;aGeun81iDoshiAAun;!lD;diDmaz;rim,z;maDng;da,guc98mo6VsDzaA;aAhiA8;iao,u;aHeGiEoDright,u;jc8Tng;lDmm0nkl0sniewsA;liA2s3;b0iss,lt0;a5Tgn0lDtanabe;k0sh;aHeGiEoDukB;lk5roby5;dBllalDnogr2Zr10ss0val37;ba,obos;lasEsel7P;lGn dFrg8FsEzD;qu7;ily9Pqu7silj9P;en b35ijk,yk;enzue96verde;aLeix1KhHi2j6ka3IoGrFsui,uD;om50rD;c2n0un1;an,embl8UynisA;dor96lst31m4rr9th;at5Ni7NoD;mErD;are70laci65;ps3s0Z;hirBkah8Enaka;a01chXeUhQiNmKoItFuEvDzabo;en8Bobod34;ar7bot4lliv2zuA;aEein0oD;i68j3Myan8W;l6rm0;kol5lovy5re6Rsa,to,uD;ng,sa;iDy60;rn5tD;!h;l5ZmEnDrbu;at8gh;mo6Eo6K;aFeDimizu;hu,vchD;en7Duk;la,r17;gu8mDoh,pulve8Trra4S;jDyD;on5;evi6Giltz,miDneid0roed0ulz,warz;dEtD;!z;!t;ar42h6ito,lFnDr4saAto,v4;ch7d0AtDz;a4Pe,os;as,ihBm3Zo0Q;aOeNiKoGuEyD;a67oo,u;bio,iz,sD;so,u;bEc7Bdrigue57g03j73mDosevelt,ssi,ta7Nux,w3Z;a4Ce0O;ertsDins3;!on;bei0LcEes,vDzzo;as,e8;ci,hards3;ag2es,it0ut0y9;dFmEnDsmu7Zv5F;tan1;ir7os;ic,u;aSeLhJiGoErDut6;asad,if60ochazk1V;lishc23pDrti63u55we67;e2Tov48;cEe09nD;as,to;as61hl0;aDillips;k,m,n5L;de3AetIna,rGtD;ersErovDtersC;!a,ic;en,on;eDic,ry,ss3;i8ra,tz,z;ers;h71k,rk0tEvD;ic,l3T;el,t2O;bJconnor,g2ClGnei5QrEzD;demir,turk;ella3MtDwe5O;ega,iz;iDof6GsC;vDyn1E;ei8;aPri1;aLeJguy1iFoDune44ym2;rodahl,vDwak;ak3Uik5otn57;eEkolDlsCx3;ic,ov6X;ls1miD;!n1;ils3mD;co42ec;gy,kaEray2varD;ro;jiDmu8shiD;ma;aWcUeQiPoIuD;lGnFrDssoli5T;atDpTr68;i,ov4;oz,te4C;d0l0;h2lInr13o0GrEsDza0Y;er,s;aFeEiDoz5r3Ete4C;!n6F;au,i8no,t4N;!l9;i2Rl0;crac5Ohhail5kke3Qll0;hmeFij0j2FlEn2Xrci0ssiDyer19;!er;n0Io;dBti;cartDlaughl6;hy;dMe6Egnu5Fi0jer35kLmJnci5ArFtEyD;er,r;ei,ic,su1O;iEkBqu9roqu6tinD;ez,s;a55c,nD;!o;a53mD;ad5;e5Pin1;rig4Ps1;aSeMiIoGuEyD;!nch;k4nDo;d,gu;mbarDpe2Svr4;di;!nDu,yana1T;coln,dD;bDholm;erg;bed5UfeGhtFitn0kaEn6rDw2H;oy;!j;in1on1;bvDvD;re;iDmmy,rsCu,voie;ne,t12;aTennedy,h2iSlQnez48oJrGuEvar2woD;k,n;cerDmar59znets5;a,o2H;aDem0i31yeziu;sni3RvD;ch3W;bay4Grh0Ksk0UvaFwalDzl5;czDsA;yk;cFlD;!cDen3S;huk;!ev4ic,s;e6uiveD;rt;eff0l4mu8nnun1;hn,llFminsArEstra33to,ur,yDzl5;a,s0;j0HlsC;oe;aMenLha2Qim0RoEuD;ng,r4;e2KhFnErge2Ku2OvD;anB;es,ss3;anEnsD;en,on,t3;nesDsC;en,s1;ki27s1;cGkob3RnsDrv06;en,sD;enDon;!s;ks3obs1;brahimBglesi3Ake4Ll0DnoZoneFshikEto,vanoD;u,v4A;awa;scu;aPeIitchcock,jaltal6oFrist46uD;!aDb0gh9ynh;m2ng;a24dz4fEjga2Tk,rDx3B;ak0Yvat;er,fm3B;iGmingw3NnErD;nand7re8;dDriks1;ers3;kkiEnD;on1;la,n1;dz4g1lvoLmJnsCqIrr0SsFuEyD;as36es;g1ng;anEhiD;mo0Q;i,ov08;ue;alaD;in1;rs1;aNeorgMheorghe,iKjonJoGrEuDw3;o,staf2Utierr7zm2;ayDg4iffitVub0;li1H;lub3Rme0JnEodD;e,m2;calv9zale0H;aj,i;l,mDordaL;en7;iev3A;gnJlGmaFnd2Mo,rDs2Muthi0;cDza;ia;ge;eaElD;agh0i,o;no;e,on;ab0erLiHjeldsted,lor9oFriedm2uD;cDent9ji3E;hs;ntaDrt6st0urni0;na;lipEsD;ch0;ovD;!ic;hatBnanFrD;arDei8;a,i;deS;ov4;dGinste6riksCsDva0D;cob2YpDtra2W;inoza,osiL;en,s3;er,is3wards;aUeMiKjurhuJoHrisco0ZuEvorakD;!oQ;arte,boEmitru,rDt2U;and,ic;is;g2he0Imingu7n2Ord1AtD;to;us;aDmitr29ssanayake;s,z; GbnaFlEmirDrvis1Lvi,w2;!ov4;gado,ic;th;bo0groot,jo04lEsilDvri9;va;a cruz,e3uD;ca;hl,mcevsAnEt2EviD;d5es,s;ieDku1S;ls1;ki;a06e01hOiobNlarkMoFrD;ivDuz;elli;h1lHntGoFrDs26x;byn,reD;a,ia;ke,p0;i,rer0N;em2liD;ns;!e;anu;aLeIiu,oGriDuJwe;stD;eDiaD;ns1;i,ng,uFwDy;!dhury;!n,onEuD;ng;!g;kEnDpm2tterjee,v7;!d,g;ma,raboD;rty;bGl08ng4rD;eghetEnD;a,y;ti;an,ota0L;cer9lder3mpbeIrFstDvadi07;iDro;llo;doEt0uDvalho;so;so,zo;ll;es;a08eWhTiRlNoGrFyD;rne,tyD;qi;ank5iem,ooks,yant;gdan5nFruya,su,uchEyHziD;c,n5;ard;darDik;enD;ko;ov;aEondD;al;nco,zD;ev4;ancRshwD;as;a01oDuiy2;umDwmD;ik;ckNethov1gu,ktLnJrD;gGisFnD;ascoDds1;ni;ha;er,mD;ann;gtDit7nett;ss3;asD;hi;er,ham;b4ch,ez,hMiley,kk0nHrDu0;bEnDua;es,i0;ieDosa;ri;dDik;a8yopadhyD;ay;ra;er;k,ng;ic;cosZdYguilXkhtXlSnJrGsl2yD;aEd6;in;la;aEsl2;an;ujo,ya;dFgelD;ovD;!a;ersGov,reD;aDjL;ss1;en;en,on,s3;on;eksejGiyGmeiFvD;ar7es;ez;da;ev;ar;ams;ta",
"MaleName": "true¦0:DO;1:CP;2:D7;3:AK;4:CL;5:C0;6:CG;7:D3;8:BT;9:AS;A:95;B:DB;C:D4;D:BN;aCAbB8cA8d99e8Jf83g7Gh6Ti6Dj5Fk53l4Fm37n2Uo2Op2Gqu2Er1Ms12t0Gu0Fv08wUxTyJzE;aEor0;cEh9Kkaria,n0C;hFkE;!aC8;ar5VeC7;aMoGuE;sEu2LvBK;if,uf;nGsFusE;ouf,sE;ef;aEg;s,tE;an,h0;hli,nB9ssY;avi3ho4;aNeLiGoEyaBO;jcie88lfgang,odrow,utE;!er;lEnst1;bGey,fredBlE;aB0iE;am,e,s;e98ur;i,nde9sE;!l8t1;lFyE;l1ne;lEt3;a9Yy;aHiEladimir,ojte7V;cFha0kt68nceErgA6va0;!nt;e3Xt66;lentEn9T;inE;!e;ghBFlyss5Anax,sm0;aXeShOiMoIrGuFyE;!l3ro6s1;n7r5A;avAIeEist0oy,um0;ntAAv5Xy;bGd8SmEny;!as,mEoharu;aCCie,y;iAy;mEt5;!my,othy;adGeoFia0KomE;!as;!do8H;!de5;dHrE;en99rE;an98eEy;ll,n97;!dy;dgh,ha,iEnn3req,tsu4S;cAQka;aUcotSeQhMiKoIpenc3tEur1Xylve97zym1;anGeEua86;f0phBDvEwa85;e60ie;!islaw,l8;lom1uE;leyma6ta;dElAm1yabonga;!dhart75n8;aGeE;lErm0;d1t1;h7Lne,qu11un,wn,y6;aEbasti0k2Cl4Qrg4Nth,ymoAF;m5n;!tE;!ie,y;lFmEnti2Gq59ul;!ke5KmDu4;ik,vato7P;aZeVhe9WiRoIuFyE;an,ou;b7EdFf5pe7LssE;!elBJ;ol3Gy;an,bLc63dJel,geIh0landBmHnGry,sFyE;!ce;coe,s;!aA2nD;an,eo;l46r;er79g3n8olfo,riE;go;bDeAR;cEl8;ar6Jc6IhFkEo;!ey,ie,y;a8Wie;gFid,ubCyEza;an1KnZ;g9TiE;na9Ps;ch6Rfa4lImHndGpha4sFul,wi2IyE;an,mo6V;h7Km5;alAXol2Vy;iADon;f,ph;ent2inE;cy,t1;aJeHhilGier6UrE;aka18eE;m,st1;!ip,lip;dA5rcy,tE;ar,e3Fr1Z;b4Idra74tr6KulE;!o19;ctav3Ei3liv3m9Zndrej,rIsFtEum7wC;is,to;aFc7k7m0vE;al5T;ma;i,vM;aMeKiGoEu39;aEel,j5l0ma0r3J;h,m;cFg4i47kE;!au,h7Hola;holAkEolA;!olA;al,d,il,ls1vE;il8K;hom,tE;e,hE;anEy;!a4i4;a00eXiNoIuFyE;l2Hr1;hamFr6LstaE;fa,p55;ed,mI;di0Xe,hamGis2DntFsEussa;es,he;e,y;ad,ed,mE;ad,ed;cJgu4hai,kHlGnFtchE;!e9;a7Vik;house,o0Ct1;ae5Pe9NolE;aj;ah,hE;aFeE;al,l;el,l;hFlv2rE;le,ri9v2;di,met;ay0hUjd,ks2BlSmadXnRrLs1tGuricFxE;imilianBwe9;e,io;eHhFiAtEus,yA;!eo,hew,ia;eEis;us,w;j,o;cIio,kHlGqu6Zsha9tEv2;iEy;!m,n;in,on;el,oQus;!el91oPus;iHu4;achEcolm,ik;ai,y;amFdi,eEmoud;sh;adEm5H;ou;aXeRiPlo3AoLuFyE;le,nd1;cHiGkEth3uk;aEe;!s;gi,s,z;as,iaE;no;g0nn7CrenGuEv82we9;!iE;e,s;!zo;am,oE;n4r;a7Vevi,la4BnIonHst3thaGvE;eEi;nte;bo;!a6Eel;!ny;mGnFrEur55wr55;ry,s;ce,d1;ar,o4Y;aMeIhal7GiFristEu4Ky6J;i0o54;er0p,rE;k,ollE;os;en0iGnErmit,v3U;!dr3XnEt1;e18y;r,th;cp3j5m5Sna6OrFsp7them,uE;ri;im,l;a01eViToHuE;an,lEst2;en,iE;an,en,o,us;aOeMhnLkubAnJrHsE;eFhEi7Vue;!ua;!ph;dEge;i,on;!aEny;h,s,th55;!ath54ie,nD;!l,sEy;ph;o,qu2;an,mE;!mD;d,ffHrEs5;a5YemFmai6oEry;me,ni0Y;i7Fy;!e5OrE;ey,y;cLdCkJmIrGsFvi3yE;dCs1;on,p3;ed,od,rEv4V;e5Bod;al,es4Mis1;a,e,oEub;b,v;ob,quE;es;aXbRchiQgOkeNlija,nuMonut,rKsGtEv0;ai,suE;ki;aFha0i6ZmaEsac;el,il;ac,iaE;h,s;a,vinEw2;!g;k,nngu5F;!r;nacEor;io;ka;ai,rahE;im;aQeKoJuEyd7;be2FgHmber4KsE;eyFsE;a2e2;in,n;h,o;m3ra36sse2wa40;aIctHitHnrFrE;be28m0;iEy;!q0Z;or;th;bMlLmza,nKo,rGsFyE;a47dC;an,s0;lGo4Nry,uEv8;hi44ki,tE;a,o;an,ey;k,s;!im;ib;aWeSiQlenPoMrIuE;ilFsE;!tavo;herme,lerE;mo;aGegEov3;!g,orE;io,y;dy,h5J;nzaFrE;an,d1;lo;!n;lbe4Xno,oE;rg37van4X;oGrE;aEry;ld,rdB;ffr8rge;brFlCrEv2;la14r3Hth,y;e33ielE;!i5;aSePiNlLorrest,rE;anFedEitz;!dDer11r11;cGkE;!ie,lE;in,yn;esLisE;!co,z2W;etch3oE;yd;d4lEonn;ip;deriFliEng,rnan05;pe,x;co;bi0di,hd;dYfrXit0lSmLnIo2rGsteb0th0uge6vEymCzra;an,eE;ns,re2X;gi,i0AnErol,v2w2;estBie;oFriqEzo;ue;ch;aJerIiFmE;aIe2Q;lErh0;!iE;o,s;s1y;nu4;be0Bd1iGliFm3t1viEwood;n,s;ot1Ss;!as,j4EsE;ha;a2en;!d2Vg7mHoFuFwE;a26in;arE;do;oWuW;a02eRiPoHrag0uGwFylE;an,l0;ay6ight;a6dl8nc0st2;minHnFri0ugEvydAy29;!lA;!a2HnEov0;e9ie,y;go,iFykA;as;cEk;!k;armuEll1on,rk;id;andNj0lbeMmetri5nKon,rIsGvFwExt3;ay6ey;en,in;hawn,moE;nd;ek,rE;ick;is,nE;is,y;rt;re;an,le,mLnKrGvE;e,iE;!d;en,iGne9rEyl;eEin,yl;l35n;n,o,us;!i4ny;iEon;an,en,on;a08e06hYiar0lOoJrHuFyrE;il,us;rtE;!is;aEistob0S;ig;dy,lHnFrE;ey,neli5y;or,rE;ad;by,e,in,l2t1;aIeGiEyK;fEnt;fo0Et1;meEt5;nt;rGuFyE;!t1;de;enE;ce;aIeGrisE;!toE;ph3;st3;er;d,rEs;b4leE;s,y;cEdric,s7;il;lHmer1rE;ey,lFro9y;ll;!os,t1;eb,v2;a07eZiVlaUoSrFuEyr1;ddy,rtL;aMeHiGuFyE;an,ce,on;ce,no;an,ce;nFtE;!t;dFtE;!on;an,on;dFndE;en,on;!foEl8y;rd;bby,rEyd;is;i6ke;bGlFshE;al;al,lD;ek;nIrEshoi;at,nFtE;!r1B;aEie;rdB;!iFjam2nD;ie,y;to;kaNlazs,nIrE;n8rEt;eEy;tt;ey;dEeF;ar,iE;le;ar16b0Ud0Qf0Ogust2hm0Li0Ija0Hl03mZnSputsiRrIsaHugust5veFyEziz;a0kh0;ry;us;hi;aLchKiJjun,maInGon,tEy0;hEu09;ur;av,oE;ld;an,ndB;!el,ki;ie;ta;aq;as,dIgelBtE;hony,oE;i6nE;!iBy;ne;er,reEy;!as,i,s,w;iGmaEos;nu4r;el;ne,r,t;an,beQdCeKfIi,lHonGphYt1vE;aOin;on;so,zo;an,en;onUrE;ed;c,jaHksandGssaHxE;!andE;er,ru;ar,er;ndE;ro;rtB;ni;dCm7;ar;en;ad,eE;d,t;in;onE;so;aFi,olfBri0vik;!o;mEn;!a;dIeHraFuE;!bakr,lfazl;hEm;am;!l;allJelGoulaye,ulE;!lErG;ah,o;! rE;ahm0;an;ah;av,on",
"Person": "true¦ashton kutchUbTcOdMeKgastPhIinez,jHkGleFmDnettLoCpAr5s4t2va1w0;arrDoode;lentino rossi,n go4;a0heresa may,iger woods,yra banks;tum,ylor;addam hussain,carlett johanssKlobodan milosevic;ay romano,e3o1ush limbau0;gh;d stewart,nald0;inho,o;ese witherspoFilly;a0ipJ;lmIris hiltD;prah winfrFra;essia0itt romnEubarek;en;bron james,e;anye west,endall,iefer sutherland,obe bryant;aime,effers7k rowling;a0itlBulk hogan;lle berry,rris5;ff0meril lagasse,zekiel;ie;a0enzel washingt2ick wolf;lt1nte;ar1lint0;on;dinal wols1son0;! palm2;ey;arack obama,rock;er",
- "Adjective": "true¦0:95;1:80;2:7X;3:8W;4:8Q;5:6E;6:81;7:86;8:8R;9:8D;A:5W;a7Mb77c6Pd67e5Qf58g50h4Pi3Rjuni44k3Pl3Fm33n2To2Ep1Wquart63r1Ls0Rt0JuMvIwBye1J;ast54eFholeEiDoB;man5oBrthwhi6u0F;d7Hzy;despr8Fs6E;!sa6;ather13eBll o5Jste2Q;!k5;aDeCiBola5D;b95ce versa,gi2Q;ng4Vrsa5B;ca0lu54;lt06nHpDrCsBttermo8X;ef75u4;b67ge0; Db2ApCsBti7Y;ca6et,ide dO;er,i4L;f3Tto da3;aWbecom2cVdPeOfNiMknLmKpJrGsCtoFus1wB;a06iel4E;e6Zi2FoDpCuB;pervis1spect2;e0ok6X;ld;eBu5;cognQgul0LlBsolv1;at1ent2;a9recedeY;arri1et;own;que,vers4;air,orese6O;mploy1nd2xpect1;eBue;cid1rB;!a6RcovAly2sDwB;aBei7C;tAy;iz1to43;heck1onvinc2;ppeal2ssum2tteCuthorB;iz1;nd1;i3Gra;aGeDhough59ip 1PoCrB;anspa6Yi3;gethAle83rp9;ena6FmpCrB;r3Ftia6P;e8o6N;leBst3Q;nt1;a03c01eZhYiWkiVmug,nobb3ZoPpMqueam3ZtGuBymb70;bDi generis,pBr5;erBre1O;! dupAb,viX;du1sBurb50;eq73tanda7P;atu69eFi0UrByl3T;aBin4D;ightBy; fBfB;or5X;adfa7Hri6;arCeBirit1lend9ot on;c2Ye34;k5se; caGlub6mbAphisticFrEuCvB;erei5Iiet;ndBth0X;pro6F;d9ry;at1;ll1;g1WnB;ce57g6;am30eA;at1co1Hem5lf3AnBre7;so5V;ath2holBient2K;ar5;cr1me,tisfac5M;aJeEheumato9iCoB;bu6Xtt58y4;ghtBv4;-w2f54;bYcEdu6OlDnown1sBtard1;is3DoB;lu3na0;e1Buc3B;e0ondi3;b9ciB;al,st;aNeLicayu7laKopuli6NrCuB;bl5Vnjabi;eGiEoB;!b2QfCmi3BpBv4Vxi1Z;er,ort60;a7u63;maBor,sti7va3;!ry;ci60exist2mBpa9;a1Oi63;c9id;ac28rBti3;fe67ma32ti32v5V;i28rCsB;s5Qt;allCtB;-ti05i4;el;bMffKkJld InGrFthAutEverB;!aCni58seas,t,wB;ei57rou57;ll;do0Wer;d2Ug1M; bBbBgo2li7;oa60;fashion1school;!ay; gua5XbBli7;eat;eCsB;ce7er0Co0R;dia0se;aJeIiHoBuanc1;nDrthBt1V;!eB;rn;chaCdescri5Lprof29sB;top;la0;ght5;arby,cessa4Bighbor5xt;k1usiat2;aIeHinGoCuB;d14ltip6;deDl13nBot,st;ochroBth5;me;rn,st;dblRi;nac2re;cDgenta,in,j03keshift,mmCnBscu4E;da3Uy;ali2Ioth;ab37ho;aJeGiEoCuB;mber2sh;ngBut19;stand2term;ghtwei44teraB;l,te;ft-w2gBssAth4;al,eBi0B;nda3P;ngu9ps1st;aput,ind5nB;ow2;gno4Xll03mVnDpso 25rB;a3releB;va0; QaPcoMdJe2AfIhibi3CiWnHoGsDtBvalu0V;a4KeB;n48rdep1U;a7igColBuboD;ub6ve0;nifica0;rdi41;a3er;eriCluenOreq3X;eCiEoB;or;fini3p1Ltermi3W;mpCnside8rB;re48;le3;ccu8deq3Xppr36;fBsitu,vitro;ro0;mFpB;arDeCl0SoBropA;li3r0P;nd2rfe40;ti4;aCeBi0T;d2Yn3M;tu22;egCiB;c0Lte8;al,iB;tiB;ma3;aIelHiFoCumB;a7dr3I;me ma2BnCrrBs04ur5;if30;e3Qo2I;ghfalut1LspB;an2X;lUpf1W;lCnBrdZtI;dy;f,low1;aiHener2Siga25lob4oGraDuB;ilBng ho;ty;cCtB;ef1Ois;ef1N;od;nf1L;aPeMinLlJoErB;aCeBoz1L;q2Ptf1I;gi6nt2H;olErB; keeps,eBge0FmAtu2Owa38;go2i1BseeB;ab6;ish;ag37uB;e0oresce0;al,i3;dCmini7rB;ti6; up;bl1i0l2Hmiliar,r Bux;oBreach2;ff;aOfficie0lMmJnHqu4re2Pthere4veryday,xB;a2Oem2RplEquisi3traDuB;be2WlB;ta0;!va1G;icB;it; Bti0O;rou3sui3;erCiB;ne0;ge0;dBe18;er5;gAsB;t,ygo2;er;aQeHiCoBrea15ue;mina0ne,rma0ubK;dact1Jfficult,m,sCverB;ge0se;creCeJjoi0pa8tB;a0in23;et,te; IadpHceGfiFgene8liDpCreli21spe8voB;id,ut;ende0;ca3ghB;tf0A;a0ni3;as1;an;facto;i5ngeroX;ly;arRePivil,oErCuB;nn2stoma0M;aBu0Iystal0Y;v02z1;erKgniza0loJmInDrCveB;rt;po8ru1N;cEduHgr13jDsCtraB;dic09ry;eq11ta0;oi0ug4;a0Vi14;mensu8pass0Z;ni4ss4;ci0S;leba3rtaB;in;diac,efM;aMeFizarEliKoCrBuck nak1;and new,isk,on1F;gBldface,na fiT;us;re;autifGhiFloEnCsByoF;iPt;eUiBt;gn;v1w;nd;ul;ckCnkru0ZrrB;en;!wards; priori,b0Qc0Nd0Gf0Ag08h07l00mp6ntiquXpRrLsleep,ttracti09uHvEwB;aCkB;wa0X;ke,re;ant garCeraB;ge;de;diDtB;heBoimmu7;ntX;toG;bitEchiv4roDtiB;fiB;ci4;ga0;raB;ry;pBt;aEetiz2rB;oprB;ia3;ing;re0;at1e;ed;le;cohFiJkaDl,oCriBterP;ght;of;li7;ne;olB;ic;ead;ainZed,gressiB;ve;fCra9;id;ectClB;ue0;ioB;na3; FeDvB;erB;se;pt,qB;ua3;hoc,infinitB;um;cu8tu4u3;al;ra3;erMlKoIrFsCuB;nda0;e0olu3traB;ct;te;eaCuB;pt;st;aBve;rd;aBe;ze;ra0;nt",
+ "Adjective": "true¦0:98;1:83;2:80;3:8Z;4:8T;5:6H;6:84;7:89;8:8U;9:8G;A:5Z;B:8Y;a7Qb7Bc6Td6Be5Tf5Ag52h4Ri3Tjuni46k3Rl3Hm35n2Vo2Gp1Yquart66r1Ns0St0KuNvJwCye1L;ast56eGholeFiEoC;man5oCrthwhi6u0G;d7Lzy;despr8Js6I;!sa6;ather14eCll o5Mste2S;!k5;aEeDiCola5G;b99ce versa,gi2S;ng4Xrsa5E;ca0lu56;lt07nIpErDsCttermo91;ef79u4;b6Bge0; Eb2CpDsCti82;ca6et,ide dP;er,i4N;f3Vto da3;aXbecom2cWdQePfOiNknMmLpKrHsDtoGus1wC;a07iel4G;e73i2HoEpDuC;pervis1spect2;e0ok71;ld;eCu5;cognRgul0MlCsolv1;at1ent2;a9recedeZ;arri1et;own;que,vers4;air,orese6S;mploy1nd2xpect1;eCue;cid1rC;!a6VcovAly2sEwC;aCei7G;tAy;iz1to45;heck1onvinc2;ppeal2ssum2tteDuthorC;iz1;nd1;i3Ira;aHeEhough5Dip 1RoDrC;anspa72i3;gethAle87p notch,rp9;ena6JmpDrC;r3Htia6T;e8o6R;leCst3S;nt1;a05c03e00hZiXkiWmug,nobbi42oQpNqueami42tHuCymb74;bEi generis,pCr5;erCre1Q;! dupAb,viY;du1sCurb54;eq77tanda7T;atu6DeGi0WrCy3V;aCin4G;ightCy; fCfC;or61;adfa7Lri6;arDeCirit1lend9ot on;c30e36;k5se; caHlub6mbAphisticGrFuDvC;erei5Miet;ndCth0Z;pro6J;d9ry;at1;ll1;g1YnC;ce5Bg6;am32eA;at1co1Jem5lfDnCre7;so5Z; suf3Zi3B;ath2holCient2L;ar5;cr1me,tisfac5P;aKeFheumato9iDoC;bu70tt5By4;ghtCv4;-w2f57;bZcFdu6RlEnown1sCtard1;is3FoC;lu3na0;e1Cuc3D;e0ondi3;b9ciC;al,st;aOeMicayu7laLopuli6QrDuC;bl5Ynjabi;eHiFoC;!b2RfDmi3DpCv4Yxi20;er,ort63;a7u66;maCor,sti7va3;!ry;ci63exist2mCpa9;a1Pi66;c9id;ac29rCti3;feBma34ti34v5Y;i29rDsC;s5Tt;allDtC;-ti06i4;el;bNffLkKld JnHrGthAutFverC;!aDni5Bseas,t,wC;ei5Arou5A;ll;do0Xer;d2Wg1N; bCbCgo2li7;oa63;fashion1school;!ay; gua60bCli7;eat;eDsC;ce7er0Do0S;dia0se;aKeJiIoCuanc1;nErthCt1W;!eC;rn;chaDdescri5Oprof2BsC;top;la0;ght5;arby,cessa4Eighbor5xt;k1usiat2;aJeIinHoDuC;d15ltip6;deEl14nCot,st;ochroCth5;me;rn,st;dblSi;nac2re;cEgenta,in,j04keshift,mmDnCscu4H;da3Xy;ali2Loth;ab3Aho;aKeHiFoDuC;mber2sh;ngCuti1B;stand2term;ghtwei47teraC;l,te;ft-w2gCssAth4;al,eCi0C;nda3S;ngu9ps1st;aput,ind5nC;ow2;gno50ll04mWnEpso 28rC;a3releC;va0; RaQcoNdKe2DfJhibi3FiXnIoHsEtCvalu0W;aBeC;n4Brdep1X;a7igDolCuboE;ub6ve0;nifica0;rdi44;a3er;eriDluenPreq40;eDiFoC;or;fini3p1Otermi3Z;mpDnside8rC;reB;le3;ccu8deq40ppr39;fCsitu,vitro;ro0;mGpC;arEeDl0UoCropA;li3r0R;nd2rfeB;ti4;aDeCi0V;d31n3P;tu25;egDiC;c0Nte8;al,iC;tiC;ma3;aJelIiGoDumC;a7dr3L;me ma2EnDrrCs06ur5;if33;e3To2L;ghfalut1OspC;an30;liWpf1Z;lDnCrd01tJ;dy;f,low1;aiIener2Viga28lob4oHraEuC;ilCng ho;ty;cDtC;ef1Ris;ef1Q;od;nf1O;aReOinNlLoFrC;aDeCoz1O;q2Stf1L;gi6nt2K;oFrC; keeps,eCge0ImAtu2Rwa3B;go2i1EseeC;ab6;liC;sh;ag39uC;e0oresce0;al,i3;dDmini7rC;ti6; up;bl1i0l2Jmiliar,r Cux;oCreach2;ff;aQfPlNmKnIqu4reBthere4veryday,xC;aBem2TplFquisi3traEuC;be2YlC;ta0;!va1I;icC;it; Cti0Q;rou3sui3;erDiC;ne0;ge0;dCe1A;er5;ficie0;gAsC;t,ygo2;er;aReIiDoCrea16ue;mina0ne,rma0ubL;dact1Kfficult,m,sDverC;ge0se;creDeKjoi0pa8tC;a0inB;et,te; JadpIceHfiGgene8liEpDreliBspe8voC;id,ut;ende0;ca3ghC;tf0B;a0ni3;as1;an;facto;i5ngeroY;ly;arSeQivil,oFrDuC;nn2stoma0N;aCu0Jystal0Z;v03z1;erLgniza0loKmJnErDveC;rt;po8ru1O;cFduIgr14jEsDtraC;dic0Ary;eq12ta0;oi0ug4;a0Wi15;mensu8pass10;ni4ss4;ci0T;leba3rtaC;in;diac,efN;aNeGizarFliLoDrCuck nak1;and new,isk,on1G;gCldface,na fiU;us;re;autifHhiGloFnDsCyoG;iQt;eViCt;gn;v1w;nd;ul;ckDnkru10rrC;en;!wards; priori,b0Rc0Od0Hf0Bg09h08l01mp6ntiquYpSrMsleep,ttracti0AuIvFwC;aDkC;wa0Y;ke,re;ant garDeraC;ge;de;diEtC;heCoimmu7;ntY;toH;bitFchiv4roEtiC;fiC;ci4;ga0;raC;ry;pCt;aFetiz2rC;oprC;ia3;ing;re0;at1e;ed;le;cohGiKkaEl,oDriCterQ;ght;of;li7;ne;olC;ic;ead;ain00ed,gressiC;ve;fDra9;id;ectDlC;ue0;ioC;na3; GeEvC;erC;se;pt,qC;ua3;hoc,infinitC;um;cu8tu4u3;al;ra3;erNlLoJrGsDuC;nda0;e0olu3traB;ct;te;eaDuC;pt;st;aCve;rd;aCe;ze;ra0;nt",
+ "Adj|Noun": "true¦0:0T;a0Sb0Nc0Dde0Ce07f01g00homel09iYjuXlWmQnPoOpMrJsBt7u4va2w1;atershed,elcome;gabo4nilla,ria1;b0Ent;ndergr1pstairs;adua0Kou1;nd;a3e1oken,ri0;en,r1;min0ror0C;boo,n;e6ist00o4qua3ta2u1well;bordina0Dper6;b04ndard;re,t;cial06l1;e,ve0H;cret,n1ri0;ior;e1outiJubbish;ar,laVnt0p1;resentaUublican;atie0Beriodic0otenti0r1;emiOincip0;ffiYpposi01v0;agging,ovel;aRe4in3o1;biQdernUr1;al,t0;iature,or;di1tr04;an,um;attFiber0;stice,veniK;de0mpressionNn1;cumbeYdividu0noXstaY;enious,old;a4e2i1luid;ne;llow,m1;aDinH;t,vo1;riJuriJ;l3pRx1;c1ecu7pM;ess;d1iF;er;mographMriva3;hiDlassLo1rude;m4n2opera1;tive;cre9stitueHtemporary,vertab1;le;m2p1;anion,lex;er2un1;ist;ci0;lank,o4r1;i2u1;te;ef;ttom,urgeois;cadem6d3l2nim0rab;al;ert;oles1ult;ce1;nt;ic",
"Adj|Past": "true¦0:2V;1:2M;2:2P;a2Eb29c1Rd19e13f0Ygift0h0Vi0Oj0Nknown,l0Km0Fn0Do0Ap03qua02rTsDt9u7v5w3;arp0ea3or5;kHth2O;a3e0U;ri0;ni3pd1s0;fi0t0;ar5hreatCr3wi2N;a3ou18;ck0in0pp0;get0ni1L;aGcaFeEhDimCm00oak0pAt6u3;bsid24gge2Is3;pe3ta1P;ct0nd0;at0e5r3uU;ength3ip0;en0;am0reotyp0;eci3ik0ott0;al1Wfi0;pHul1;ar0ut;al0c1Gle2t1O;r0tt22;t3ut0;is1Hur1;aAe3;c7duc0f1Ag6l1new0qu5s3;pe2t3;or0ri2;e1Zir0;ist1Uul1;eiv0o3;mme09rd0v1S;lli0ti18;li17;arallel0l7o6r3ump0;e4o3;ce0Ilo0Hnou1Qpos0te2;fe0Koc8pY;i1Dli0Q;a3e16;nn0;c4rgan18verlo3;ok0;cupi0;e3ot0;ed0gle2;a5e4ix0o3;di0Tt0F;as0Olt0;n3rk0;ag0ufact0M;eft,i4o3;ad0st;cens0mit0st0;agg0us0L;mp8n3sol1;br0debt0f6t3volv0;e3ox0D;gr1n3re15;d0si0H;e2oW;li0oLrov0;amm0Xe1o3;ok0r3;ri0C;aNe6i5lavo07ocus0r3;a3i0;ct05g0Jm0;niWx0;ar0;duc1mbarraKn7quipp0stabliUx3;p3te5;a4e3;ct0rie0P;nd0;ha0NsX;aIeAi3;gniZminiNre2s3;a7c5grun02t3;o3reBurb0;rt0;iplQou3;nt0rD;bl0;cenTdMf7lay0pre6ra5t3velop0;a3ermM;il0;ng0;ss0;e4o3;rm0;rr0;m3t0;ag0;alcul1eGharg0lFo8r5u3;lt3stomQ;iv1;a4owd0u3;sh0;ck0mp0;d0lo8m5n3ok0vV;centr1s3troll0;idTolid1;b4pl3;ic1;in0;ur0;assi5os0;lebr1n5r3;ti3;fi0;tralA;a6i5o3roken,urn0;il0r0t3und;tl0;as0;k0laIs0;bandon0cJdGffe2lDnBpp9ss7u3ward0;g4thor3;iz0;me3;nt0;o5u3;m0r0;li0re3;ci1;im1ticip1;at0;leg0t3;er0;ct0;ju4o6va3;nc0;st0;ce3knowledg0;pt0;ed",
"Determiner": "true¦aBboth,d9e6few,l4mu8neiDplenty,s3th2various,wh0;at0ich0;evC;at,e4is,ose;everal,ome;a,e0;!ast,s;a1i6l0very;!se;ch;e0u;!s;!n0;!o0y;th0;er",
"Adverb": "true¦a09b05d01eXfRhPinOjustNkinda,likewi00mLnIoDpBquite,r8s4t1up0very,well; to,wards5;h1iny bit,o0wiO;o,t6w05;en,us;eldom,o0uch;!me1rt0; of;hZtimes,w0B;a1e0;alT;ndomSthN;ar excellDer0oint blank; Nhaps;f3n0;ce0ly;! 0;ag04moY; courIten;ewKo0; longEt 0;onIwithstanding;aybe,eanwhiAore0;!ovB;! aboW;deed,steX;en0;ce;or2u0;lArther0;!moL; 0ev3;examp0good,suJ;le;n1v0;er; mas0ough;se;e0irect1; 1finite0;ly;juAtrop;ackw2y 0;far,n0;ow;ard; DbroCd nauseam,gBl6ny3part,s2t 0w4;be6l0mo6wor6;arge,ea5; soon,ide;mo1w0;ay;re;l 1mo0one,ready,so,ways;st;b1t0;hat;ut;ain;ad;lot,posteriori",
"Currency": "true¦$,aud,bQcOdJeurIfHgbp,hkd,iGjpy,kElDp8r7s3usd,x2y1z0¢,£,¥,ден,лв,руб,฿,₡,₨,€,₭,﷼;lotyQł;en,uanP;af,of;h0t5;e0il5;k0q0;elK;oubleJp,upeeJ;e2ound st0;er0;lingG;n0soF;ceEnies;empi7i7;n,r0wanzaCyatC;!onaBw;ls,nr;ori7ranc9;!os;en3i2kk,o0;b0ll2;ra5;me4n0rham4;ar3;e0ny;nt1;aht,itcoin0;!s",
- "Adj|Present": "true¦a00bluZcRdMeKfHhollGidNlEmCnarrGoBp9qua8r7s4t2utt3w0;aIet,ound,ro0;ng,ug01;end0hin,op;er;e1l0mooth,our,pa8u8;i2ow;cu6daVlNpaJ;eplicaUigV;ck;aDr0;eseOime,ompt;bscu1pen,wn;atu0eLodeD;re;ay,eJi0;gNve;ow;i1r0;ee,inge;rm;l0mpty,xpress;abo4ic7;amp,e2i1oub0ry;le;ffu8r5;fu7libe0;raB;l4o0;mple9n2ol,rr1unterfe0;it;ect;juga6sum5;e1o0;se;an;nt;lig2pproxi0;ma0;te;ht",
+ "Adj|Present": "true¦a00bluZcRdMeKfHhollGidNlEmCnarrGoBp9qua8r7s4t2utt3w0;aIet,ound,ro0;ng,ug01;end0hin;er;e1l0mooth,our,pa8u8;i2ow;cu6daVlNpaJ;eplicaUigV;ck;aDr0;eseOime,ompt;bscu1pen,wn;atu0eLodeD;re;ay,eJi0;gNve;ow;i1r0;ee,inge;rm;l0mpty,xpress;abo4ic7;amp,e2i1oub0ry;le;ffu8r5;fu7libe0;raB;l4o0;mple9n2ol,rr1unterfe0;it;ect;juga6sum5;e1o0;se;an;nt;lig2pproxi0;ma0;te;ht",
"Comparable": "true¦0:3B;1:3Q;2:3F;3:2D;a3Ub3Cc30d2Qe2Jf27g1Vh1Li1Fj1Ek1Bl14m0Yn0To0Sp0Jqu0Hr08sJtEuDvBw5y4za0R;el11ou3A;a8e6hi1Hi4ry;ck0Dde,l4n1ry,se;d,y;a4i3T;k,ry;nti34ry;a4erda2ulgar;gue,in,st;g0pcomi31;a7en2Thi6i5ough,r4;anqu28en1ue;dy,g36me0ny,r03;ck,rs24;ll,me,rt,wd3I;aRcarQePhNiMkin0BlImGoEpDt7u5w4;eet,ift;b4dd0Vperfi1Wrre24;sta22t3;a8e7iff,r5u4;pUr1;a4ict,o2P;ig2Wn0N;a1ep,rn;le,rk;e1Oi2Wright0;ci1Vft,l4on,re;emn,id;a4el0;ll,rt;e6i4y;g2Nm4;!y;ek,nd2T;ck,l0mp3;a4iRort,rill,y;dy,l01rp;ve0Ixy;ce,y;d,fe,int0l1Ev0U;a9e7i6o4ude;mantic,o16sy,u4;gh,nd;ch,pe,tzy;a4d,mo0A;dy,l;gg5ndom,p4re,w;id;ed;ai2i4;ck,et;hoBi1ClAo9r6u4;ny,r4;e,p3;egna2ic5o4;fouSud;ey,k0;liXor;ain,easa2;ny;dd,i0ld,ranL;aive,e6i5o4;b3isy,rm0Vsy;ce,mb3;a4w;r,t;ad,e6ild,o5u4;nda0Yte;ist,o1;a5ek,l4;low;s0ty;a8ewd,i7o4ucky;f0Gn5o12u4ve0w0Wy0K;d,sy;e0g;ke0tt3ve0;me,r4te;ge;e5i4;nd;en;ol0ui1B;cy,ll,n4;secu7t4;e4ima5;llege2rmedia4;te;re;aBe8i7o6u4;ge,m4ng1E;b3id;me0t;gh,l0;a4fVsita2;dy,v4;en0y;nd15ppy,r4;d,sh;aEenDhBiAl9oofy,r4;a7e6is0o4ue12;o4ss;vy;at,en,y;nd,y;ad,ib,ooE;a2d1;a4o4;st0;t3uiS;u1y;aDeeb3i9lat,o7r6u4;ll,n4r0S;!ny;aDesh,iend0;a4rmEul;my;erce5nan4;ciB;! ;le;ir,ke,n08r,st,ul4;ty;a7erie,sse5v4xtre0G;il;nti4;al;r5s4;tern,y;ly,th0;aCe9i6ru5u4;ll,mb;nk;r5vi4;ne;e,ty;a4ep,nB;d4f,r;!ly;ppVrk;aDhAl8o6r5u4;dd0r0te;isp,uel;ar4ld,mmon,st0ward0zy;se;e4ou1;ar,vO;e4il0;ap,e4;sy;gey,lm,ri4;ng;aJiHlEoCr6u4;r0sy;ly;a8i5o4;ad,wn;g5llia2;nt;ht;sh,ve;ld,un4;cy;a5o4ue;nd,o1;ck,nd;g,tt4;er;d,ld,w1;dy;bsu7ng6we4;so4;me;ry;rd",
- "Infinitive": "true¦0:8U;1:8F;2:9C;3:90;4:7Z;5:7M;6:98;7:81;8:9F;9:91;A:9G;B:8W;C:7T;D:7P;E:7J;F:86;a7Zb7Dc6Nd5Fe4Df43g3Zh3Vi3Bj38k36l2Xm2Rnou3Uo2Mp25qu24r1As08tWuRvPwG;aMeLiJrG;eHiG;ng,te;ak,st4;d5e7BthG;draw,er;a2d,ep;i2ke,nGrn;d0t;aGie;li9Bni8ry;nGplift;cov0dHear7GlGplug,tie,ve82;ea8o3J;erGo;go,sta9Dval93whelm;aPeNhKoJrG;aGemb4;ffi3Emp4nsG;aCpi7;pp4ugh5;aHiHrGwaD;eat5i2;nk;aGll,m8Z;ch,se;ck4ilor,keGmp0r7K;! paD;a0Gc0Fe0Dh09i07l05m04n03o01pWquVtOuJwG;all6YeeHiG;m,ng;p,t5;bIccumb,ffHggeBmm8Zp2DrG;mouFvi2;er,i3;li7Wmer9siGveD;de,st;aKe7PiIrG;ang4eGi2;ng1Zw;fGnW;f5le;gg0rG;t4ve;a3Pi8;awn,eJiIlHoGri68;il,of;ay,it;ll,t;ak,nd;lGot6Iw;icEve;eak,i0K;a8ugg4;aGiA;m,y;ft,nGt;g,k;aIi5CoHriGun;nk,v5O;ot,rt5;ke,rp5tt0ve;eGll,nd,que7Hv0w;!k,m;aven9ul7V;dd5tis16y;att4eHip5oG;am,ut;a05b03c01d00fXgroup,heaWiVlTmSnRpPq2YsLtJvG;amp,eHiGo2N;sEve;l,rt;i7rG;ie2ofE;eFiItGurfa3;aDo1TrG;a5QiCuctu7;de,gn,st;el,hra1lGreseF;a3e63;d0ew,o02;a5Le2To2;a6eFiGoad,y;e2nq3Dve;mbur1nf2M;r1t;inHleCocus,re8uG;el,rbi8;an3e;aCu3;ei2k7Dla3GoGyc4;gni54nci4up,v0;oot,uG;ff;ct,d,liG;se,ze;a8en5Kit,o6;aUerSiRlumm0SoQrIuG;b3Hke,ni8rGt;poDs6R;eKoG;cId,fe31hibEnoHpo1sp0truAvG;e,iAo4P;un3;la32u7;a5Bc1LdHf0ocSsup0CvG;a5GeF;etermi3ZiC;a58rt4Q;er3npoiF;cei2fo39i8mea6plex,sGvaA;eve7iB;mp0n11rGtrol,ve,y;a5Mt5I;bser2cJpIutHverGwe;lap,s13tu64u1;gr4Jnu1Upa3;era6i3Ppo1;cupy;aKe06iHoGultiply;leBu5Z;micHnGspla3;ce,g4us;!k;im,ke,na9;aNeJiGo1u33;e,ke,ng0quGv5;eGi62;fy;aInG;d,gG;th5;rn,ve;ng1Zu18;eep,nG;e3Kow;o42uG;gg4xtaG;po1;gno7mUnG;cSdQfPgeBhOitia6ju7q0YsMtIun5PvG;eGo0N;nt,st;erHimi5MoxiOrG;odu3uA;aCn,prGru5M;et;iBpi7tGu7;il,ruC;abEibE;eBo25u1;iGul9;ca6;i6luA;b58mer1pG;aDer43ly,oHrG;is5Jo2;rt,se,veG;ri8;aIear,iGoiBuD;de,jaGnd0;ck;mp0ng,pp5ve;ath0et,i2le1PoIrG;aGow;b,pp4ze;!ve4P;ast5er3Ii55lOorJrHuG;lf3Qr3M;ee2YolG;ic;b3BeIfeEgGs49;eGi2;!t;clo1go,sGwa4H;had2W;ee,i2L;a0FdEl0Dm08nQquip,rPsOt3BvMxG;cKeDha4iJpHtG;ing0Pol;eGi7loEo1un9;ct,di6;st,t;luA;alua6oG;ke,l2;chew,pou1tab11;a1u4G;aWcTdRfQgOhan3joy,lNqMrLsuKtIvG;e0TisG;a9i4L;er,i3rG;a2Ien2WuB;e,re;i2Uol;ui7;ar9iB;a9eGra2ulf;nd0;or3;ang0oGu7;r1w;lo1ou0ArHuG;mb0;oa2Ky3Z;b4ct;bHer9pG;hasi1Wow0;a0Sody,rG;a3oiG;d0l;ap1eCuG;ci3Pde;rGt;ma0Mn;a0Me01iIo,rGwind4;aw,ed9oG;p,wn;agno1e,ff0g,mi28sJvG;eGul9;rGst;ge,t;ab4bTcNlod9mant4pLru3HsKtG;iGoDu2X;lHngG;ui8;!l;ol2uaA;eGla3o1ro2;n1r1;a2Oe2XlJoHuG;ss;uGv0;ra9;aGo1;im;a38ur1;af5bXcRduCep5fPliOmLnJpIra1Tta1NvG;eGol2;lop;aDiCoD;oGy;te,un3;eHoG;li8;an;mEv0;a3i03oGraud,y;rm;ei2iKoIrG;ee,yG;!pt;de,mGup4;missi2Upo1;de,ma6ph0;aHrief,uG;g,nk;rk;mp5rk5uF;a03ea1h01i00lZoHrGurta17;a2ea6ipp4;ales3eWhabEinciAllVmTnGrroA;cQdNfLju7no6qu0sJtIvG;eGin3;ne,r9;a0Hin25ribu6;er2iGoli27pi7titu6ult;d0st;iGroFu1;de,gu7rm;eHoG;ne;mn,n1;eGluA;al,i2;buBe,men3pG;e6ly;eCiAuA;r3xiB;ean1iQ;rcumveFte;eGoo1;ri8w;ncGre5t0ulk;el;aYeSiRlOoNrJuG;iHrGy;st,y;ld;aIeHiGoad5;ng;astfeJed;ke;il,l12mba0XrrMth0;aHeGow;ed;ze;de,nd;!come,gKha2liJnd,queaIstHtGwild0;ray;ow;th;e2tt4;in;bysEckfi7ff4tG;he;it;b15c0Td0Kff0Igr0Hl0Dm09n03ppZrXsQttNuLvIwaG;it,k5;en;eDoG;id;rt;gGto06;meF;aHeBraC;ct;ch;pi7sHtoG;ni8;aIeGi03u7;mb4rt;le;il;re;g0Hi1ou1rG;an9i2;eaIly,oiFrG;ai1o2;nt;r,se;aKiOnHtG;icipa6;eHoGul;un3y;al;ly1;aHu1;se;lgaGze;ma6;iIlG;e9oGuA;t,w;gn;ee;ix,oG;rd;aZjLmiIoHsoG;rb;pt,rn;niGt;st0;er;ouHuB;st;rn;cJhie2knowled9quiGtiva6;es3re;ce;ge;eMomIrHusG;e,tom;ue;moHpG;any,li8;da6;te;pt;andMet,iAoIsG;coIol2;ve;li8rt,uG;nd;sh;de;on",
+ "Infinitive": "true¦0:8S;1:8D;2:9A;3:8Y;4:7X;5:7K;6:96;7:7Z;8:9E;9:9D;A:8Z;B:8U;C:7R;D:7H;E:7N;F:84;a7Xb7Dc6Nd5Fe4Df43g3Zh3Vi3Bj38k36l2Xm2Rnou3Uo2Mp25qu24r1As08tWuRvPwG;aMeLiJrG;eHiG;ng,te;ak,st4;d5e7BthG;draw,er;a2d,ep;i2ke,nGrn;d0t;aGie;li99ni9ry;nGplift;cov0dHear7ElGplug,tie,ve80;ea9o3J;erGo;go,sta9Bval91whelm;aPeNhKoJrG;aGemb4;ffi3Emp4nsG;aCpi7;pp4ugh5;aHiHrGwaE;eat5i2;nk;aGll,m8X;ch,se;ck4ilor,keGmp0r7I;! paE;a0Gc0Fe0Dh09i07l05m04n03o01pWquVtOuJwG;all6WeeHiG;m,ng;p,t5;bIccumb,ffHggeBmm8Xp2DrG;mouFvi2;er,i3;li7UmerAsiGveE;de,st;aKe7NiIrG;ang4eGi2;ng1Zw;fGnW;f5le;gg0rG;t4ve;a3Pi9;a47eJiIlHoGri68;il,of;ay,it;ll,t;ak,nd;lGot6Gw;icDve;eak,i0K;a9ugg4;aGi8;m,y;ft,nGt;g,k;aIi5CoHriGun;nk,v5O;ot,rt5;ke,rp5tt0;eGll,nd,que7Fv0w;!k,m;avenAul7T;dd5tis16y;att4eHip5oG;am,ut;a05b03c01d00fXgroup,heaWiVlTmSnRpPq2YsLtJvG;amp,eHiGo2N;sDve;l,rt;i7rG;ie2ofD;eFiItGurfa3;o1TrG;a5OiCuctu7;de,gn,st;el,hra1lGreseF;a3e61;d0ew,o02;a5Je2To2;a6eFiGoad,y;e2nq3Dve;mbur1nf2M;r1t;inHleCocus,re9uG;el,rbi9;an3e;aCu3;ei2k7Bla3GoGyc4;gni53nci4up,v0;oot,uG;ff;ct,d,liG;se,ze;a9en5Iit,o6;aUerSiRlumm0SoQrIuG;b3Hke,ni9rGt;poEs6P;eKoG;cId,fe31hibDnoHpo1sp0tru8vG;e,i8o4O;un3;la32u7;a59c1LdHf0ocSsup0CvG;a5EeF;etermi3ZiC;a56rt4O;er3npoiF;cei2fo39i9mea6plex,sGva8;eve7iB;mp0n11rGtrol,ve,y;a5Kt5G;bser2cJpIutHverGwe;lap,s13tu62u1;gr4Hnu1Upa3;era6i3Ppo1;cupy;aKe06iHoGultiply;leBu5X;micHnGspla3;ce,g4us;!k;im,ke,naA;aNeJiGo1u33;e,ke,ng0quGv5;eGi60;fy;aInG;d,gG;th5;rn,ve;ng1Zu18;eep,nG;e3Kow;o40uG;gg4xtaG;po1;gno7mUnG;cSdQfPgeBhOitia6ju7q0YsMtIun5NvG;eGo0N;nt,st;erHimi5KoxiOrG;odu3u8;aCn,prGru5K;et;iBpi7tGu7;il,ruC;abDibD;eBo25u1;iGulA;ca6;i6lu8;b56mer1pG;aEer41ly,oHrG;is5Ho2;rt,se,veG;ri9;aIear,iGoiBuE;de,jaGnd0;ck;mp0ng,pp5ve;ath0et,i2le1PoIrG;aGow;b,pp4ze;!ve4N;ast5er3Gi53lOorJrHuG;lf3Or3K;ee2XolG;ic;b39eIfeDgGs47;eGi2;!t;clo1go,sGwa4F;had2U;ee,i2L;a0FdDl0Dm08nQquip,rPsOt39vMxG;cKeEha4iJpHtG;ing0Pol;eGi7loDo1unA;ct,di6;st,t;lu8;alua6oG;ke,l2;chew,pou1tab11;a1u4E;aWcTdRfQgOhan3joy,lNqMrLsuKtIvG;e0TisG;aAi4J;er,i3rG;a2Gen2UuB;e,re;i2Sol;ui7;arAiB;aAeGra2ulf;nd0;or3;ang0oGu7;r1w;lo1ou0ArHuG;mb0;oa2Iy3X;b4ct;bHerApG;hasi1Vow0;a0Sody,rG;a3oiG;d0l;ap1eCuG;ci3Nde;rGt;ma0Mn;a0Me01iIo,rGwind4;aw,edAoG;wn;agno1e,ff0g,mi26sJvG;eGulA;rGst;ge,t;ab4bTcNlodAmant4pLru3FsKtG;iGoEu2V;lHngG;ui9;!l;ol2ua8;eGla3o1ro2;n1r1;a2Me2VlJoHuG;ss;uGv0;raA;aGo1;im;a36ur1;af5bXcRduCep5fPliOmLnJpIra1Rta1LvG;eGol2;lop;aEiCoE;oGy;te,un3;eHoG;li9;an;mDv0;a3i03oGraud,y;rm;ei2iKoIrG;ee,yG;!pt;de,mGup4;missi2Spo1;de,ma6ph0;aHrief,uG;g,nk;rk;mp5rk5uF;a03ea1h01i00lZoHrGurta15;a2ea6ipp4;ales3eWhabDinci8llVmTnGrro8;cQdNfLju7no6qu0sJtIvG;eGin3;ne,rA;a0Fin23ribu6;er2iGoli25pi7titu6ult;d0st;iGroFu1;de,gu7rm;eHoG;ne;mn,n1;eGlu8;al,i2;buBe,men3pG;e6ly;eCi8u8;r3xiB;ean1iQ;rcumveFte;eGoo1;ri9w;ncGre5t0ulk;el;aWeQi8lNoMrJuG;iHrGy;st,y;ld;aHeastfeKiGoad5;ng;ke;il,l11mba0WrrLth0;aHeGow;ed;ze;!come,gKha2liJnd,queaIstHtGwild0;ray;ow;th;e2tt4;in;bysDckfi7ff4tG;he;it;b15c0Td0Kff0Igr0Hl0Dm09n03ppZrXsQttNuLvIwaG;it,k5;en;eEoG;id;rt;gGto06;meF;aHeBraC;ct;ch;pi7sHtoG;ni9;aIeGi03u7;mb4rt;le;il;re;g0Hi1ou1rG;anAi2;eaIly,oiFrG;ai1o2;nt;r,se;aKiOnHtG;icipa6;eHoGul;un3y;al;ly1;aHu1;se;lgaGze;ma6;iIlG;eAoGu8;t,w;gn;ee;ix,oG;rd;aZjLmiIoHsoG;rb;pt,rn;niGt;st0;er;ouHuB;st;rn;cJhie2knowledAquiGtiva6;es3re;ce;ge;eMomIrHusG;e,tom;ue;moHpG;any,li9;da6;te;pt;andMet,i8oIsG;coIol2;ve;li9rt,uG;nd;sh;de;on",
"Participle": "true¦f4g3h2less6s1w0;ors5ritt5;e4h5;ast3e2;iv2one;l2r0;ight0;en;own",
"Modal": "true¦c5lets,m4ought3sh1w0;ill,o5;a0o4;ll,nt;! to,a;ight,ust;an,o0;uld",
"Adj|Gerund": "true¦0:2C;1:2E;2:22;3:20;4:1X;5:24;a1Zb1Uc1Cd0Ze0Uf0Kg0Eh0Di07jud1Sl04m01oXpTrNsCt7up6veWw0Lyiel4;lif0sZ;aUe9hr7i3ouc22r6wis0;eZoub2us0yi1;ea0Ji6;l2vi1;l2mp0;atisf28creec1Xhoc0Bkyrocke0lo0ZoEpDt9u7we6;e0Yl2;pp1Gr6;gi1pri5roun4;a7ea1Zi6ri07un18;mula0r3;gge3r6;t2vi1;ark2ee4;a6ot1O;ki1ri1;aAe7ive0o6us1M;a3l2;defi0Zfres1Kig0ZlaCs0v6war4;ea2itali6ol0M;si1zi1;gi1ll1Smb2vi1;a1Rerple8ier19lun14r6un1F;e6o0X;ce4s5vai2;xi1;ffs8pKut7ver6wi1;arc1Blap0Dri4whel1H;goi1l1Lst0U;et0;eande3i7o0Bu6;mb2;s5tiga0;a7i6o08;fesa07mi0vi1;cHg0Rs0;mAn6rri08;c8s7te13vi6;go1Cti1;pi3ul0;orpo1Area5;po5;arrowi1ea2orrif17umilia0;lAr6;a0ipWo7uel6;i1li1;undbrea6wi1;ki1;a3ea0W;aEetc0Pit0lBo9r7ulf6;il2;ee0Vigh6ust0Z;te01;r6un4;ebo4th0E;a7o6;a0we3;mi1tte3;di1scina0;m9n7x6;ac0ci0is0plo4;ab2c6du3ga01sQ;han0oura00;barras5erZpowe3;aHeAi6;s6zz0K;appoin0gus0sen0t6;r6u0L;ac0es5;biliBcAfiKgra4m9pres5ser8v6;asAelo6;pi1;vi1;an4eaG;a0BliF;ta0;maMri1sYun0;aMhJlo5o6ripp2ut0;mCn6rrespon4;cerAf9spi3t6vinO;in7r6;as0ibu0ol2;ui1;lic0u5;ni1;fAm9p6;e7ro6;mi5;l2ti1;an4;or0;a6ea0il2;llen6rO;gi1;lMptiva0;e9in4lin4o7rui5u6;d4st2;i2oJri1un6;ci1;coH;bsoOcJgonHlarGmEppea2rCs6;pi3su3to6;n7un4;di1;is6;hi1;ri1;res0;li1;a9u5;si1;mi1;i6zi1;zi1;c6hi1;ele7ompan6;yi1;ra0;ti1;rbi1;ng",
"Person|Verb": "true¦b2ch1drew,grant,ja3ma0ollie,pat,rob,sue,wade;ck,rk;ase,u1;ob,u0;ck",
+ "Person|Noun": "true¦a04bYcVdOeMfLgJhGjCkitXlBm9olive,p6r3s2triniXv0wang;an,enus,iol0;a,et;ky,on5umm00;ay,e1o0uby;bin,d,se;ed,x;atNe0ol;aFn0;ny;a0eloQ;x,ya;a8eo,iD;a2e1o0;lDy;an,w3;de,smi4y;a0iKol8;ll,z0;el;ail,e0;ne;aith,ern,lo;a0dDmir,ula,ve;rl;a4e3i1ol0;ly;ck,x0;ie;an,ja;i0wn;sy;h0liff,rystal;ari0in,ristian;ty;ak4e3i2r0;an0ook;dy;ll;nedict,rg;er;l0rt;fredo,ma",
"Person|Place": "true¦a5darw6h3jordan,k2orlando,s0victo7;a0ydney;lvador,mara,ntiago;ent,obe;amil0ous0;ton;lexand1ust0;in;ria",
"Person|Date": "true¦a2j0sep;an0une;!uary;p0ugust,v0;ril"
}
\ No newline at end of file
diff --git a/src/2-two/preTagger/tagSet/verbs.js b/src/2-two/preTagger/tagSet/verbs.js
index 995a61b6a..d7d4b1e67 100644
--- a/src/2-two/preTagger/tagSet/verbs.js
+++ b/src/2-two/preTagger/tagSet/verbs.js
@@ -15,6 +15,7 @@ export default {
// '[walk] now!'
Imperative: {
is: 'Infinitive',
+ not: ['PastTense', 'Gerund', 'Copula'],
},
// walking
Gerund: {
diff --git a/src/3-three/nouns/api/api.js b/src/3-three/nouns/api/api.js
index 7b3e21625..67a47246b 100644
--- a/src/3-three/nouns/api/api.js
+++ b/src/3-three/nouns/api/api.js
@@ -19,8 +19,9 @@ const api = function (View) {
return getNth(this, n).map(parseNoun)
}
- json(opts = {}) {
- return this.map(m => {
+ json(n) {
+ let opts = typeof n === 'object' ? n : {}
+ return getNth(this, n).map(m => {
let json = m.toView().json(opts)[0] || {}
if (opts && opts.noun !== true) {
json.noun = toJSON(m)
@@ -34,6 +35,11 @@ const api = function (View) {
return getNth(arr, n)
}
+ isSingular(n) {
+ let arr = this.filter(m => !parseNoun(m).isPlural)
+ return getNth(arr, n)
+ }
+
adjectives(n) {
let list = this.update([])
this.forEach(m => {
diff --git a/src/3-three/nouns/api/toPlural.js b/src/3-three/nouns/api/toPlural.js
index 9298bec80..a6aca7bf9 100644
--- a/src/3-three/nouns/api/toPlural.js
+++ b/src/3-three/nouns/api/toPlural.js
@@ -2,7 +2,7 @@ const keep = { tags: true }
const hasPlural = function (parsed) {
let { root } = parsed
- if (root.has('^(#Uncountable|#Possessive|#ProperNoun|#Place|#Pronoun)+$')) {
+ if (root.has('^(#Uncountable|#Possessive|#ProperNoun|#Place|#Pronoun|#Acronym)+$')) {
return false
}
return true
@@ -20,13 +20,23 @@ const nounToPlural = function (m, parsed) {
const { methods, model } = m.world
const { toPlural } = methods.two.transform.noun
// inflect the root noun
- let str = parsed.root.text('normal')
+ let str = parsed.root.text({ keepPunct: false })
let plural = toPlural(str, model)
m.match(parsed.root).replaceWith(plural, keep).tag('Plural', 'toPlural')
// should we change the determiner/article?
if (parsed.determiner.has('(a|an)')) {
// 'a captain' -> 'the captains'
- m.replace(parsed.determiner, 'the', keep)
+ // m.replace(parsed.determiner, 'the', keep)
+ m.remove(parsed.determiner)
+ }
+ // should we change the following copula?
+ let copula = parsed.root.after('not? #Adverb+? [#Copula]', 0)
+ if (copula.found) {
+ if (copula.has('is')) {
+ m.replace(copula, 'are')
+ } else if (copula.has('was')) {
+ m.replace(copula, 'were')
+ }
}
return m
}
diff --git a/src/3-three/numbers/numbers/api.js b/src/3-three/numbers/numbers/api.js
index 2107c6fb9..bbcb2849b 100644
--- a/src/3-three/numbers/numbers/api.js
+++ b/src/3-three/numbers/numbers/api.js
@@ -19,9 +19,9 @@ const addMethod = function (View) {
return getNth(this, n).map(parse).map(o => o.num)
}
json(n) {
- let doc = getNth(this, n)
- return doc.map(p => {
- let json = p.toView().json(n)[0]
+ let opts = typeof n === 'object' ? n : {}
+ return getNth(this, n).map(p => {
+ let json = p.toView().json(opts)[0]
let parsed = parse(p)
json.number = {
prefix: parsed.prefix,
diff --git a/src/3-three/topics/people/api.js b/src/3-three/topics/people/api.js
index 0e96b0764..6b85a5e53 100644
--- a/src/3-three/topics/people/api.js
+++ b/src/3-three/topics/people/api.js
@@ -18,9 +18,9 @@ const addMethod = function (View) {
return getNth(this, n).map(parse)
}
json(n) {
- let doc = getNth(this, n)
- return doc.map(p => {
- let json = p.toView().json(n)[0]
+ let opts = typeof n === 'object' ? n : {}
+ return getNth(this, n).map(p => {
+ let json = p.toView().json(opts)[0]
let parsed = parse(p)
json.person = {
firstName: parsed.firstName.text('normal'),
diff --git a/src/API/methods/utils.js b/src/API/methods/utils.js
index 5b14379d0..f9fb361ed 100644
--- a/src/API/methods/utils.js
+++ b/src/API/methods/utils.js
@@ -111,6 +111,27 @@ const utils = {
}, 0)
},
+ // is the pointer the full sentence?
+ isFull: function () {
+ let ptrs = this.pointer
+ if (!ptrs) {
+ return true
+ }
+ let document = this.document
+ for (let i = 0; i < ptrs.length; i += 1) {
+ let [n, start, end] = ptrs[i]
+ // it's not the start
+ if (n !== i || start !== 0) {
+ return false
+ }
+ // it's too short
+ if (document[n].length > end) {
+ return false
+ }
+ }
+ return true
+ }
+
}
utils.group = utils.groups
utils.fullSentence = utils.fullSentences
diff --git a/src/_version.js b/src/_version.js
index 5ebce1b99..b0a93375f 100644
--- a/src/_version.js
+++ b/src/_version.js
@@ -1 +1 @@
-export default '14.6.0'
\ No newline at end of file
+export default '14.7.0'
\ No newline at end of file
diff --git a/tests/one/change/concat.test.js b/tests/one/change/concat.test.js
index 43ae29048..ea0471808 100644
--- a/tests/one/change/concat.test.js
+++ b/tests/one/change/concat.test.js
@@ -2,6 +2,25 @@ import test from 'tape'
import nlp from '../_lib.js'
const here = '[one/concat] '
+test('concat tag :', function (t) {
+ let doc = nlp('the start and the end. another one')
+ doc.concat('cool times. oh yeah')
+ t.equal(doc.has('cool times'), true, here + 'tagged - 1')
+
+ doc = nlp('the start and the end. another one')
+ let b = nlp('cool times. oh yeah')
+ doc.concat(b)
+ t.equal(doc.has('cool times'), true, here + 'tagged - 2')
+ t.end()
+})
+
+// test('concat tag :', function (t) {
+// let doc = nlp('one here. two here. three here')
+// let mid = doc.match('two here')
+// mid.concat('cool times. oh yeah')
+// t.end()
+// })
+
test('concat pointers :', function (t) {
let doc = nlp('one two three four')
let a = doc.match('two three')
diff --git a/tests/one/match/sweep-not.test.js b/tests/one/match/sweep-not.test.js
new file mode 100644
index 000000000..24c1b7aa8
--- /dev/null
+++ b/tests/one/match/sweep-not.test.js
@@ -0,0 +1,23 @@
+import test from 'tape'
+import nlp from '../_lib.js'
+const here = '[one/sweep] '
+
+test('sweep-not:', function (t) {
+ let doc = nlp('The service is fast really')
+ let net = nlp.buildNet([{ match: 'is fast .', notIf: 'psych' }])
+ let m = doc.match(net)
+ t.equal(m.text(), 'is fast really', here + 'no-psych')
+
+ doc = nlp('The service is fast psych')
+ net = nlp.buildNet([{ match: 'is fast .', notIf: 'psych' }])
+ m = doc.match(net)
+ t.equal(m.text(), '', here + 'psych-found')
+
+ doc = nlp('i swim in the lake and walk in the road')
+ net = nlp.buildNet([{ match: 'i (swim|walk) in the .', notIf: 'in the (park|lake)' }])
+ m = doc.match(net)
+ t.equal(m.text(), '', here + 'notIf optional')
+
+ t.end()
+})
+
diff --git a/tests/one/misc/isFull.test.js b/tests/one/misc/isFull.test.js
new file mode 100644
index 000000000..a8558af42
--- /dev/null
+++ b/tests/one/misc/isFull.test.js
@@ -0,0 +1,29 @@
+import test from 'tape'
+import nlp from '../_lib.js'
+const here = '[one/isFull] '
+
+test('isFull :', function (t) {
+ let doc = nlp('one two three. four five. six seven eight. nine')
+ t.equal(doc.isFull(), true, here + 'full')
+
+ let m = doc.match('four five')
+ t.equal(m.isFull(), false, here + 'part')
+
+ m = doc.terms()
+ t.equal(m.isFull(), false, here + 'terms')
+
+ m = doc.harden()
+ t.equal(m.isFull(), true, here + 'harden')
+
+ m = m.eq(2)
+ t.equal(m.isFull(), false, here + 'eq')
+
+ doc.remove('four')
+ t.equal(doc.isFull(), true, here + 'remove')
+ doc.remove('five')
+ t.equal(doc.isFull(), true, here + 'remove2')
+
+ m = doc.terms().all()
+ t.equal(m.isFull(), true, here + 'all')
+ t.end()
+})
diff --git a/tests/one/tokenize/punctuation.test.js b/tests/one/tokenize/punctuation.test.js
new file mode 100644
index 000000000..a51a68e72
--- /dev/null
+++ b/tests/one/tokenize/punctuation.test.js
@@ -0,0 +1,54 @@
+import test from 'tape'
+import nlp from '../../two/_lib.js'
+const here = '[one/term-punctuation] '
+
+
+test('term punctuation', function (t) {
+ let arr = [
+ [`yeah??`, 'yeah'],
+ [`#canada`, 'canada'],
+ [`@canada`, 'canada'],
+ [`the "gouvernement" party`, 'gouvernement'],
+ [`i guess... but`, 'guess'],
+ [`he did. (but barely)`, 'but barely'],
+ [`~word~`, 'word'],
+ [`'word'`, 'word'],
+ [`(word)`, 'word'],
+ [`([word])`, 'word'],
+ [`{word}`, 'word'],
+ [`-word-`, 'word'],
+ [`«‛“word〉`, 'word'],
+ [`'word'`, 'word'],
+ [`flanders'`, `flanders'`],
+ // [`_word_`, 'word'],
+ ]
+ arr.forEach(a => {
+ let [txt, match] = a
+ t.equal(nlp(txt).has(match), true, here + `"${txt}"`)
+ })
+ t.end()
+})
+
+test('modify existing punctuation', function (t) {
+ let world = nlp.world()
+
+ let term = nlp('=cool=').docs[0][0]
+ t.equal(term.normal, 'cool', here + 'before')
+
+ // change it
+ world.model.one.prePunctuation['='] = true
+ term = nlp('=cool=').docs[0][0]
+ t.equal(term.normal, '=cool', here + 'allow before')
+
+ world.model.one.postPunctuation['='] = true
+ term = nlp('=cool=').docs[0][0]
+ t.equal(term.normal, '=cool=', here + 'both')
+
+ world.model.one.prePunctuation['='] = false
+ world.model.one.postPunctuation['='] = false
+ term = nlp('=cool=').docs[0][0]
+ t.equal(term.normal, 'cool', here + 'fixed')
+
+
+ t.end()
+})
\ No newline at end of file
diff --git a/tests/three/json-three.test.js b/tests/three/json-three.test.js
new file mode 100644
index 000000000..cd9d1bd28
--- /dev/null
+++ b/tests/three/json-three.test.js
@@ -0,0 +1,70 @@
+import test from 'tape'
+import nlp from './_lib.js'
+const here = '[three/json] '
+
+
+test('view-json', function (t) {
+ let doc = nlp('i walk and swim gracefully')
+ let json = doc.json({ normal: true })
+ t.ok(json[0].normal, here + 'view-opts')
+ // json = doc.json(0)
+ // t.ok(json.length, 1, here + 'view-num')
+ t.end()
+})
+
+test('verbs-json', function (t) {
+ let doc = nlp('i walk and swim gracefully')
+ let json = doc.verbs().json({ normal: true })
+ t.ok(json[0].normal, here + 'verbs-opts')
+ json = doc.verbs().json(0)
+ t.ok(json.length, 1, here + 'verbs-num')
+ t.end()
+})
+
+test('nouns-json', function (t) {
+ let doc = nlp('i eat carrots and cabbage')
+ let json = doc.nouns().json({ normal: true })
+ t.ok(json[0].normal, here + 'nouns-opts')
+ json = doc.nouns().json(0)
+ t.ok(json.length, 1, here + 'nouns-num')
+ t.end()
+})
+
+test('sentences-json', function (t) {
+ let doc = nlp('i eat. i swim')
+ let json = doc.sentences().json({ normal: true })
+ t.ok(json[0].normal, here + 'sentences-opts')
+ json = doc.sentences().json(0)
+ t.ok(json.length, 1, here + 'sentences-num')
+ t.end()
+})
+
+test('numbers-json', function (t) {
+ let doc = nlp('4 books, 12 authors')
+ let json = doc.numbers().json({ normal: true })
+ t.ok(json[0].normal, here + 'numbers-opts')
+ json = doc.numbers().json(0)
+ t.ok(json.length, 1, here + 'numbers-num')
+ t.end()
+})
+
+test('people-json', function (t) {
+ let doc = nlp('john and jim eat candy')
+ let json = doc.people().json({ normal: true })
+ t.ok(json[0].normal, here + 'person-opts')
+
+ json = doc.people().json(0)
+ t.equal(json.length, 1, here + 'person-num')
+ t.end()
+})
+
+test('places-json', function (t) {
+ let doc = nlp('i saw paris and london')
+ let json = doc.places().json({ normal: true })
+ t.ok(json[0].normal, here + 'places-opts')
+
+ // json = doc.places().json(0)
+ // t.equal(json.length, 1, here + 'places-num')
+ t.end()
+})
+
diff --git a/tests/three/nouns/coreference.ignore.js b/tests/three/nouns/coreference.ignore.js
new file mode 100644
index 000000000..ae5256825
--- /dev/null
+++ b/tests/three/nouns/coreference.ignore.js
@@ -0,0 +1,77 @@
+import test from 'tape'
+import nlp from '../_lib.js'
+const here = '[three/anaphor] '
+
+// https://github.com/google-research-datasets/gap-coreference
+test('anaphor:', function (t) {
+ let arr = [
+ // basic he
+ {
+ text: `spencer is quiet. he is lame`,
+ refs: { he: `spencer` },
+ },
+ // basic she
+ {
+ text: `Miranda July is an American film director. She wrote, directed and starred in three films`,
+ refs: { she: `Miranda July` },
+ },
+ // basic it
+ {
+ text: `my toaster heated and it started smoking`,
+ refs: { it: `my toaster` },
+ },
+ // basic they
+ {
+ text: `Tornadoes are swirling clouds, they arrive during the summer`,
+ refs: { they: `Tornadoes` },
+ },
+
+ // basic 'her'
+ {
+ text: `Sally arrived, but nobody saw her`,
+ refs: { her: `sally` },
+ },
+ // generic 'it'
+ // {
+ // text: `the plane took off. it was exciting.`,
+ // refs: {},
+ // },
+ // 'it' as verb.
+ // {
+ // text: ` If Sam buys a new bike, I will do it as well.`,
+ // refs: { },
+ // },
+
+ // double they
+ {
+ text: ` Gas prices are a top issue heading into the midterms. Polls show they’re high on voters’ minds`,
+ refs: { they: 'Gas prices' },
+ },
+
+ // person-like
+ {
+ text: `the cowboy shot his gun and he walked away`,
+ refs: { he: `the cowboy` },
+ },
+ {
+ text: `spencer's aunt is fun. she is smart`,
+ refs: { she: `spencer's aunt` },
+ },
+ {
+ text: `the cheerleader did a flip but she landed awkwardly`,
+ refs: { she: `the cheerleader` },
+ },
+ // anaphor-before
+ // {
+ // text: ` In their free time, the boys play video games`,
+ // refs: { their: 'the boys' },
+ // },
+
+ ]
+ arr.forEach(obj => {
+ let { text, refs } = obj
+ let doc = nlp(text).compute('anaphor')
+ t.equal()
+ })
+ t.end()
+})
diff --git a/tests/three/nouns/toPlural.test.js b/tests/three/nouns/toPlural.test.js
index fb2c587f3..0c6dc89c6 100644
--- a/tests/three/nouns/toPlural.test.js
+++ b/tests/three/nouns/toPlural.test.js
@@ -124,7 +124,16 @@ test('toPlural - longer:', function (t) {
[`the tornado in Barrie swept through downtown`, `the tornados in Barrie swept through downtown`],
[`no cookie until after dinner`, `no cookies until after dinners`],
[`my finger looked green afterwards`, `my fingers looked green afterwards`],
- // [`my finger was green afterwards`, `my fingers were green afterwards`],
+
+ // ["keep a cool head", "keep cool heads"],
+ ["petsmart application?", "petsmart applications?"],
+ ["attacked by a bear?", "attacked by bears?"],
+ // ["Gal's DIARY: He ws quiet 2dy.", "Gal's DIARY: He ws quiet 2dy."],
+ // ["All right relax.", "All right relax."],
+ ["HP to be self-sufficient by 2010", "HP to be self-sufficient by 2010"],
+ ["the woman", "the women"],
+ ["the woman isn't dead.", "the women are not dead."],
+ [`my finger was green afterwards`, `my fingers were green afterwards`],
]
arr.forEach(function (a) {
let doc = nlp(a[0])
diff --git a/tests/three/verbs/toInfinitive.test.js b/tests/three/verbs/toInfinitive.test.js
index a5c49990d..bf910b809 100644
--- a/tests/three/verbs/toInfinitive.test.js
+++ b/tests/three/verbs/toInfinitive.test.js
@@ -273,7 +273,7 @@ test('toInfinitive-phrase:', function (t) {
["he spiked", "he spike"],
["mimicked", "mimic"],
["flaked", "flake"],
- ["baked", "bake"],
+ // ["baked", "bake"],
["guaranteed", "guarantee"],
["agreed", "agree"],
["freed", "free"],
diff --git a/tests/two/match.test.js b/tests/two/match.test.js
index cab24ee7b..d182710e4 100644
--- a/tests/two/match.test.js
+++ b/tests/two/match.test.js
@@ -723,6 +723,28 @@ let arr = [
[`will get discouraged`, `#Verb #Verb #Adjective`],
[`do not get discouraged`, `#Verb #Negative #Verb #Adjective`],
[`do not be embarrassed`, `#Verb #Negative #Verb #Adjective`],
+
+ [`like to drink`, `#Verb to #Verb`],
+ [`try to hold`, `#Verb to #Verb`],
+ [`need to ask`, `#Verb to #Verb`],
+ [`want to stand`, `#Verb to #Verb`],
+ [`have to face`, `#Verb to #Verb`],
+ [`agreeing to purchase`, `#Verb to #Verb`],
+ [`continue to reform`, `#Verb to #Verb`],
+ [`refused to harbour`, `#Verb to #Verb`],
+ [`begin to fear`, `#Verb to #Verb`],
+ // [`came to light`, `#Verb to #Noun`],
+ [`i bike to work`, `i #Verb to #Noun`],
+ [`bring to market`, `#Verb to #Noun`],
+ [`went to sleep`, `#Verb to #Noun`],
+
+ ['l-theanine', '#Noun'],
+ ['x-ray', '#Noun'],
+ ['my ex-husband', 'my #Noun'],
+ ['The F-102 saw service', 'the #Noun #Verb #Noun'],
+ // titlecase
+ ['We Sell All Brands', '#Pronoun #Verb all #Plural'],
+ ['WE SELL ALL BRANDS', '#Pronoun #Verb all #Plural']
]
test('match:', function (t) {
let res = []
diff --git a/tests/two/match/fancy-match.test.js b/tests/two/match/fancy-match.test.js
index cff9615d0..8930ab80f 100644
--- a/tests/two/match/fancy-match.test.js
+++ b/tests/two/match/fancy-match.test.js
@@ -76,3 +76,12 @@ test('match-doc-freeze', function (t) {
t.deepEqual(arr, ['boy', 'girl.'], here + 'match-doc-2')
t.end()
})
+
+test('match-term-id', function (t) {
+ let doc = nlp('one two three')
+ let two = doc.match('two')
+ let id = two.json()[0].terms[0].id
+ let m = doc.match([{ id: id }])
+ t.ok(m.has('^two$'), here + 'match-id')
+ t.end()
+})
diff --git a/tests/two/misc/canBe.test.js b/tests/two/misc/canBe.test.js
index be3795cb2..b276931e5 100644
--- a/tests/two/misc/canBe.test.js
+++ b/tests/two/misc/canBe.test.js
@@ -15,5 +15,9 @@ test('canBe', function (t) {
let canBeMisc = nlp('spencer kelly').canBe('asdf')
t.equal(canBeMisc.length, 1, here + 'all results are one')
+
+
+ let found = nlp("Moe Sizlak.").terms().canBe('#Verb').found
+ t.equal(found, false, here + 'no verb')
t.end()
})
diff --git a/tests/two/output/out.test.js b/tests/two/output/out.test.js
index cd6549071..046508314 100644
--- a/tests/two/output/out.test.js
+++ b/tests/two/output/out.test.js
@@ -32,6 +32,13 @@ test('out-wrap', function (t) {
let out = doc.out({
'#Adjective': (m) => `[${m.text()}]`
})
- t.equal(out, `[soft] and [yielding] like a nerf ball`, 'two matches')
+ t.equal(out, `[soft] and [yielding] like a nerf ball`, here + 'two matches')
+
+ // pre-post
+ doc = nlp("before (match) after")
+ out = doc.wrap({
+ 'match': () => `few more words`,
+ })
+ t.equal(out, `before (few more words) after`, here + 'pre+post')
t.end()
})
diff --git a/tests/two/tagger/_pennSample.js b/tests/two/tagger/_pennSample.js
index 5f4f65d8b..fcb0f0ee2 100644
--- a/tests/two/tagger/_pennSample.js
+++ b/tests/two/tagger/_pennSample.js
@@ -400,11 +400,11 @@ export default [
},
{
text: 'The F-102 saw service in the Vietnam theater between March 1962 and December 1969.',
- tags: 'DT, NNP, CD, VBD, NN, IN, DT, NNP, NN, IN, NNP, CD, CC, NNP, CD',
+ tags: 'DT, NNP, VBD, NN, IN, DT, NNP, NN, IN, NNP, CD, CC, NNP, CD',
},
{
text: 'During this time, F-102 squadrons were based out of Tan Son Nhut, Da Nang and Bien Hoa in Vietnam, and Udorn and Don Muang in Thailand.',
- tags: 'IN, DT, NN, NNP, CD, NNS, VBD, VBN, IN, IN, NNP, NNP, NNP, NNP, NNP, CC, NNP, NNP, IN, NNP, CC, NNP, CC, NNP, NNP, IN, NNP',
+ tags: 'IN, DT, NN, NNP, NNS, VBD, VBN, IN, IN, NNP, NNP, NNP, NNP, NNP, CC, NNP, NNP, IN, NNP, CC, NNP, CC, NNP, NNP, IN, NNP',
},
{
text: 'Six weeks of basic training.',
@@ -922,10 +922,6 @@ export default [
text: '18T-EI Indonesia Operations LLC',
tags: 'NNP, NNP, NNPS, NNP',
},
- {
- text: '86M-Enron Net Works LLC',
- tags: 'NNP, NNP, NNPS, NNP',
- },
{
text: 'Despite the name, this entity appears to be a MTM company.',
tags: 'IN, DT, NN, DT, NN, VBZ, TO, VB, DT, NNP, NN',
@@ -4284,7 +4280,7 @@ export default [
},
{
text: 'Did they do any x-rays?',
- tags: 'VBD, PRP, VB, DT, NN, NNS',
+ tags: 'VBD, PRP, VB, DT, NNS',
},
{
text: 'They are also very secretive about being in a relationship.',
@@ -4479,10 +4475,6 @@ export default [
text: 'You do realise it is quite expensive to visit Ireland?',
tags: 'PRP, VBP, VB, PRP, VBZ, RB, JJ, TO, VB, NNP',
},
- {
- text: 'Golden Wonder KilliFish Breeding Help?',
- tags: 'NN, NN, NN, NN, NN',
- },
{
text: 'I have 4 Golden Wonder Killifish.',
tags: 'PRP, VBP, CD, NN, NN, NNS',
@@ -4823,10 +4815,6 @@ export default [
text: 'The service at Instep was great !!',
tags: 'DT, NN, IN, NNP, VBD, JJ',
},
- {
- text: 'This place is top notch and highly affordable!',
- tags: 'DT, NN, VBZ, JJ, NN, CC, RB, JJ',
- },
{
text: 'Tried Crust on Broad on 3 occasions.',
tags: 'VBD, NNP, IN, NNP, IN, CD, NNS',
diff --git a/tests/two/variables/past-adj.test.js b/tests/two/variables/past-adj.test.js
index 3c7674838..f8e9589b9 100644
--- a/tests/two/variables/past-adj.test.js
+++ b/tests/two/variables/past-adj.test.js
@@ -54,7 +54,7 @@ let arr = [
[`he detailed`, '. #PastTense'],
['jack cheered', '#Person #PastTense'],
['jack guarded', '#Person #PastTense'],
- ['baked', '#PastTense'],
+ // ['baked', '#PastTense'],
['faked', '#PastTense'],
['maked', '#PastTense'],
['mistaked', '#PastTense'],