Files
spencermountain-compromise/plugins/payload/README.md
T

3.0 KiB

An ad-hoc datastore for compromise
npm install compromise-payload

This plugin provides a facilty for storing a retreiving more complex data than tags, for compromise documents and matches.

Payload

import plg from 'compromise-payload'
nlp.extend(plg)

let doc = nlp('i saw John Lennon in Manchester, and Bob Dylan in Southhampton')

// markup metadata
doc.match('(john lennon|bob dylan)').addPayload({ instrument: 'guitar' })

// add more
doc.people().forEach(m => {
  if (m.has('lennon')) {
    m.addPayload({ height: `5'11` })
  }
  if (m.has('ringo')) {
    m.addPayload({ height: `5'8` })
  }
})

// retrieve specific payloads
doc.match('john lennon').getPayloads()
doc.match('bob dylabn').getPayloads()

// retrieve them all
doc.getPayloads()

// inspect given payloads:
doc.debug('payload')

You can also pass a callback into .addPayload():

let doc = nlp('i saw John Lennon, and john smith and bob dylan')
doc.people().addPayload(m => {
  return { lastName: m.terms().last().text() }
})

You can remove all, or selected payloads with .clearPayload():

doc.match('bob .').clearPayloads()
doc.getPayloads().length // now 2

doc.clearPayloads()
doc.getPayloads().length // now 0

Limitations

Payloads are saved by sentence number and term position, in one store that every document from the same nlp shares. That means:

  • Removing a sentence breaks the payloads that come after it. They move to the wrong sentence, and the last one can go missing. Add payloads after you remove sentences, or add them again. Changing words inside a sentence is fine.
let doc = nlp('One is red. Two is blue. Three is green.')
doc.match('(red|blue|green)').forEach(m => m.addPayload({ color: m.text() }))
doc.remove('two is blue')
doc.getPayloads().map(p => [p.match.text(), p.val.color])
// [['red', 'red'], ['Three is green', 'blue']]
  • A new document can see payloads from an older one at the same sentence and term positions. Call .clearPayloads() on a document when you are done with it.
nlp('the red car').match('car').addPayload({ kind: 'vehicle' })
nlp('a blue bike').getPayloads().length // 1, from the first document

See #1188.

MIT