
Created 2025-09-23
/**
 * ============================================================================
 * =                          Hello Compromise                                =
 * ============================================================================
 *
 * This example explores how to use the `compromise` library to process natural
 * language. The content is adapted from the official documentation:
 *
 * https://github.com/spencermountain/compromise
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *                             Getting Started
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * First, we import the `compromise` library and change a verb to its past
 * tense for a sentence.
 */
const nlp = await recho.require("compromise");
//➜ View { ptrs: undefined }
const doc = echo(nlp("she sells seashells by the seashore."));
//➜ View { ptrs: [ [ 0, 1, 2, "sold|0JG000003", "sold|0JG000003" ] ] }
echo(doc.verbs().toPastTense());
//➜ "she sells seashells by the seashore."
echo(doc.text());
/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *                       Finding and Matching Patterns
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * Next, we can find and match patterns in the sentence. Similar to regex, but
 * we match with meaning instead of symbols.
 */
//➜ true
echo(doc.has("she #Verb"));
//➜ "she sells seashells by the seashore."
echo(doc.match("she #Verb seashells by the seashore").text());
/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *                            Getting Data
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * We can extend the library with plugins. Then we can get the data from the
 * sentence.
 */
const plg = await recho.require("compromise-speech");
nlp.extend(plg);
const doc2 = nlp("Milwaukee has certainly had its share of visitors..");
doc2.compute("syllables");
//➜ [
//➜   {
//➜     text: "Milwaukee",
//➜     terms: [
//➜       {
//➜         text: "Milwaukee",
//➜         pre: "",
//➜         post: " ",
//➜         tags: [ "Noun", "Singular", "Place", "ProperNoun", "City" ],
//➜         normal: "milwaukee",
//➜         index: [ 0, 0 ],
//➜         id: "milwaukee|0IE00000J",
//➜         chunk: "Noun",
//➜         dirty: true,
//➜         syllables: [ "mil", "waukee" ]
//➜       }
//➜     ]
//➜   }
//➜ ]
echo(doc2.places().json(), {indent: 2, limit: Infinity});
/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *                         Avoiding Brittle Parsers
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * We can avoid the problems of brittle parsers:
 */
const doc3 = nlp("we're not gonna take it..");
//➜ true
echo(doc3.has("gonna"));
//➜ true
echo(doc3.has("going to"));
//➜ Contractions { ptrs: [] }
echo(doc.contractions().expand());
//➜ "she sells seashells by the seashore."
echo(doc.text());
/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *                            Whipping Stuff Around
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * We can whip stuff around like it's data:
 */
//➜ "ninety five thousand and seventy two"
{
  const doc = nlp("ninety five thousand and fifty two");
  doc.numbers().add(20);
  echo(doc.text());
}
/**
 * because it's actually is:
 */
//➜ "the purple dinosaurs"
{
  const doc = nlp("the purple dinosaur");
  doc.nouns().toPlural();
  echo(doc.text());
}