Socket
Socket
Sign inDemoInstall

compromise

Package Overview
Dependencies
Maintainers
3
Versions
169
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

compromise - npm Package Compare versions

Comparing version 14.3.1 to 14.4.0

src/1-one/contraction-one/compute/contractions/number-unit.js

15

changelog.md

@@ -9,5 +9,18 @@ compromise uses semver, and pushes to npm and github frequently

<!-- #### [Unreleased]
<!-- #### 14.4.0 [Unreleased]
-->
#### 14.4.0 [July 2021]
- **[change]** - support root matches like '{walk}' work without doing .compute('root')
- **[change]** - split numbers+units '12km' as contraction - #919
- **[new]** - `.lazy(txt, match)` fast-scan method [1](https://observablehq.com/@spencermountain/compromise-performance)
- **[fix]** - support apostrophes in lexicon #932
- **[fix]** - support unTag property in sweep
- **[change]** - keep sentence caches, when still valid
- **[change]** - alias nlp.compile() to .buildTrie()
- **[fix]** - tagging fixes
- **[update]** - dependencies
_plugin-releases_: dates, speed, de-compromise
#### 14.3.1 [June 2021]

@@ -14,0 +27,0 @@ - **[fix]** - missed caches in .sweep()

10

package.json

@@ -5,3 +5,3 @@ {

"description": "modest natural language processing",
"version": "14.3.1",
"version": "14.4.0",
"main": "./src/three.js",

@@ -101,6 +101,6 @@ "unpkg": "./builds/compromise.js",

"amble": "1.3.0",
"eslint": "8.17.0",
"eslint": "8.19.0",
"eslint-plugin-regexp": "1.7.0",
"nlp-corpus": "4.3.0",
"rollup": "2.75.6",
"nlp-corpus": "4.4.0",
"rollup": "2.75.7",
"rollup-plugin-filesize-check": "0.0.1",

@@ -119,2 +119,2 @@ "rollup-plugin-terser": "7.0.2",

"license": "MIT"
}
}

@@ -515,2 +515,3 @@ <div align="center">

