Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Nebulento

Nebulento is a fuzzy-matching intent parser built on rapidfuzz.

Nebulento finds the closest matching intent by comparing an utterance against all training sentences with a configurable fuzzy similarity strategy. It handles spelling errors, word-order variation, contractions, and natural phrasing that exact-match parsers miss. Use it for small-to-medium intent sets: dozens to hundreds of training sentences per intent.


Install

pip install nebulento

For the OVOS pipeline plugin:

pip install "nebulento[ovos]"

Quick start

from nebulento import IntentContainer, MatchStrategy

container = IntentContainer(fuzzy_strategy=MatchStrategy.TOKEN_SET_RATIO)

container.add_intent("hello", ["hello", "hi", "how are you", "what's up"])
container.add_intent("buy", ["buy {item}", "purchase {item}", "get {item} for me"])
container.add_entity("item", ["milk", "cheese"])

container.calc_intent("hello")
# {'name': 'hello', 'conf': 1.0, 'entities': {}, 'best_match': 'hello',
#  'utterance': 'hello', 'utterance_consumed': 'hello', 'utterance_remainder': '',
#  'match_strategy': 'TOKEN_SET_RATIO'}

container.calc_intent("buy milk")
# {'name': 'buy', 'conf': 0.719, 'entities': {'item': ['milk']},
#  'best_match': 'buy {item}', ...}

Template syntax

Syntax Meaning
(one|of|these) Alternation. Expands to one variant per combination
[optional] Optional word or phrase
{entity} Capture group. Matched against registered entity samples

Match strategies

Choose a strategy via IntentContainer(fuzzy_strategy=MatchStrategy.X).

Strategy Best for FP risk
DAMERAU_LEVENSHTEIN_SIMILARITY Spelling errors, lowest false-positive rate Low, default
RATIO Highest recall and F1, fast High
TOKEN_SET_RATIO Natural phrasing, word-order variation High
TOKEN_SORT_RATIO Same words, different order High
PARTIAL_RATIO Substring presence. Avoid for intent gating Very high

See docs/strategies.md for the full comparison table and benchmark rows.


OVOS pipeline plugin

Nebulento ships as an OVOS pipeline plugin (ovos-nebulento-pipeline-plugin).

{
  "intents": {
    "pipeline": [
      "ovos-nebulento-pipeline-plugin"
    ]
  }
}

Configure the fuzzy strategy and confidence thresholds:

{
  "intents": {
    "nebulento": {
      "strategy": "TOKEN_SET_RATIO",
      "conf_high": 0.95,
      "conf_med":  0.80,
      "conf_low":  0.50
    }
  }
}

Entry point: nebulento.opm:NebulentoPipeline


Documentation

Page Description
Quickstart 5-minute guide: intents, entities, strategies
Intent API Full IntentContainer and HierarchicalIntentContainer reference
Match Strategies All 9 strategies with benchmark data and decision table
Template Syntax (a|b), [opt], {slot}, :0 padatious syntax, expansion rules
Entity Extraction Registration, confidence boost, result fields
Normalisation Apostrophes, whitespace, case handling
Hierarchical Matching HierarchicalIntentContainer two-stage matching
OVOS Pipeline Plugin Bus events, confidence tiers, comparison with Padatious
Configuration All config keys with types, defaults, and effect
Benchmark Full accuracy results across all strategies
Troubleshooting False positives, low recall, entity issues, lru_cache gotchas

Benchmark

Benchmarked on two OpenVoiceOS datasets: intents-for-eval and massive. Results below are intents-for-eval (1750 utterances, 50 intents, 1700 match / 50 off-topic):

Engine Accuracy Precision Recall F1 False positives Median
padaos (regex) 51.4% 99.9% 50.0% 0.666 1 / 50 0.39 ms
padatious (neural) 66.1% 99.7% 65.2% 0.789 3 / 50 3.6 ms
nebulento ratio 72.9% 96.9% 74.5% 0.842 40 / 50 4.0 ms
nebulento damerau-levenshtein 69.2% 98.6% 69.3% 0.814 17 / 50 10 ms
python benchmark/compare.py          # both datasets
python benchmark/compare.py massive  # one dataset

See docs/benchmark.md for both datasets, all nine strategies, and the hierarchical variant.


Credits

Originally an experimental research project by TigreGóticoLda, polished and donated to OpenVoiceOS. Its modernization, integration into OpenVoiceOS, and intent benchmarking were funded by the NGI0 Commons Fund.

NGI0 Commons Fund

This project was funded through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 101135429.


License

Apache 2.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nebulento-0.10.3a1.tar.gz (101.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nebulento-0.10.3a1-py3-none-any.whl (90.5 kB view details)

Uploaded Python 3

File details

Details for the file nebulento-0.10.3a1.tar.gz.

File metadata

  • Download URL: nebulento-0.10.3a1.tar.gz
  • Upload date:
  • Size: 101.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nebulento-0.10.3a1.tar.gz
Algorithm Hash digest
SHA256 edbda2b6bb9495d858864e2375cc81081660343af325de79985f18659a28c0f1
MD5 3d0904b86ea6ad4e4fe8c380cb8e8cdf
BLAKE2b-256 f7ec225d486d859c099ef167a6db5b0ddb2158af0585caf2cff74897f9d903c9

See more details on using hashes here.

File details

Details for the file nebulento-0.10.3a1-py3-none-any.whl.

File metadata

  • Download URL: nebulento-0.10.3a1-py3-none-any.whl
  • Upload date:
  • Size: 90.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for nebulento-0.10.3a1-py3-none-any.whl
Algorithm Hash digest
SHA256 b6001b51a0d6cf1370d5a5d2866f93e611f18af243ac087c5a9b7f4723644cb1
MD5 d4d744ef4b8e3bfc76bed93504d4ed8b
BLAKE2b-256 715b40c76bc742f9cb31a7771df78851922d4c32cbf9bca6428fa4532ca8d33a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page