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.2a1.tar.gz (99.7 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.2a1-py3-none-any.whl (88.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: nebulento-0.10.2a1.tar.gz
  • Upload date:
  • Size: 99.7 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.2a1.tar.gz
Algorithm Hash digest
SHA256 98eed671abc2fb6ee4e1c246c5d2f4eef5291303cfe9e02c1a05cd483e885a13
MD5 2bfd48cee31870fdafe4585dd37ae4db
BLAKE2b-256 3dfbaf697dec55be3e362cf7e274fc442be8fd933a42326b766a7ef0525fe7c1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: nebulento-0.10.2a1-py3-none-any.whl
  • Upload date:
  • Size: 88.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.2a1-py3-none-any.whl
Algorithm Hash digest
SHA256 4338834f3ee955d1dd384ff7726ae9749221a13d9d4dbd725c2ced3ed0d59901
MD5 981a7c81867224b6d97521a47708f37b
BLAKE2b-256 c0514133a24f84a900a7a975b88938e42d6a108b5aa316cf46a1803d8035410c

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