- **[.grow('')](https://observablehq.com/@spencermountain/compromise-match)** - add any matching terms before or after each match
- **[.sweep(net)](https://observablehq.com/@spencermountain/compromise-sweep)** - apply a series of match objects to the document
- **[.splitOn('')](https://observablehq.com/@spencermountain/compromise-split)** - return a Document with three parts for every match ('splitOn')

@@ -577,5 +578,6 @@ - **[.splitBefore('')](https://observablehq.com/@spencermountain/compromise-split)** - partition a phrase before each matching segment

- **[nlp.tokenize()](https://observablehq.com/@spencermountain/compromise-tokenization)** - parse text without running POS-tagging
- **[nlp.plugin()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - mix in a compromise-plugin
- **[nlp.parseMatch()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - pre-parse any match statements for faster lookups
- **[nlp.tokenize(str)](https://observablehq.com/@spencermountain/compromise-tokenization)** - parse text without running POS-tagging
- **[nlp.lazy(str, match)](https://observablehq.com/@spencermountain/compromise-performance)** - scan through a text with minimal analysis
- **[nlp.plugin({})](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - mix in a compromise-plugin
- **[nlp.parseMatch(str)](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - pre-parse any match statements into json
- **[nlp.world()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - grab or change library internals

@@ -585,5 +587,11 @@ - **[nlp.model()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - grab all current linguistic data

- **[nlp.hooks()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - see which compute methods run automatically
- **[nlp.verbose()](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - log our decision-making for debugging
- **[nlp.verbose(mode)](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - log our decision-making for debugging
- **[nlp.version](https://observablehq.com/@spencermountain/compromise-constructor-methods)** - current semver version of the library
- **[nlp.addWords(obj)](https://observablehq.com/@spencermountain/compromise-plugin)** - add new words to the lexicon
- **[nlp.addTags(obj)](https://observablehq.com/@spencermountain/compromise-plugin)** - add new tags to the tagSet
- **[nlp.typeahead(arr)](https://observablehq.com/@spencermountain/compromise-typeahead)** - add words to the auto-fill dictionary
- **[nlp.buildTrie(arr)](https://observablehq.com/@spencermountain/compromise-lookup)** - compile a list of words into a fast lookup form
- **[nlp.buildNet(arr)](https://observablehq.com/@spencermountain/compromise-sweep)** - compile a list of matches into a fast match form
<!-- spacer -->

@@ -590,0 +598,0 @@ <img height="30px" src="https://user-images.githubusercontent.com/399657/68221862-17ceb980-ffb8-11e9-87d4-7b30b6488f16.png"/>

@@ -1,1 +0,1 @@

export default '14.3.1'
export default '14.4.0'

@@ -42,2 +42,3 @@ import { cleanAppend, cleanPrepend } from './lib/insert.js'

const { document, world } = view
view.uncache()
// insert words at end of each doc

@@ -44,0 +45,0 @@ let ptrs = view.fullPointer

@@ -48,2 +48,3 @@ import pluckOutTerm from './lib/remove.js'

const { indexN } = this.methods.one.pointer
this.uncache()
// two modes:

@@ -80,3 +81,2 @@ // - a. remove self, from full parent

}
// self._cache = null
let res = self.toView(ptrs) //return new document

@@ -83,0 +83,0 @@ return res

@@ -36,2 +36,3 @@ const dollarStub = /\$[0-9a-z]+/g

let main = this
this.uncache()
if (typeof input === 'function') {

@@ -38,0 +39,0 @@ return replaceByFn(main, input)

@@ -22,2 +22,3 @@ import methods from './lib/_sort.js'

let { docs, pointer } = this
this.uncache()
if (typeof input === 'function') {

@@ -62,2 +63,5 @@ return customSort(this, input)

ptrs = ptrs.reverse()
if (this._cache) {
this._cache = this._cache.reverse()
}
return this.update(ptrs)

@@ -64,0 +68,0 @@ }

@@ -31,3 +31,3 @@ /*

*/
let start = 0
let index = 0

@@ -41,15 +41,13 @@ const pad3 = (str) => {

let [n, i] = term.index || [0, 0]
start += 1
var now = start;
now = parseInt(now, 10)
index += 1
//don't overflow time
now = now > 46655 ? 46655 : now
//don't overflow index
index = index > 46655 ? 0 : index
//don't overflow sentences
n = n > 46655 ? 46655 : n
n = n > 46655 ? 0 : n
// //don't overflow terms
i = i > 1294 ? 1294 : i
i = i > 1294 ? 0 : i
// 3 digits for time
let id = pad3(now.toString(36))
let id = pad3(index.toString(36))
// 3 digit for sentence index (46k)

@@ -56,0 +54,0 @@ id += pad3(n.toString(36))

@@ -6,2 +6,3 @@ import splice from './_splice.js'

import numberRange from './number-range.js'
import numberUnit from './number-unit.js'

@@ -24,6 +25,2 @@ const byApostrophe = /'/

tmp.ptrs = [[0, start, end]]
tmp.compute('lexicon')
if (tmp.world.compute.preTagger) {
tmp.compute('preTagger')
}
}

@@ -70,3 +67,3 @@

let doc = view.fromText(words.join(' '))
doc.compute('id')
doc.compute(['id', 'alias'])
return doc.docs[0]

@@ -80,2 +77,3 @@ }

let list = model.one.contractions || []
let units = new Set(model.one.units || [])
// each sentence

@@ -116,7 +114,15 @@ document.forEach((terms, n) => {

if (words[2] && words[2].tags.has('Time')) {
methods.one.setTag([words[0]], 'Time', world)
methods.one.setTag([words[0]], 'Time', world, null, 'time-range')
}
reTag(document[n], view, i, words.length)
}
continue
}
// split-apart '4km'
words = numberUnit(terms, i, units)
if (words) {
words = toDocs(words, view)
splice(document, [n, i], words)
methods.one.setTag([words[1]], 'Unit', world, null, 'contraction-unit')
}
}

@@ -123,0 +129,0 @@ })

import contractions from './contractions.js'
export default { one: { contractions } }

@@ -6,3 +6,3 @@ import multiWord from './multi-word.js'

// rest of pre-tagger is in ./two/preTagger
const firstPass = function (view) {
const lexicon = function (view) {
const world = view.world

@@ -22,3 +22,3 @@ view.docs.forEach(terms => {

export default {
lexicon: firstPass
lexicon
}

@@ -7,3 +7,2 @@ // derive clever things from our lexicon key-value pairs

let _multi = {}
// go through each word in this key-value obj:

@@ -14,2 +13,3 @@ Object.keys(words).forEach(word => {

word = word.toLowerCase().trim()
word = word.replace(/'s\b/, '')
// cache multi-word terms

@@ -16,0 +16,0 @@ let split = word.split(/ /)

@@ -1,2 +0,2 @@

import build from './compile/build.js'
import build from './buildTrie/index.js'
import scan from './scan.js'

@@ -3,0 +3,0 @@

import api from './api/index.js'
import compress from './api/compile/compress.js'
import build from './api/compile/build.js'
import compress from './api/buildTrie/compress.js'
import build from './api/buildTrie/index.js'

@@ -8,3 +8,3 @@ /** pre-compile a list of matches to lookup */

/** turn an array or object into a compressed trie*/
compile: function (input) {
buildTrie: function (input) {
const trie = build(input, this.world())

@@ -14,2 +14,4 @@ return compress(trie)

}
// add alias
lib.compile = lib.buildTrie

@@ -16,0 +18,0 @@ export default {

import { fixPointers, isView, isNet } from './_lib.js'
const parseRegs = function (regs, opts, world) {
const one = world.methods.one
if (typeof regs === 'number') {
regs = String(regs)
}
// support param as string
if (typeof regs === 'string') {
regs = one.killUnicode(regs, world)
regs = one.parseMatch(regs, opts, world)
}
return regs
}
const match = function (regs, group, opts) {

@@ -13,7 +26,3 @@ const one = this.methods.one

}
// support param as string
if (typeof regs === 'string') {
regs = one.killUnicode(regs, this.world)
regs = one.parseMatch(regs, opts, this.world)
}
regs = parseRegs(regs, opts, this.world)
let todo = { regs, group }

@@ -24,11 +33,2 @@ let res = one.match(this.docs, todo, this._cache)

view._groups = byGroup
// try to keep some of the cache
// if (this._cache) {
// view._cache = view.ptrs.map(ptr => {
// if (isFull(ptr, this.document)) {
// return this._cache[ptr[0]]
// }
// return null
// })
// }
return view

@@ -47,6 +47,3 @@ }

}
if (typeof regs === 'string') {
regs = one.killUnicode(regs, this.world)
regs = one.parseMatch(regs, opts, this.world)
}
regs = parseRegs(regs, opts, this.world)
let todo = { regs, group, justOne: true }

@@ -71,6 +68,3 @@ let res = one.match(this.docs, todo, this._cache)

}
if (typeof regs === 'string') {
regs = one.killUnicode(regs, this.world)
regs = one.parseMatch(regs, opts, this.world)
}
regs = parseRegs(regs, opts, this.world)
let todo = { regs, group, justOne: true }

@@ -93,6 +87,3 @@ let ptrs = one.match(this.docs, todo, this._cache).ptrs

}
if (typeof regs === 'string') {
regs = one.killUnicode(regs, this.world)
regs = one.parseMatch(regs, opts, this.world)
}
regs = parseRegs(regs, opts, this.world)
let todo = { regs, group, justOne: true }

@@ -127,6 +118,3 @@ let ptrs = this.fullPointer

// otherwise parse the match string
if (typeof regs === 'string') {
regs = one.killUnicode(regs, this.world)
regs = one.parseMatch(regs, opts, this.world)
}
regs = parseRegs(regs, opts, this.world)
let cache = this._cache || []

@@ -133,0 +121,0 @@ let view = this.filter((m, i) => {

@@ -95,2 +95,6 @@ import fuzzy from './_fuzzy.js'

if (reg.fastOr !== undefined) {
// {work/verb} must be a verb
if (reg.pos && !term.tags.has(reg.pos)) {
return null
}
return reg.fastOr.has(term.implicit) || reg.fastOr.has(term.normal) || reg.fastOr.has(term.text) || reg.fastOr.has(term.machine)

@@ -97,0 +101,0 @@ }

@@ -130,10 +130,20 @@ const hasMinMax = /\{([0-9]+)?(, *[0-9]*)?\}/

//machine/sense overloaded
//root/sense overloaded
if (start(w) === '{' && end(w) === '}') {
w = stripBoth(w)
obj.id = w
obj.root = w
if (/\//.test(w)) {
obj.sense = w
obj.greedy = true
} else {
obj.machine = w
let split = obj.root.split(/\//)
obj.root = split[0]
obj.pos = split[1]
if (obj.pos === 'adj') {
obj.pos = 'Adjective'
}
// titlecase
obj.pos = obj.pos.charAt(0).toUpperCase() + obj.pos.substr(1).toLowerCase()
// add sense-number too
if (split[2] !== undefined) {
obj.num = split[2]
}
}

@@ -140,0 +150,0 @@ return obj

import parseBlocks from './01-parseBlocks.js'
import parseToken from './02-parseToken.js'
import splitHyphens from './03-splitHyphens.js'
import postProcess from './04-postProcess.js'
import inflectRoot from './04-inflect-root.js'
import postProcess from './05-postProcess.js'

@@ -21,2 +22,4 @@ /** parse a match-syntax string into json */

tokens = splitHyphens(tokens, world)
// '{walk}'
tokens = inflectRoot(tokens, world)
//clean up anything weird

@@ -23,0 +26,0 @@ tokens = postProcess(tokens, opts)

@@ -35,2 +35,5 @@ import debug from './debug/index.js'

}
if (method === 'root') {
return this.text('root')
}
if (method === 'machine' || method === 'reduced') {

@@ -37,0 +40,0 @@ return this.text('machine')

import parse from './01-parse.js'
// do some indexing on the list of matches
const compile = function (matches, world) {
const buildNet = function (matches, world) {
// turn match-syntax into json

@@ -42,2 +42,2 @@ matches = parse(matches, world)

export default compile
export default buildNet

@@ -15,3 +15,3 @@ import canBe from './canBe.js'

return list.map(todo => {
if (!todo.tag && !todo.chunk) {
if (!todo.tag && !todo.chunk && !todo.unTag) {
return

@@ -18,0 +18,0 @@ }

@@ -44,3 +44,3 @@ const isMulti = / /

term.tags.add(tag)
// now it's dirty
// now it's dirty?
term.dirty = true

@@ -47,0 +47,0 @@ // add a chunk too, if it's easy

@@ -8,3 +8,3 @@ const hasSlash = /\//

const addAliases = function (term, world) {
let str = term.normal || term.text
let str = term.normal || term.text || term.machine
const aliases = world.model.one.aliases

@@ -11,0 +11,0 @@ // lookup known aliases like '&'

@@ -1,3 +0,4 @@

import basicSplit from './01-basic.js'
import isSentence from './02-isSentence.js'
import simpleSplit from './01-simple-split.js'
import simpleMerge from './02-simple-merge.js'
import smartMerge from './03-smart-merge.js'
//(Rule-based sentence boundary segmentation) - chop given text into its proper sentences.

@@ -8,53 +9,18 @@ // Ignore periods/questions/exclamations used in acronyms/abbreviations/numbers, etc.

const startWhitespace = /^\s+/
const hasLetter = /[a-z0-9\u00C0-\u00FF\u00a9\u00ae\u2000-\u3300\ud000-\udfff]/i
const splitSentences = function (text, model) {
let abbrevs = model.one.abbreviations || new Set()
const splitSentences = function (text, world) {
text = text || ''
text = String(text)
let sentences = []
// First do a greedy-split..
let chunks = []
// Ensure it 'smells like' a sentence
if (!text || typeof text !== 'string' || hasSomething.test(text) === false) {
return sentences
return []
}
// cleanup unicode-spaces
text = text.replace('\xa0', ' ')
// Start somewhere:
let splits = basicSplit(text)
// First do a greedy-split..
let splits = simpleSplit(text)
// Filter-out the crap ones
for (let i = 0; i < splits.length; i++) {
let s = splits[i]
if (s === undefined || s === '') {
continue
}
//this is meaningful whitespace
if (hasSomething.test(s) === false || hasLetter.test(s) === false) {
//add it to the last one
if (chunks[chunks.length - 1]) {
chunks[chunks.length - 1] += s
continue
} else if (splits[i + 1]) {
//add it to the next one
splits[i + 1] = s + splits[i + 1]
continue
}
}
//else, only whitespace, no terms, no sentence
chunks.push(s)
}
let chunks = simpleMerge(splits)
//detection of non-sentence chunks:
//loop through these chunks, and join the non-sentence chunks back together..
for (let i = 0; i < chunks.length; i++) {
let c = chunks[i]
//should this chunk be combined with the next one?
if (chunks[i + 1] && isSentence(c, abbrevs, hasLetter) === false) {
chunks[i + 1] = c + (chunks[i + 1] || '')
} else if (c && c.length > 0) {
//this chunk is a proper sentence..
sentences.push(c)
chunks[i] = ''
}
}
let sentences = smartMerge(chunks, world)
//if we never got a sentence, return the given text

@@ -61,0 +27,0 @@ if (sentences.length === 0) {

//all punctuation marks, from https://en.wikipedia.org/wiki/Punctuation
//we have slightly different rules for start/end - like #hashtags.
const startings =
/^[ \n\t.[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*•^†‡°¡¿※№÷׺ª%‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u0027\u201C\u201F\u201B\u201E\u2E42\u201A\u2035\u2036\u2037\u301D\u0060\u301F]+/
/^[ \n\t.[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*•^†‡¡¿※№÷׺ª%‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u0027\u201C\u201F\u201B\u201E\u2E42\u201A\u2035\u2036\u2037\u301D\u0060\u301F]+/
const endings =

@@ -6,0 +6,0 @@ /[ \n\t.'[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*@•^†‡°¡¿※#№÷׺ª‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u201D\u00B4\u301E]+$/

@@ -1,28 +0,8 @@

import sentence from './01-sentences/index.js'
import term from './02-terms/index.js'
import whitespace from './03-whitespace/index.js'
import normalize from '../compute/normal/index.js'
import splitSentences from './01-sentences/index.js'
import splitTerms from './02-terms/index.js'
import splitWhitespace from './03-whitespace/index.js'
import killUnicode from './unicode.js'
import fromString from './parse.js'
import isSentence from './01-sentences/is-sentence.js'
// turn a string input into a 'document' json format
const fromString = function (input, world) {
const { methods, model } = world
const { splitSentences, splitTerms, splitWhitespace } = methods.one.tokenize
input = input || ''
// split into sentences
let sentences = splitSentences(input, model)
// split into word objects
input = sentences.map((txt) => {
let terms = splitTerms(txt, model)
// split into [pre-text-post]
terms = terms.map(splitWhitespace)
// add normalized term format, always
terms.forEach((t) => {
normalize(t, world)
})
return terms
})
return input
}
export default {

@@ -32,5 +12,6 @@ one: {

tokenize: {
splitSentences: sentence,
splitTerms: term,
splitWhitespace: whitespace,
splitSentences,
isSentence,
splitTerms,
splitWhitespace,
fromString,

@@ -37,0 +18,0 @@ },

@@ -6,3 +6,3 @@ // units that are abbreviations too

'gal',
'ft', //ambiguous
// 'ft', //ambiguous
'qt',

@@ -36,10 +36,9 @@ 'pt',

'mb', //megabyte
'gb', //ambig
// 'gb', //ambig
'tb', //terabyte
'lx', //lux
'lm', //lumen
'pa', //ambig
// 'pa', //ambig
'fl oz', //
'yb',
]

@@ -32,3 +32,3 @@ //a hugely-ignorant, and widely subjective transliteration of latin, cryllic, greek unicode characters to english ascii.

t: 'ŢţŤťŦŧƫƬƭƮȚțȶȾΓΤτϮТт',
u: 'µÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưƱƲǓǔǕǖǗǘǙǚǛǜȔȕȖȗɄΰμυϋύ',
u: 'ÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưƱƲǓǔǕǖǗǘǙǚǛǜȔȕȖȗɄΰυϋύ',
v: 'νѴѵѶѷ',

@@ -35,0 +35,0 @@ w: 'ŴŵƜωώϖϢϣШЩшщѡѿ',

@@ -22,4 +22,4 @@ const round = n => Math.round(n * 100) / 100

View.prototype.tagger = function () {
return this.compute(['preTagger', 'contractionTwo', 'postTagger'])
return this.compute(['tagger'])
}
}

@@ -22,2 +22,5 @@ let net = null

export default { postTagger }
// helper function for compute('tagger')
const tagger = (view) => view.compute(['lexicon', 'preTagger', 'postTagger'])
export default { postTagger, tagger }

@@ -29,8 +29,7 @@ export default [

//felt loved
{
match: '(seem|seems|seemed|appear|appeared|appears|feel|feels|felt|sound|sounds|sounded) (#Adverb|#Adjective)? [#PastTense]',
group: 0,
tag: 'Adjective',
reason: 'felt-loved',
},
{ match: '(seem|seems|seemed|appear|appeared|appears|feel|feels|felt|sound|sounds|sounded) (#Adverb|#Adjective)? [#PastTense]', group: 0, tag: 'Adjective', reason: 'felt-loved' },
// seem confused
{ match: '(seem|feel|seemed|felt) [#PastTense]', group: 0, tag: 'Adjective', reason: 'seem-confused' },
// a bit confused
{ match: 'a (bit|little|tad) [#PastTense]', group: 0, tag: 'Adjective', reason: 'a-bit-confused' },
]

@@ -46,7 +46,9 @@ export default [

// thousand and two
{
match: `#Multiple+ and #Value`,
tag: 'Value',
reason: 'magnitude-and-value',
},
{ match: `#Multiple+ and #Value`, tag: 'Value', reason: 'magnitude-and-value' },
// ambiguous units like 'gb'
// { match: '#Value square? [(kb|mb|gb|tb|ml|pt|qt|tbl|tbsp|km|cm|mm|mi|ft|yd|kg|hg|mg|oz|lb|mph|pa|miles|yard|yards|pound|pounds)]', group: 0, tag: 'Unit', reason: '12-gb' },
// 5 miles per hour
{ match: '#Value #Unit [(per|an) (hr|hour|sec|second|min|minute)]', group: 0, tag: 'Unit', reason: '12-miles-per-second' },
// 5 square miles
{ match: '#Value [(square|cubic)] #Unit', group: 0, tag: 'Unit', reason: 'square-miles' },
]

@@ -15,2 +15,10 @@

// 'a rental'
const isEndNoun = function (terms, i) {
if (!terms[i + 1] && terms[i - 1] && terms[i - 1].tags.has('Determiner')) {
return 'Noun'
}
return null
}
const adhoc = {

@@ -21,3 +29,3 @@ 'Adj|Gerund': (terms, i) => {

'Adj|Noun': (terms, i) => {
return isCapital(terms, i)
return isCapital(terms, i) || isEndNoun(terms, i)
},

@@ -24,0 +32,0 @@ 'Adj|Past': (terms, i) => {

@@ -0,1 +1,2 @@

import fillTags from './_fillTags.js'
const env = typeof process === 'undefined' || !process.env ? self.env || {} : process.env // eslint-disable-line

@@ -29,3 +30,3 @@ import adhoc from './_adhoc.js'

if (found && env.DEBUG_TAGS) {
console.log(` \x1b[2m\x1b[3m ↓ - '${term.normal}' (#${found}) \x1b[0m`)//eslint-disable-line
console.log(` \x1b[2m\x1b[3m ↓ - '${term.normal || term.implicit}' (#${found}) \x1b[0m`)//eslint-disable-line
}

@@ -77,3 +78,6 @@ found = obj[found]

if (tag) {
setTag([term], tag, world, null, `3-[variable] (${form})`)
// tag it
setTag([term], tag, world, null, `3-[switch] (${form})`)
// add plural/singular etc.
fillTags(terms, i, model)
} else if (env.DEBUG_TAGS) {

@@ -80,0 +84,0 @@ console.log(`\n -> X - '${str}' : (${form}) `)//eslint-disable-line

@@ -24,2 +24,5 @@ //similar to plural/singularize rules, but not the same

'men',
],
t: [
'feet'
]

@@ -26,0 +29,0 @@ }

@@ -14,3 +14,3 @@

import nounFallback from './3rd-pass/04-fallback.js'
import variables from './3rd-pass/06-switches.js'
import switches from './3rd-pass/06-switches.js'
import checkHyphen from './3rd-pass/05-prefixes.js'

@@ -33,3 +33,3 @@

nounFallback,
variables,
switches,
}

@@ -73,3 +73,3 @@

// verb-noun disambiguation, etc
third.variables(terms, i, world)
third.switches(terms, i, world)
}

@@ -93,4 +93,2 @@ }

}
// leave a nice cache for the next people
view.compute('cache')
return document

@@ -97,0 +95,0 @@ }

@@ -15,2 +15,3 @@ import fancyThings from './byTag.js'

word = word.toLowerCase().trim()
word = word.replace(/'s\b/, '')
// cache multi-word terms

@@ -17,0 +18,0 @@ let split = word.split(/ /)

@@ -36,2 +36,4 @@ import methods from '../../methods/index.js'

'Plural|Verb': 'Plural', //(these are already derivative)
// 'miles'
'Unit|Noun': 'Noun',
}

@@ -38,0 +40,0 @@

@@ -51,2 +51,4 @@ const jj = 'Adjective'

anything: jj,
not: jj,//not swell
me: jj,//called me swell
},

@@ -53,0 +55,0 @@ afterWords: {

@@ -11,2 +11,3 @@ import adjGerund from './adj-gerund.js'

import personPlace from './person-place.js'
import unitNoun from './unit-noun.js'

@@ -24,2 +25,3 @@ const clues = {

'Person|Place': personPlace,
'Unit|Noun': unitNoun,
}

@@ -26,0 +28,0 @@

@@ -14,2 +14,3 @@ // generated in ./lib/lexicon

"Plural": "true¦ones,records",
"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",

@@ -22,14 +23,14 @@ "Imperative": "true¦come here",

"Possessive": "true¦any2its,my,no4o0somet3their1yo0;ur0;!s;o1t0;hing;ne",
"Noun|Verb": "true¦0:7T;1:6L;2:7P;3:80;4:7Z;5:83;6:6Y;7:7J;a7Jb6Uc5Td58e50f4Cg42h3Ui3Oj3Mk3Kl3Am31n2Xo2Tp1Zques7Lr1Bs05tRuPvKwAy9z8;ip,o6C;awn,e1Uie4S;aFeaEhCiAo8re7L;nd0r8;k,ry;mp,n8pe,re,sh,tne83;!d,g;e6Gi8;p,st6;r,th0;it,r8s4t2ve,x;ehou1ra82;aBiAo8;i8lunte0te,w;ce,d;be,ew,s6X;cuum,l38;p8sh0;da4gra4Y;aJeIhrHiGoFrBu9wi8y4M;n,st;n8rn;e,n61;aAe9i8u7;bu4ck,gg0m,p;at,nd;ck,de,in,nsf0p,v5X;ll,ne,r3Qss,t75u2;ck,e,me,p,re;e1Low,u7;ar,e,st;g,l8rg61s4;k,ly;a0Cc07e04hZiXkVlTmSnRou6BpNtDu9w8;ear,it2;b1Wit,m,pp9r8spe5;ge,pri1vey;l8o5A;e57y;aFeEiDoBr9u8y6;dy,ff,mb6;a6Be8i4E;am,ss,t2;cking,p,r8;e,m;ck,t2;m,p;ck,in,ke,ll,mp,nd,r8te,y;!e,t;aAeed,i9la4Jons6Lr8y;ay,e10ink6u3;n,r6Hte;n,rk;ee1Dow;e0Di6o41;eep,i8;ce,p,t;ateboa5Yi8;!p;de,gn8ze;!al;aBeAi9o8;ck,p,w;ft,p,v0;d,i31;pe,re;a9ed,n8rv14t;se,t1W;l,r2t;aBhedu6oAr8;at2e8;en,w;re,ut;le,n,r0H;crifi3il;aTeCiBoAu8;b,in,le,n,s8;h,t;a7ck,ll,ot;de,ng,p,s1A;as5DcMdo,el,fKgJje5lImGnFo0TpDque7sAturn,v8wa5B;e8i1H;al,r1;er5Io9t,u8;lt,me;l5Grt;air,ea8ly,o3X;l,t;dezvo24t;a8edy;ke,rk;ea1i3D;a4Zist0r4C;act5Dorm,u8;nd,se;a8o4Wru4P;ll;ck,i1ke,l46n8tT;ge,k;aYeVhTiQlLoHr9u8;mp,n2rcha1sh;ai1eDiCo8u3J;be,ceAdu3gr8je5mi1te7;am8e5D;!me;ed,ss;ce,de;s8y;er4Ts;iAl8ol,p,re,s2Qw0;i8l;ce,sh;nt,s4H;aAe9u8;g,n3U;ad;ce,n8y;!t;ck,l9n8pe,t,vot;!e;e,ot;a1o8;ne,tograph;ak,e9n,r8t;fu3Tm3W;!l;cka3Ii9n,rt8ss,t2u1;!y;nt,r;bAff0il,o9r8utli2R;d0ie4R;ze;je5;a3KeAo8;d,t8;e,i3;ed,gle5rd,t;aDeBiAo9u8;rd0;d2Snit43p,ve;lk,n2Wrr42x;asu10n3Nr8ss;ge,it;il,n9p,rk2Xs8t2;h,k;da4oeuv0W;aEeBiAo8ump;a8bby,ck,g,ok,ve;d,n;cen1ft,m37nCst;a9c0Bv8;el,y;ch,d,p,se;b9c8nd,t2un2;e,k;el,o23;e2Bi8no3B;ck,ll,ss;am,o15u8;d2Li3;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;aUeQiLlHoErAu8;el,n8zz;c2Ed;a9o8y;st,wn;c8me;tuN;c9g,ol,r8;ce,e1Mm;us;aAe0Iip,o8y;at,od,w8;!er;g,re,sh,vo0X;eBgAl9n8re,sh,t,x;an3i0D;e,m,t0;ht,uC;ld;a9e8n3;d,l;r,tu8;re;ce,il,ll,rm,vo20;cho,nEsCx8ye;cAerci1hib1Jp8tra5;eri8o0H;en3me2I;el,han14;ca8tima4;pe;count0d,gine0vy;aQeKiEoDr9u8ye;b,mp,pli23;aAe9i8;ft,nk,ve;am,ss;ft,in;cu03d0Uubt;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;iBllenNmpi08n9r8se,uffe0E;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:7T;1:6L;2:7P;3:80;4:7Z;5:83;6:6Y;7:7J;8:76;9:6U;a7Lb6Wc5Vd59e51f4Dg43h3Vi3Pj3Nk3Ll3Bm32n2Yo2Up21ques7Nr1Ds07tTuRvMwCyBzA;ip,o6E;awn,e1Wie4T;aHeaGhEiCoAre7N;nd0rA;k,ry;mp,nApe,re,sh,tne85;!d,g;e6IiA;p,st6;r,th0;it,rAs4t2ve,x;ehou1ra84;aDiCoA;iAlunte0te,w;ce,d;be,ew,s8;cuum,l39;pAsh0;da4gra50lo4X;aLeKhrJiIoHrDuBwiAy4N;n,st;nArn;e,n63;aCeBiAu7;bu4ck,gg0m,p;at,nd;ck,de,in,nsf0p,v5Z;ll,ne,r3Rss,t77u2;ck,e,me,p,re;e4Mow,u7;ar,e,st;g,lArg63s4;k,ly;a0Ec09e06h01iZkXlVmUnTou6DpPtFuBwA;ear,it2;b1Xit,m,ppBrAspe5;ge,pri1vey;lAo5C;e59y;aHeGiFoDrBuAy6;dy,ff,mb6;a6DeAi4G;am,ss,t2;cking,p,rA;e,m;ck,t2;m,p;ck,in,ke,ll,mp,nd,rAte,y;!e,t;aCeed,iBla4Lons6NrAy;ay,e41ink6u3;n,r6Jte;n,rk;ee1Eow;e0Fi6o43;eep,iA;ce,p,t;ateboa60iA;!p;de,gnAze;!al;aDeCiBoA;ck,p,w;ft,p,v0;d,i32;pe,re;aBed,nArv15t;se,t1X;l,r2t;aDhedu6oCrA;at2eA;en,w;re,ut;le,n,r0I;crifi3il;aVeEiDoCuA;b,in,le,n,sA;h,t;a7ck,ll,ot;de,ng,p,s1B;as5FcOdo,el,fMgLje5lKmInHo0UpFque7sCturn,vAwa5D;eAi1I;al,r1;er5KoBt,uA;lt,me;l5Irt;air,eaAly,o3Z;l,t;dezvo25t;aAedy;ke,rk;ea1i3F;a51ist0r4E;act5Form,uA;nd,se;aAo4Yru8;ll;ck,i1ke,l48nAtU;ge,k;aZeWhUiRlNoJrBuA;mp,n2rcha1sh;ai1eFiEoAu3L;be,ceCdu3grAje5mi1te7;amAe5F;!me;ed,ss;ce,de;sAy;er4Vs;iClAol,p,re,s2Sw0;iAl;ce,sh;nt,s4J;aBe2AuA;g,n9;ce,nAy;!t;ck,lBnApe,t,vot;!e;e,ot;a1oA;ne,tograph;ak,eBn,rAt;fu3Wm8;!l;cka9iBn,rtAss,t2u1;!y;nt,r;bCff0il,oBrAutli2U;d0ie4U;ze;je5;a3NeCoA;d,tA;e,i3;ed,gle5rd,t;aFeDiCoBuA;rd0;d2Vnit46p,ve;lk,n2Zrr45x;asu12n3QrAss;ge,it;il,nBp,rk30sAt2;h,k;da4oeuv0Y;aGeDiCoAump;aAbby,ck,g,ok,ve;d,n;cen1ft,m8nEst;aBc0DvA;el,y;ch,d,p,se;bBcAnd,t2un2;e,k;el,o26;e2EiAno3E;ck,ll,ss;am,o18uA;d9i3;mpEnBr38ssA;ue;cr1Adex,fluBha6k,se1WterviAvoi3;ew;en3;a5le1R;aEeCiBoAu3U;ld,no1Uok,pe,r1st,u1;ghlight,ke,re,t;aAlp;d,t;ndBrAte;bo32m,ne3Jve7;!le;aIeek,lo3HoHrCuA;arAe3Gi0On;antee,d;aCiBoAumb6;om,u2D;nd,p;dAsp;e,ua4;of,ssip;in,me,ng,s,te,ze;aWeSiNlJoGrCuA;el,nAzz;c2Hd;aBoAy;st,wn;cAme;tuP;cBg,ol,rA;ce,e1Pm;us;aCe0Lip,oAy;at,od,wA;!er;g,re,sh,vo10;eDgClBnAre,sh,t,x;an3i0G;e,m,t0;ht,uE;ld;aBeAn3;d,l;r,tuA;re;ce,il,ll,rm,vo23;cho,nGsExAye;cCerci1hib8pAtra5;eriAo0K;en3me2L;el,han9;caAtima4;pe;count0d,gine0vy;aTeNiHoFrBuAye;b,mp,pli26;aCeBiA;ft,nk,ve;am,ss;ft,in;cu06d9ubt,wnloA;ad;p,sCvA;e,iAor3;de;char9liBpA;at2lay,u4;ke;al,ba4cDfeClBma0Xpos8siAtail;gn,re;ay,ega4;at,ct;liXrA;ea1;ma9n3rAte;e,t;a07ent06hZlWoGrCuA;be,rAt;e,l;aft,eCoBuAy;sh;p,ss,wd;d8ep;de,in,lNmHnCok,py,re,st,uAv0;gh,nAp6;sVt;ceCdu5glomeDstru5tAveI;a5rA;a7ol;ntArn;ra4;biEfoDmCpA;leAou09romi1;me1D;a07e1Cu4;rt;ne;lap1oA;r,ur;aBiA;ck,p;im,w;aBeAip;at,ck,er;iDllen9mpi0AnBrAuffe0G;ge,m,t;ge,nA;el;n,r;er,re;ke,ll,mp,p,rBsh,t2u1ve;se;d,e;aUeRiQlNoJrDuAypa0O;bb6ck6dgBff0lArn,st,zz;ly;et;anEeaDiBoadA;ca7;be,d9;ge;ch,k;ch,d;aCmb,ne,oBss,tt6x,ycott;le;k,st,t;rd,st;aBeAitz,oP;nd;me;as,d,ke,te;aBnef8t;it;r,t;il,lan3nCrgaBsA;e,h;in;!d,g,k;c01dTffilSge,iRlt0nOppLrHssFttDucBwaA;rd;tiA;on;aAempt;ck;i7ocM;st;chBmoA;ur;!iA;ve;eBroa2;ch;al;chAsw0;or;er;d,m,r;ia4;dEvA;an3oA;ca4;te;ce;i5reA;ss;ct;cAhe,t;eCoA;rd,uA;nt;nt,ss",
"Actor": "true¦aJbGcFdCfAgardenIh9instructPjournalLlawyIm8nurse,opeOp5r3s1t0;echnCherapK;ailNcientJecretary,oldiGu0;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": "true¦aObrigadiNcGdFexcellency,fiAliCma9officNp5queen,r2s0taoiseach,vice4;e0ultJ;cond liArgeaB;abbi,e0;ar0verend; adK;astGr0;eside6i0ofessF;me ministFnce0;!ss;gistrate,r4yC;eld mar3rst l0;ady,i0;eutena0;nt;shB;oct6utchess;aptain,hance4o0;lonel,mmand5n0unci3;gress0stable;m0wom0;an;ll0;or;er;d0yatullah;mir0;al",
"Pronoun": "true¦'em,elle,h3i2me,she4th0us,we,you;e0ou;m,y;!l,t;e0im;!'s",
"Singular": "true¦0:58;1:4H;2:57;3:4U;4:4S;5:4N;6:4R;7:51;8:4I;a4Rb46c39d2We2Pf2Fg24h1Sin1Pjel3k1Nl1Km1Bn18o14p0Nqu0Mr0DsUtJuGvCw9;a9ha3Bom2B;f1i4Vt0Ey9;! arou4E;arn4FeAo9;cabu07l52;gKr9;di6t1J;nc34p2RrAs 9;do3Rs55;bani2in0; rex,aIeHhGiEoDrBuAv9;! show;m2In5rntJto16;agedy,ib9o44;e,u2O;p5rq3D;c,de,er,m9;etE;ere,i8;am,mp38;ct5le4x return;aQcOeNhMi2kKoJtEuBy9;ll9n26st4O;ab2O;bAnri19per bowl,r9;f1roga2;st3Ctot0;aCepBipe3Po1ArAudent9;! lo1J;ang1i8;fa1Emo1E;ff1t2Z;loi40meo15;elet12i9;er,ll,rm3K;ack,or47;ab0Tcurity gu2C;e4ho9;l2Yol;la31;av0VeChetor5iAo9;de4om;te,v9;erb0M;bCcBf9publ5r0Nspi2;er9orm1;e4r0;it0ord label;a2u40;estion mark,ot27;aMeKhJiHlFort0rAu9yram1B;ddi8ppy,rpo0I;eCie3Go9;bl3Ts9;pe6t9;a2itu2;diction,mi0Droga7ss relea0D;a9ebisci2;q26te,y1;cn5e9g;!r;armaci37otocoH;dest0ncil,r9t0;cen3Fsp3G;nAr2Qte9;!nt;el2Qop3;bj3CcApia2rde0thers,ve9wn1;n,rview;cu9e0E;pi1;aAit23ot9umb1;a24hi8;n28rra7;aFeEiDoAu9é0F;m0Rr0;mAnopo3pPrni8sq1Ot9u12;h1i34;!my;li0Vn08;d5nu,t0;mm0nd11te9yf3;ri0;aurea2iAu9;ddi2nch;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;an9enadi1id;a16d9; slam,fa9mo9;th1;d,lf1;lat0Dntlem9;an;df3r9;l5n1D;aHeGiElDol3rAun9;er0;ee market,iAon9;ti1;e16ga2;ame,u2;nan9ref3;ci1;lla,t14;br5mi3n0Uth1;conoEffDgg,lecto0MnCs1Xth5venBxAyel9;id;ampTempl0Ite4;i8t;er1K;e6i1J;my;adKeGiDoAr9u0P;agonf3i1;cAg1Fi3or,ssi1wn9;si0M;to0BumenB;ale6gniAnn1s9vide0O;conte4incen7tri6;ta0A;aBc0fAni0te9;c7rre4;ault 05err0;th;!dy;aXeVhOiNlLoDr9;edit cBit5uc9;ib9;le;ard;efficFke,lDmmuniqNnBpi1rr0t11u9yo2;ri1s9;in;ne6s9;ervatoVuI;ic,lQum9;ni0L;ie4;er9ie4;gy,ic;ty,vil wL;aDeqCocoBr9;istmas car9ysanthemum;ol;la2;ue;ndeli1racter9;ist5;ili8llDr9;e0tifica2;hi1naFpErCshi1t9ucus;erpi9hedr0;ll9;ar;bohyd9ri1;ra2;it0;ry;aPeOiMlemLoHrDu9;ddhiYnBr9tterf3;glar9i0;!y;ny;eakBiAo9;!th1;de;faRthroC;dy,g,roBwl,y9;!frie9;nd;ugh;ish;cyc9oH;liK;an,l3;nki8r9;!ri1;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;cru0eAqui9;tt0;ta2;te;al",
"Singular": "true¦0:59;1:4I;2:58;3:4V;4:4T;5:4O;6:4S;7:52;8:4J;a4Sb47c3Ad2Xe2Qf2Gg25h1Tin1Qjel3k1Ol1Lm1Bn18o14p0Nqu0Mr0DsUtJuGvCw9;a9ha3Com2C;f1i4Wt0Ey9;! arou4F;arn4GeAo9;cabu07l53;gKr9;di6t1K;nc35p2SrAs 9;do3Ss56;bani2in0; rex,aIeHhGiEoDrBuAv9;! show;m2Jn5rntJto16;agedy,ib9o45;e,u2P;p5rq3E;c,de,er,m9;etE;ere,i8;am,mp39;ct5le4x return;aQcOeNhMi2kKoJtEuBy9;ll9n27st4P;ab2P;bAnri1Aper bowl,r9;f1roga2;st3Dtot0;aCepBipe3Qo1BrAudent9;! lo1K;ang1i8;fa1Fmo1F;ff1t30;loi41meo16;elet13i9;er,ll,rm3L;ack,or48;ab0Ucurity gu2D;e4ho9;l2Zol;la32;av0WeChetor5iAo9;de4om;te,v9;erb0N;bCcBf9publ5r0Ospi2;er9orm1;e4r0;it0ord label;a2u41;estion mark,ot28;aMeKhJiHlFort0rAu9yram1C;ddi8ppy,rpo0J;eCie3Ho9;bl3Us9;pe6t9;a2itu2;diction,mi0Eroga7ss relea0E;a9ebisci2;q27te,y1;cn5e9g;!r;armaci38otocoH;dest0ncil,r9t0;cen3Gsp3H;nAr2Rte9;!nt;el2Rop3;bj3DcApia2rde0thers,ve9wn1;n,rview;cu9e0F;pi1;aAit24ot9umb1;a25hi8;n29rra7;aFeEiDoAu9é0G;m0Sr0;mAnopo3pQrni8sq1Pt9u13;h1i35;!my;li0Wn09;d5nu,t0;mm0nAte9yf3;ri0;!d10;aurea2iAu9;ddi2nch;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;an9enadi1id;a16d9; slam,fa9mo9;th1;d,lf1;lat0Dntlem9;an;df3r9;l5n1D;aHeGiElDol3rAun9;er0;ee market,iAon9;ti1;e16ga2;ame,u2;nan9ref3;ci1;lla,t14;br5mi3n0Uth1;conoEffDgg,lecto0MnCs1Xth5venBxAyel9;id;ampTempl0Ite4;i8t;er1K;e6i1J;my;adKeGiDoAr9u0P;agonf3i1;cAg1Fi3or,ssi1wn9;si0M;to0BumenB;ale6gniAnn1s9vide0O;conte4incen7tri6;ta0A;aBc0fAni0te9;c7rre4;ault 05err0;th;!dy;aXeVhOiNlLoDr9;edit cBit5uc9;ib9;le;ard;efficFke,lDmmuniqNnBpi1rr0t11u9yo2;ri1s9;in;ne6s9;ervatoVuI;ic,lQum9;ni0L;ie4;er9ie4;gy,ic;ty,vil wL;aDeqCocoBr9;istmas car9ysanthemum;ol;la2;ue;ndeli1racter9;ist5;ili8llDr9;e0tifica2;hi1naFpErCshi1t9ucus;erpi9hedr0;ll9;ar;bohyd9ri1;ra2;it0;ry;aPeOiMlemLoHrDu9;ddhiYnBr9tterf3;glar9i0;!y;ny;eakBiAo9;!th1;de;faRthroC;dy,g,roBwl,y9;!frie9;nd;ugh;ish;cyc9oH;liK;an,l3;nki8r9;!ri1;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;cru0eAqui9;tt0;ta2;te;al",
"Preposition": "true¦'o,-,aLbIcHdGexcept,fFinEmid,notwithstandiRoCpSqua,sBt7u4v2w0;/o,hereNith0;!in,oR;ersus,i0;a,s-a-vis;n1p0;!on;like,til;h0ill,owards;an,r0;ough0u;!oI;ans,ince,o that;',f0n1ut;!f;!to;or,rom;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:2S;1:1Z;2:27;a2Gb27c1Xd1Oe1Gf1Ag13h0Wi0Pj0Ok0Nl0Im08n06o05pZrUsIt9v7w3;a5i4oo3;d,l;ldlife,ne;rm8t2;ernacul1Ui3;neg1Tol0Otae;eAh9oothpas1Nr4un3yranny;a,gst1V;aff29ea18o4ue nor3;th;oZu3;ble3se1Ft;!shoot1X;ermod2Cund2;a,nnis;aCcene0JeBhAil9ki8o7p6t4u3weepstak1;g1Inshi12;ati02e3;am,el;ace24eci1;ap,cc2;n,ttl1;k,v2;eep,ingl1;na15ri1;d0Ofe1Wl3nd,t0C;m1Lt;a6e4ic3;e,ke0W;c3laxa0Tsearch;ogni0Srea0S;bi1in;aWe7hys0last1Lo5re3;amble,mis1s3ten1L;en1Ksu0D;l3rk;it0yC;a1Ptr07;bstetr0vercrowd17xyg10;a3ews;il polXtional securi1H;aAe8o5u3;m3s1B;ps;n3o1A;ey,o3;gamy;a3chan0rchandi17tallurgy;sl1t;chine3themat0; learn0Vry;aught2e6i5ogi4u3;ck,g0X;c,st0;ce,ghtn0Rngui1AteraSv2;ath2isuSss;ara09indergart0Inowled0U;azz,ewelD;ce,gnor8mp5n3;formaZter3;net,sta05;a3ort5;ti3;en0Z;an0Y;a6eIisto5o3;ckey,mework,ne3rserad7spitali0R;s0Qy;ry;ir,libYppiGs3;h3te;ish;ene6l5o4r3um,ymna0S;aDeed;lf,re;utZyce0D; 3t0;edit04po3;ol;aMicFlour,o5urni3;tu3;re;od,rgive3uri2wl;ne3;ss;conom0duca9lectr8n6quip7th0very4xper3;ti04;body,o3thU;ne;joy3tertain3;ment;ici02on0;tiR;e9i6o4raugh3ynas00;ts;pe,wnstai3;rs;abet1s3;honUrepu3;te;b3miQ;ut;aBelciAh7iv0l5o3urrency;al,ld w3nfusiGral,ttGusco9;ar;ass0oth1;es;aos,e4ick3;en;eHw8;us;d,rJ;a8eef,i6lood,read,u3;nt4tt2;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",
"Person|Noun": "true¦a07b01cYdRePfOgMhJjFkClBm9olive,p6r3s2trini00v0wang;an,enus,iol0;a,et;ky,on5umm03;ay,e1o0uby;b9d,se;ed,x;atQe0ol;aIn0;ny;a0eloTiles;x,ya;aBeo,iG;elv1i0;ng,tM;in;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:26;1:25;2:1W;3:1I;4:1Y;a24b1Nc1Bd15en13f0Xg0Vh0Si0Qjog1Zk0Ol0Km0Hn0Fo0Bp04ques07rVsFtAunder9volunt14w5yCzo2;a7ed1Ri3or6r5;ap1Nest1Bi1;ki0r1N;i1r2s1Ttc1T;st1Mta4;al4e8hin4i7ra5y1J;c4di0i2v5;el15;mi0p1G;a1Xs1;ai12cHeGhEin1OkatClYmo4nowBpeAt8u6w5;ea3im1T;f01r5;fi0vi0I;a1Kretc1Iu5;d1AfI;l0Wn1B;b6i0;eb5i0;oar18;ip14o5;rte2u1;a1r09t1;h6o3re5;a1Ge2;edu0Noo0N;aCe8i11o6u5;li0n2;o5wi0;fi0;a7c6hear1Cnde3por1struct5;r1Au3;or0Vyc0G;di0so2;p0Qti0;aAeacek9la8o6r5ublis0X;a0Peten0Rin1oces16;iso2si5;tio2;n2yi0;ee0K;cka0Tin1rt0K;f7pe6rgani5vula1;si0zi0;ni0ra1;fe3;e5ur0W;gotia1twor4;a6e5i2onito3;e1ssa0L;nufactu3rke1;a7ea6i5od0Jyi0;cen0Qf1s1;r2si0;n09ug0E;i5n0J;c4lS;ci0magi2n5ro2;nova1terac1;andPea1i6o5un1;l03wO;ki0ri0;athe3rie5ui01;vi0;ar0CenHi7l6or5ros1unZ;ecas1mat1;ir1ooX;l6n5;anDdi0;i0li0;di0gin5;ee3;a8eba1irec1o7r5umO;awi0es05i5;n4vi0;ub1wnloaO;n5ti0;ci0;aEelebra1hClAo7r5ur6;aw5osZ;li0;a6di0lo3mplai2n5o4pi0ve3;duc1sul1;cLti0;apCea3imHo5ubH;ni0tJ;a5ee3;n1t1;m8s1te3;ri0;aIeFitDlCoAr8u5;il8ll6r5;pi0;yi0;an5;di0;a1m5o4;bi0;esGoa1;c5i0;hi0;gin2lon5t1;gi0;ni0;bys6c4ki0;ki0;it1;c8dverti7gi0rg6ssu5;mi0;ui0;si0;coun1ti0;ti0;ng",
"Unit": "true¦0:0X;a0Sb0Qc0Cd0Bex0Af07g04he02in0Ljoule0kVlSmInHoGpDquart0square 9t5volts,w4y2ze3°1µs;c,f,n;a0Dd0Jears old,o1;tt07;att0b;able3e2on1;!ne0;a1r03;spoY;c0Ad09f3i07kilo0Bm1ya06;e0Eil1;e0li09;eet0o05;ascals,e2i1ou0I;c0Fnt0;rcent,tV;hms,uS;an0CewtP;/s,e6i1m²,²,³;/h,cro4l1;e1li03;! pFs 1²;anFpE;g02s07;gMter1;! 2s1;! 1;per second;it2u1;men0x;er0re0;elvins,ilo2m1nM;/h,²;byUgSmeter1;! p2s1;! p1;er1; hour;ct1rtz0;aTogM;all2ig6ra1;in0m0;on0;a2emtMluid ou1tE;nce0;hrenheit,rad0;abyH;eciCmA;arat0eAm9oulomb0u1;bic 1p0;c5d4fo3i2meAya1;rd0;nch0;ot0;eci2;enti1;me4;²,³;lsius,nti1;g2li1me1;ter0;ram0;bl,y1;te0;c4tt1;os1;eco1;nd0;re0;!s",
"Adj|Noun": "true¦0:0S;a0Rb0Mc0Cde0Be06f00gZhomel08iXjuWlVmPnOoNpMrJsBt7u4va2w1;atershed,elcome;gabo4nilla,ria1;b0Dnt;ndergr1pstairs;adua0Jou1;nd;a3e1oken,ri0;en,r1;min0ror0B;boo,n;e6istZo4qua3ta2u1;bordina0Cper6;b03ndard;re,t;cial05l1;e,ve0G;cret,n1ri0;ior;e1outiIubbish;ar,laUnt0p1;resentaTublican;atie0Aeriodic0otenti0rincip0;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",
"Person|Noun": "true¦a05bZcWdPeNfMgKhHjDkiClBm9olive,p6r3s2triniYv0wang;an,enus,iol0;a,et;ky,on5umm01;ay,e1o0uby;bin,d,se;ed,x;atOe0ol;aGn0;ny;a0eloR;x,ya;a9eo,iE;ng,tL;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",
"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:0S;a0Rb0Mc0Cde0Be06f00gZhomel08iXjuWlVmPnOoNpMrJsBt7u4va2w1;atershed,elcome;gabo4nilla,ria1;b0Dnt;ndergr1pstairs;adua0Jou1;nd;a3e1oken,ri0;en,r1;min0ror0B;boo,n;e6istZo4qua3ta2u1well;bordina0Cper6;b03ndard;re,t;cial05l1;e,ve0G;cret,n1ri0;ior;e1outiIubbish;ar,laUnt0p1;resentaTublican;atie0Aeriodic0otenti0rincip0;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",
"ProperNoun": "true¦barbie,c4diego,e3f2kirby,m0nis,riel;ercedes,i0;ckey,ssy;inn,ranco;lmo,uro;atalina,hristi",

@@ -64,5 +65,5 @@ "Ordinal": "true¦eBf7nin5s3t0zeroE;enDhir1we0;lfCn7;d,t3;e0ixt8;cond,vent7;et0th;e6ie7;i2o0;r0urt3;tie4;ft1rst;ight0lev1;e0h,ie1;en0;th",

"Adj|Past": "true¦0:2T;1:2K;2:2N;3:23;a2Db28c1Qd1Ae14f0Zgift0h0Wi0Pj0Oknown,l0Lm0Gn0Eo0Bp04qua03rUsEtAu8v6w4;arp0ea4or6;kIth2N;a4e0V;ri0;ni4pd1s0;fi0t0;ar6hreatDr4wi2M;a4ou18;ck0in0pp0;get0ni1K;aHcaGeFhEimDm01oak0pBt7u4;bsid23gge2Hs4;pe4ta1O;ct0nd0;at0e6r4uV;ength4ip0;en0;am0reotyp0;eci4ik0ott0;al1Vfi0;pIul1;ar0ut;al0c1Fle2t1N;r0tt21;t4ut0;is3ur1;aBe4;c8duc0f19g7l1new0qu6s4;pe2t4;or0ri2;e1Yir0;ist1Tul1;eiv0o4;mme0Ard0v1R;lli0ti3;li3;arallel0l8o7r4ump0;e5o4;c0Ilo0Hnou1Ppos0te2;fe0Koc9pZ;i1Cli0P;a4e15;nn0;c5rgan17verlo4;ok0;cupi0;e4ot0;ed0gle2;a6e5ix0o4;di3t0E;as0Nlt0;n4rk0;ag0ufact0L;eft,i5o4;ad0st;cens0mit0st0;agg0us0K;mp9n4sol1;br0debt0f7t4volv0;e4ox0C;gr1n4re14;d0si3;e2oW;li0oMrov0;amm0We1o4;ok0r4;ri3;aNe7i6lavo06ocus0r4;a4i0;ct04g0Im0;niVx0;ar0;duc1n8quipp0stabliTx4;p4te6;a5e4;ct0rie0O;nd0;ha0MsW;aIeAi4;gni3miniMre2s4;a7c6grun01t4;o4rBurb0;rt0;iplPou05;bl0;cenTdMf8lay0pr7ra6t4velop0;a4ermM;il0;ng0;ess0;e5o4;rm0;rr0;mag0t0;alcul1eHharg0lGo9r6u4;lt4stomR;iv1;a5owd0u4;sh0;ck0mp0;d0lo9m6n4ok0vW;centr1s4troll0;idUolid1;b5pl4;ic1;in0;ur0;assi3os0;lebr1n6r4;ti3;fi0;tralB;a7i6o4urn0;il0r0t4und;tl0;as0;laJs0;bandon0cKdHffe2lEnCppAss8u4ward0;g5thor4;iz0;me4;nt0;o6u4;m0r0;li0re4;ci1;im1ticip1;at0;leg0t4;er0;ct0;ju5o7va4;nc0;st0;ce4knowledg0;pt0;ed",
"Person|Verb": "true¦b1chu2drew,grant,ja2ma0ollie,pat,rob,sue,wade;ck,rk;ob,u0;ck",
"Person|Verb": "true¦b2ch1drew,grant,ja3ma0ollie,pat,rob,sue,wade;ck,rk;ase,u1;ob,u0;ck",
"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"
}

@@ -10,2 +10,19 @@ //words that can't be compressed, for whatever reason

'km2': 'Unit',
'm2': 'Unit',
'dm2': 'Unit',
'cm2': 'Unit',
'mm2': 'Unit',
'mile2': 'Unit',
'in2': 'Unit',
'yd2': 'Unit',
'ft2': 'Unit',
'm3': 'Unit',
'dm3': 'Unit',
'cm3': 'Unit',
'in3': 'Unit',
'ft3': 'Unit',
'yd3': 'Unit',
// ampersands

@@ -12,0 +29,0 @@ 'at&t': 'Organization',

@@ -19,5 +19,5 @@ // generated in ./lib/pairs

"PastTense": {
"rules": "een|1,egan|2in,on|in,pun|1in,hun|3ned,wn|1,ave|ive,poke|1eak,hose|2ose,roke|1eak,roze|1eeze,ode|ide,orbade|3id,hone|1ine,tole|1eal,ollide|6d,rose|1ise,woke|1ake,wrote|2ite,made|2ke,came|1ome,ove|ive,ore|ear,elped|3,elcomed|6,hared|4,nvited|5,eclared|6,eard|3,avelled|4,ombined|6,uided|4,etired|5,choed|3,ncelled|4,epeated|5,moked|4,entred|5,dhered|5,esired|5,ompeted|6,erseded|6,ramed|4,qualled|4,iloted|4,stponed|6,uelled|3,opelled|4,gnored|5,xtruded|6,caled|4,ndured|5,lamed|4,quared|5,mpeded|5,rouped|4,efeated|5,robed|4,lid|3e,magined|6,nselled|4,uthored|6,ebuted|4,shrined|6,tialled|4,erfered|6,eaped|3,yped|3,laked|4,tirred|3,ooted|3,leated|4,ncited|5,oubted|4,mpelled|4,nnulled|4,pined|4,ircled|5,ecited|5,reathed|6,nvaded|5,onfided|6,pedited|6,alcined|6,ycotted|5,dmired|5,xcreted|6,ubed|3,taked|4,onfined|6,heated|4,rimed|4,amelled|4,achined|6,litzed|4,xcited|5,xpelled|4,xtolled|4,ouled|3,imicked|4,ivalled|4,eeped|3,naked|4,tyled|4,iased|3,nhaled|5,oeuvred|6,grammed|6,kied|2,miled|4,pited|4,lodded|3,eterred|4,hoked|4,kidded|3,rod|3ded,pleted|5,cided|4,plored|5,stored|5,longed|4,filed|4,rbed|2,suaded|5,ciled|4,edded|2,tined|4,phoned|5,fled|3,nited|4,iped|3,hauled|4,treated|5,nnelled|4,basted|5,njured|5,twined|5,uzzed|3,did|1o,vided|4,old|ell,pared|4,mbed|2,stood|2and,pired|4,held|1old,vened|4,cored|4,read|4,piled|4,aped|3,gled|3,named|4,arred|2,oated|3,kled|3,ooled|3,uned|3,figured|6,bid|3,ound|ind,oped|2,ibed|3,quired|5,uled|3,oded|3,mmed|1,ceded|4,cured|4,sided|4,voked|4,rled|2,outed|3,mined|4,urred|2,ighted|4,umed|3,sured|4,iked|3,pled|3,fed|1,bbed|1,eled|2,luded|4,aid|1y,ferred|3,tled|3,dled|3,raded|4,oted|3,eed|2,aled|2,lined|4,mped|2,fted|2,lted|2,gged|1,eted|2,xed|1,bled|3,pted|2,tured|4,uted|3,nned|1,ued|2,iled|2,yed|1,rted|2,pped|1,tted|1,wed|1,lled|2,ited|2,med|1,sted|2,ssed|2,ged|2,ved|2,nted|2,ked|1,cted|2,ced|2,ied|y,hed|1,sed|2,ded|1,zed|2,ned|1,red|1,ated|3,ell|all,ulfil|5led,rought|1ing,hought|1ink,eft|1ave,eant|3,ealt|3,eat|3,hot|2ot,urt|3,eapt|3,elt|1el,went|go,built|4d,at|it,got|1et,ut|2,it|2,et|2,ent|2d,ept|1ep,st|2,truck|2ike,nuck|1eak,tunk|1ink,ank|ink,ook|ake,lew|1y,utgrow|4ew,drew|2aw,saw|1ee,ew|ow,ug|ig,ang|ing,ung|ing,nderlay|5ie,dezvous|7,wam|1im,lam|3med,nearth|6s",
"rules": "een|1,egan|2in,on|in,pun|1in,hun|3ned,wn|1,ave|ive,poke|1eak,hose|2ose,roke|1eak,roze|1eeze,ode|ide,orbade|3id,hone|1ine,tole|1eal,ollide|6d,rose|1ise,woke|1ake,wrote|2ite,made|2ke,came|1ome,ove|ive,ore|ear,elped|3,elcomed|6,hared|4,nvited|5,eclared|6,eard|3,avelled|4,ombined|6,uided|4,etired|5,choed|3,ncelled|4,epeated|5,moked|4,entred|5,dhered|5,esired|5,ompeted|6,erseded|6,ramed|4,qualled|4,iloted|4,stponed|6,uelled|3,opelled|4,gnored|5,xtruded|6,caled|4,ndured|5,lamed|4,quared|5,mpeded|5,rouped|4,efeated|5,robed|4,lid|3e,magined|6,nselled|4,uthored|6,ebuted|4,shrined|6,tialled|4,erfered|6,eaped|3,yped|3,laked|4,tirred|3,ooted|3,leated|4,ncited|5,oubted|4,mpelled|4,nnulled|4,pined|4,ircled|5,ecited|5,reathed|6,nvaded|5,onfided|6,pedited|6,alcined|6,ycotted|5,dmired|5,xcreted|6,ubed|3,taked|4,onfined|6,heated|4,rimed|4,amelled|4,achined|6,litzed|4,xcited|5,xpelled|4,xtolled|4,ouled|3,imicked|4,ivalled|4,eeped|3,naked|4,tyled|4,iased|3,nhaled|5,oeuvred|6,grammed|6,kied|2,miled|4,pited|4,lodded|3,eterred|4,hoked|4,kidded|3,rod|3ded,pleted|5,cided|4,plored|5,stored|5,longed|4,filed|4,rbed|2,suaded|5,ciled|4,edded|2,tined|4,phoned|5,fled|3,nited|4,iped|3,hauled|4,treated|5,nnelled|4,basted|5,njured|5,twined|5,uzzed|3,did|1o,vided|4,old|ell,pared|4,mbed|2,stood|2and,pired|4,held|1old,vened|4,cored|4,read|4,piled|4,aped|3,gled|3,named|4,arred|2,oated|3,kled|3,ooled|3,uned|3,figured|6,bid|3,ound|ind,oped|2,ibed|3,quired|5,uled|3,oded|3,mmed|1,ceded|4,cured|4,sided|4,voked|4,rled|2,outed|3,mined|4,urred|2,ighted|4,umed|3,sured|4,iked|3,pled|3,fed|1,bbed|1,eled|2,luded|4,aid|1y,ferred|3,tled|3,dled|3,raded|4,oted|3,eed|2,aled|2,lined|4,mped|2,fted|2,lted|2,gged|1,eted|2,xed|1,bled|3,pted|2,tured|4,uted|3,nned|1,ued|2,iled|2,yed|1,rted|2,pped|1,tted|1,wed|1,lled|2,ited|2,med|1,sted|2,ssed|2,ged|2,ved|2,nted|2,ked|1,cted|2,ced|2,ied|y,hed|1,sed|2,ded|1,zed|2,ned|1,red|1,ated|3,ell|all,ulfil|5led,rought|1ing,hought|1ink,eft|1ave,eant|3,ealt|3,eat|3,hot|2ot,urt|3,eapt|3,elt|1el,went|go,built|4d,at|it,got|1et,ut|2,it|2,et|2,ent|2d,ept|1ep,st|2,truck|2ike,nuck|1eak,tunk|1ink,ank|ink,ook|ake,lew|1y,utgrow|4ew,drew|2aw,saw|1ee,ew|ow,ug|ig,ang|ing,ung|ing,nderlay|5ie,dezvous|7,wam|1im,lam|3med",
"exceptions": "was|is,were|are,had|2ve,led|2ad,met|2et,cited|4,focused|5,sought|1eek,lost|3e,defined|6,died|3,hired|4,bought|1uy,ran|1un,controlled|7,taught|1each,hoped|4,shed|4,refined|6,caught|2tch,owed|3,fought|1ight,fired|4,fed|2ed,pied|3,fared|4,tied|3,fled|3e,cared|4,ate|eat,dyed|3,lit|2ght,winged|4,bred|3ed,pent|3,wired|4,persevered|9,baked|4,dined|4,fined|4,shored|5,hid|3e,padded|3,waned|4,wove|1eave,lied|3,wasted|5,sloped|5,joked|4,ached|4,baled|4,bit|3e,bled|3ed,boned|4,caned|4,dispelled|6,egged|3,hung|1ang,patrolled|6,tasted|5,faked|4,bored|4,eyed|3,gamed|4,gassed|3,pored|4,timed|4,toned|4,zoned|4,poked|4,dared|4,been|2,said|2y,found|1ind,took|1ake,came|1ome,gave|1ive,fell|1all,brought|2ing,rose|1ise,grew|2ow,put|3,sent|3d,spent|4d,spoke|2eak,left|2ave,won|1in,told|1ell,meant|4,heard|4,got|1et,arose|2ise,read|4,let|3,hit|3,cost|4,dealt|4,laid|2y,drove|2ive,sat|1it,cast|4,beat|4,flew|2y,lent|3d,sang|1ing,banned|3,jarred|3,wound|1ind,omitted|4,quit|4,rang|1ing,fit|3,rent|3d,bet|3,sank|1ink,reaped|4,manned|3,rode|1ide,rebutted|5,bound|1ind,barred|3,recast|6,netted|3,tanned|3,plotted|4,tore|1ear,spun|2in,pitted|3,shone|2ine,donned|3,dove|1ive,spat|2it,bent|3d,blown|4,leapt|4,seeped|4,sewn|3,twinned|4,wrung|2ing,deterred|5",
"rev": "egin|2an,lan|3ned,nderpin|7ned,kin|3ned,tun|3ned,hin|3ned,pan|3ned,can|3ned,n|1ed,ecome|2ame,hoose|2se,trike|2uck,lee|2d,trive|2ove,vercome|4ame,lide|3,reeze|1oze,hake|1ook,nderlie|5ay,istake|3ook,etake|2ook,wake|1oke,write|2ote,make|2de,rtake|2ook,see|1aw,e|1d,elp|3ed,roup|4ed,oop|3ed,velop|5ed,eep|1pt,mp|2ed,p|1ped,hink|1ought,eek|ought,reak|1oke,neak|1uck,tink|1unk,rink|1ank,k|1ed,ommit|5ted,ermit|5ted,oadcast|7,dmit|4ted,hoot|2t,plit|4,hut|3,llot|4ted,nit|3ted,orget|3ot,egret|5ted,hrust|5,ormat|5ted,hat|3ted,lat|3ted,urt|3,cquit|5ted,urst|4,ransmit|7ted,emit|4ted,pot|3ted,cut|3,submit|6ted,set|3,t|1ed,now|1ew,trew|4n,utgrew|4ow,draw|2ew,throw|3ew,w|1ed,uy|ought,ey|2ed,pay|2id,oy|2ed,ay|2ed,y|ied,ravel|5led,ancel|5led,qual|4led,uel|3led,ounsel|6led,nitial|6led,nnul|4led,namel|5led,xtol|4led,ival|4led,teal|1ole,eel|1lt,trol|4led,sell|1old,nnel|4led,pel|3led,l|1ed,ransfer|7red,pur|3red,lur|3red,tir|3red,par|3red,nfer|4red,wear|1ore,bear|1ore,efer|4red,cur|3red,r|1ed,pread|5,hed|3,rind|1ound,mbed|4ded,reed|2d,hred|4ded,eread|5,orbid|3ade,leed|2d,lod|3ded,kid|3ded,ollided|6,lammed|3,hunned|3,rodded|3,lfilled|4,build|4t,stand|2ood,hold|1eld,bid|3,d|1ed,cho|3ed,go|went,do|1id,tem|3med,um|2med,rim|3med,kim|3med,wim|1am,m|1ed,lug|3ged,ig|ug,pring|2ang,gg|2ed,ang|ung,long|4ed,og|2ged,ling|1ung,ag|2ged,ub|2bed,ib|2bed,ob|2bed,rb|2ed,ab|2bed,mb|2ed,imic|4ked,dezvous|7,nearths|6,s|1ed,ki|2ed,z|1ed,f|1ed,x|1ed,h|1ed"
"rev": "egin|2an,lan|3ned,nderpin|7ned,kin|3ned,tun|3ned,hin|3ned,pan|3ned,can|3ned,n|1ed,ecome|2ame,hoose|2se,trike|2uck,lee|2d,trive|2ove,vercome|4ame,lide|3,reeze|1oze,hake|1ook,nderlie|5ay,istake|3ook,etake|2ook,wake|1oke,write|2ote,make|2de,rtake|2ook,see|1aw,e|1d,elp|3ed,roup|4ed,oop|3ed,velop|5ed,eep|1pt,mp|2ed,p|1ped,hink|1ought,eek|ought,reak|1oke,neak|1uck,tink|1unk,rink|1ank,k|1ed,ommit|5ted,ermit|5ted,oadcast|7,dmit|4ted,hoot|2t,plit|4,hut|3,llot|4ted,nit|3ted,orget|3ot,egret|5ted,hrust|5,ormat|5ted,hat|3ted,lat|3ted,urt|3,cquit|5ted,urst|4,ransmit|7ted,emit|4ted,pot|3ted,cut|3,submit|6ted,set|3,t|1ed,now|1ew,trew|4n,utgrew|4ow,draw|2ew,throw|3ew,w|1ed,uy|ought,ey|2ed,pay|2id,oy|2ed,ay|2ed,y|ied,ravel|5led,ancel|5led,qual|4led,uel|3led,ounsel|6led,nitial|6led,nnul|4led,namel|5led,xtol|4led,ival|4led,teal|1ole,eel|1lt,trol|4led,sell|1old,nnel|4led,pel|3led,l|1ed,ransfer|7red,pur|3red,lur|3red,tir|3red,par|3red,nfer|4red,wear|1ore,bear|1ore,efer|4red,cur|3red,r|1ed,pread|5,hed|3,rind|1ound,mbed|4ded,reed|2d,hred|4ded,eread|5,orbid|3ade,leed|2d,lod|3ded,kid|3ded,ollided|6,lammed|3,hunned|3,rodded|3,lfilled|4,build|4t,stand|2ood,hold|1eld,bid|3,d|1ed,cho|3ed,go|went,do|1id,tem|3med,um|2med,rim|3med,kim|3med,wim|1am,m|1ed,lug|3ged,ig|ug,pring|2ang,gg|2ed,ang|ung,long|4ed,og|2ged,ling|1ung,ag|2ged,ub|2bed,ib|2bed,ob|2bed,rb|2ed,ab|2bed,mb|2ed,imic|4ked,dezvous|7,s|1ed,ki|2ed,z|1ed,f|1ed,x|1ed,h|1ed"
},

@@ -24,0 +24,0 @@ "PresentTense": {

@@ -58,4 +58,4 @@ export default [

[/^[0-9]{1,2}(:[0-9][0-9])?(am|pm)? ?[-–—] ?[0-9]{1,2}(:[0-9][0-9])?(am|pm)$/, ['Time', 'NumberRange'], '3-4pm'],
//with unit
//number with unit
[/^[0-9.]+([a-z]{1,4})$/, 'Value', '9km'],
]

@@ -6,9 +6,9 @@ export default {

Month: {
is: 'Singular',
also: ['Date'],
is: 'Date',
also: ['Noun'],
not: ['Year', 'WeekDay', 'Time'],
},
WeekDay: {
is: 'Noun',
also: ['Date'],
is: 'Date',
also: ['Noun'],
},

@@ -33,4 +33,4 @@ Year: {

Timezone: {
is: 'Noun',
also: ['Date'],
is: 'Date',
also: ['Noun'],
not: ['ProperNoun'],

@@ -37,0 +37,0 @@ },

@@ -31,2 +31,3 @@ import find from './find.js'

hasComma: parsed.hasComma,
unit: parsed.unit
}

@@ -33,0 +34,0 @@ return json

@@ -18,5 +18,5 @@ const prefixes = {

// s: 'seconds',
cm: 'centimetres',
km: 'kilometres',
ft: 'feet',
// cm: 'centimetres',
// km: 'kilometres',
// ft: 'feet',
'°': 'degrees'

@@ -23,0 +23,0 @@ }

@@ -45,2 +45,4 @@ import parseText from './toNumber/index.js'

let str = m.text('reduced')
// reach for '12 litres'
let unit = m.growRight('#Unit').match('#Unit$').text('machine')
// is it in '3,123' format?

@@ -53,2 +55,3 @@ let hasComma = /[0-9],[0-9]/.test(m.text('text'))

res.hasComma = hasComma
res.unit = unit
return res

@@ -80,6 +83,8 @@ }

}
return {
hasComma: hasComma,
hasComma,
prefix: '',
num: num,
num,
suffix: '',

@@ -90,4 +95,5 @@ isOrdinal: m.has('#Ordinal'),

isMoney: m.has('#Money'),
unit
}
}
export default parseNumber

@@ -145,3 +145,3 @@ import { noop, getTense } from '../lib.js'

vb = forms[form](vb, parsed)
vb.fullSentence().compute(['lexicon', 'preTagger', 'postTagger', 'chunks'])
vb.fullSentence().compute(['tagger', 'chunks'])
return vb

@@ -148,0 +148,0 @@ }

@@ -31,5 +31,5 @@ import { getTense, isAreAm } from '../lib.js'

vb.replace('not are', 'are not')
vb.fullSentence().compute(['preTagger', 'postTagger', 'chunks'])
vb.fullSentence().compute(['tagger', 'chunks'])
return vb
}
export default toGerund

@@ -202,3 +202,3 @@ import { noop, getTense, wasWere, noWill } from '../lib.js'

vb = forms[form](vb, parsed)
vb.fullSentence().compute(['lexicon', 'preTagger', 'postTagger', 'chunks'])
vb.fullSentence().compute(['tagger', 'chunks'])
return vb

@@ -205,0 +205,0 @@ }

@@ -227,3 +227,3 @@ import { noop, isPlural, isAreAm, doDoes, getSubject, toInf, getTense } from '../lib.js'

vb = forms[form](vb, parsed)
vb.fullSentence().compute(['lexicon', 'preTagger', 'postTagger', 'chunks'])
vb.fullSentence().compute(['tagger', 'chunks'])
return vb

@@ -230,0 +230,0 @@ }

@@ -0,1 +1,3 @@

// wrappers for loops in javascript arrays
const forEach = function (cb) {

@@ -12,7 +14,10 @@ let ptrs = this.fullPointer

let ptrs = this.fullPointer
// let cache = this._cache || []
let res = ptrs.map((ptr, i) => {
let view = this.update([ptr])
// view._cache = cache[i]
return cb(view, i)
let out = cb(view, i)
// if we returned nothing, return a view
if (out === undefined) {
return this.none()
}
return out
})

@@ -44,10 +49,7 @@ if (res.length === 0) {

let ptrs = this.fullPointer
// let cache = this._cache || []
ptrs = ptrs.filter((ptr, i) => {
let view = this.update([ptr])
// view._cache = cache[i]
return cb(view, i)
})
let res = this.update(ptrs) //TODO: keep caches automatically
// res._cache = ptrs.map(ptr => cache[ptr[0]])
let res = this.update(ptrs)
return res

@@ -58,6 +60,4 @@ }

let ptrs = this.fullPointer
// let cache = this._cache || []
let found = ptrs.find((ptr, i) => {
let view = this.update([ptr])
// view._cache = cache[i]
return cb(view, i)

@@ -70,6 +70,4 @@ })

let ptrs = this.fullPointer
// let cache = this._cache || []
return ptrs.some((ptr, i) => {
let view = this.update([ptr])
// view._cache = cache[i]
return cb(view, i)

@@ -76,0 +74,0 @@ })

@@ -37,3 +37,2 @@ const utils = {

let ptr = this.pointer
let cache = this._cache || []
if (!ptr) {

@@ -43,5 +42,3 @@ ptr = this.docs.map((_doc, i) => [i])

if (ptr[n]) {
let view = this.update([ptr[n]])
view._cache = cache[n]
return view
return this.update([ptr[n]])
}

@@ -48,0 +45,0 @@ return this.none()

@@ -76,15 +76,16 @@ import world from './world.js'

// send the cache down, too?
if (m._cache && pointer && pointer.length > 1) {
// only if it's full
if (this._cache && pointer && pointer.length > 0) {
// only keep cache if it's a full-sentence
let cache = []
pointer.forEach(ptr => {
pointer.forEach((ptr, i) => {
let [n, start, end] = ptr
if (ptr.length === 1) {
cache.push(m._cache[ptr[0]])
cache[i] = this._cache[n]
} else if (start === 0 && this.document[n].length === end) {
cache[i] = this._cache[n]
}
// let [n, start, end] = ptr
// if (start === 0 && this.document[n][end - 1] && !this.document[n][end]) {
// console.log('=-=-=-= here -=-=-=-')
// }
})
m._cache = cache
if (cache.length > 0) {
m._cache = cache
}
}

@@ -96,8 +97,3 @@ m.world = this.world

toView(pointer) {
if (pointer === undefined) {
pointer = this.pointer
}
let m = new View(this.document, pointer)
// m._cache = this._cache // share this full thing
return m
return new View(this.document, pointer || this.pointer)
}

@@ -104,0 +100,0 @@ fromText(input) {

@@ -41,3 +41,2 @@ import View from './API/View.js'

/** extend compromise functionality */

@@ -44,0 +43,0 @@ nlp.plugin = function (plugin) {

@@ -5,2 +5,3 @@ import nlp from './one.js'

import postTag from './2-two/postTagger/plugin.js'
import lazy from './2-two/lazy/plugin.js'
import swap from './2-two/swap/plugin.js'

@@ -11,4 +12,5 @@

nlp.plugin(postTag) //~33kb
nlp.plugin(lazy) //
nlp.plugin(swap) //
export default nlp

@@ -78,2 +78,16 @@ export type Document = Term[][]

caseSensitive?: boolean,
}
export interface Match {
match: string,
tag?: string | string[],
unTag?: string | string[],
group?: string | number,
reason?: string,
}
export interface Net {
hooks: object,
always?: any,
isNet: boolean
}

@@ -1,2 +0,2 @@

import { Lexicon, Plugin, matchOptions } from './misc'
import { Lexicon, Plugin, matchOptions, Match, Net } from './misc'
import View from './view/one'

@@ -11,2 +11,4 @@

export function tokenize(text: string, lexicon?: Lexicon): View
/** scan through text with minimal analysis */
export function lazy(text: string, match?: string): View
/** mix-in a compromise plugin */

@@ -35,3 +37,5 @@ export function plugin(plugin: Plugin): any

/** turn a list of words into a searchable graph */
export function compile(words: string[]): object
export function buildTrie(words: string[]): object
/** compile a set of match objects to a more optimized form */
export function buildNet(matches: Match[]): Net
/** add words to the autoFill dictionary */

@@ -38,0 +42,0 @@ export function typeahead(words: Lexicon): any

@@ -1,2 +0,2 @@

import { Lexicon, Plugin, matchOptions } from './misc'
import { Lexicon, Plugin, matchOptions, Match, Net } from './misc'
import View from './view/three'

@@ -11,2 +11,4 @@

export function tokenize(text: string, lexicon?: Lexicon): View
/** scan through text with minimal analysis */
export function lazy(text: string, match?: string): View
/** mix in a compromise-plugin */

@@ -33,3 +35,5 @@ export function plugin(plugin: Plugin): any

/** turn a list of words into a searchable graph */
export function compile(words: string[]): object
export function buildTrie(words: string[]): object
/** compile a set of match objects to a more optimized form */
export function buildNet(matches: Match[]): Net
/** add words to the autoFill dictionary */

@@ -36,0 +40,0 @@ export function typeahead(words: Lexicon): any

@@ -1,2 +0,2 @@

import { Lexicon, Plugin, matchOptions } from './misc'
import { Lexicon, Plugin, matchOptions, Match, Net } from './misc'
import View from './view/two'

@@ -11,2 +11,4 @@

export function tokenize(text: string, lexicon?: Lexicon): View
/** scan through text with minimal analysis */
export function lazy(text: string, match?: string): View
/** mix in a compromise-plugin */

@@ -33,3 +35,5 @@ export function plugin(plugin: Plugin): any

/** turn a list of words into a searchable graph */
export function compile(words: string[]): object
export function buildTrie(words: string[]): object
/** compile a set of match objects to a more optimized form */
export function buildNet(matches: Match[]): Net
/** add words to the autoFill dictionary */

@@ -36,0 +40,0 @@ export function typeahead(words: Lexicon): any

@@ -1,2 +0,2 @@

import { Document, Pointer, Groups, JsonProps, outMethods, matchOptions, Term } from '../misc'
import { Document, Pointer, Groups, JsonProps, outMethods, matchOptions, Term, Net } from '../misc'

@@ -84,11 +84,11 @@ class View {

/** return matching patterns in this doc */
match: (match: string | View, group?: string | number, options?: matchOptions) => View
match: (match: string | View | Net, group?: string | number, options?: matchOptions) => View
/** return only the first match */
matchOne: (match: string | View, group?: string | number, options?: matchOptions) => View
matchOne: (match: string | View | Net, group?: string | number, options?: matchOptions) => View
/** Return a boolean if this match exists */
has: (match: string | View, group?: string | number, options?: matchOptions) => boolean
has: (match: string | View | Net, group?: string | number, options?: matchOptions) => boolean
/** return each current phrase, only if it contains this match */
if: (match: string | View, group?: string | number, options?: matchOptions) => View
if: (match: string | View | Net, group?: string | number, options?: matchOptions) => View
/** Filter-out any current phrases that have this match */
ifNo: (match: string | View, group?: string | number, options?: matchOptions) => View
ifNo: (match: string | View | Net, group?: string | number, options?: matchOptions) => View

@@ -105,2 +105,4 @@ /** return the terms before each match */

grow: (match: string | View, group?: string | number, options?: matchOptions) => View
/** apply a sequence of match objects to the document */
sweep: (match: Net, opts?: object) => { view: View, found: object[] }

@@ -107,0 +109,0 @@ /** .split() [alias] */

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc