Skip to main content

ovos-option-matcher-fuzzy-plugin

Fuzzy-match OptionMatcherEngine plugin for OpenVoiceOS.

Resolves a free-form user utterance to one of a predefined set of option slots — the kind of matching needed by OVOSSkill.ask_selection. Supports 15 languages out of the box via locale vocab files, with no required dependency on a number parser.

Install

pip install ovos-option-matcher-fuzzy-plugin

With optional numeric-fallback support (handles positions above 10 and raw digit references):

pip install "ovos-option-matcher-fuzzy-plugin[number-parser]"

How a skill uses it

Skills call self.ask_selection(options, dialog=...). The framework speaks the options to the user, collects a spoken response, then calls FuzzyOptionMatcherPlugin.match_option automatically. No skill code references the plugin directly.

from ovos_workshop.skills.ovos import OVOSSkill

class MySkill(OVOSSkill):
    def handle_intent(self, message):
        choice = self.ask_selection(
            ["play jazz", "play rock", "play classical"],
            dialog="what would you like"
        )
        # choice is one of the list elements, or None if nothing matched
        if choice:
            self.speak_dialog("you_chose", {"choice": choice})

The user can answer with:

  • A direct name: "rock music" — matched by fuzzy scoring
  • An ordinal or cardinal: "the second one", "number two", "two" — matched by locale vocab
  • A last-position reference: "the last one" — matched by last.voc
  • A digit or higher ordinal: "option 7" — matched by ovos-number-parser if installed

ask_selection passes self.lang (canonical BCP-47, e.g. en-US) to the plugin.

How it works

Resolution runs in four stages — first match wins:

  1. Fuzzy match — rapidfuzz WRatio similarity against all options. Returns immediately if score ≥ min_conf (default 0.65).
  2. Last-option vocab — locale-aware last.voc words ("last", "final", "letzte", …). Returns the final option.
  3. Ordinal/cardinal vocab — locale files first.voc … tenth.voc and one.voc … ten.voc. Longest matching phrase wins to avoid false positives (e.g. "one" in "second one").
  4. Numeric fallback — ovos-number-parser (optional). Handles digits and ordinals above ten.

Returns None if nothing matches.

Direct usage

from ovos_option_matcher_fuzzy import FuzzyOptionMatcherPlugin

matcher = FuzzyOptionMatcherPlugin()
options = ["play jazz music", "play rock music", "play classical music"]

matcher.match_option("jazz music", options)                   # "play jazz music"
matcher.match_option("the second one", options)               # "play rock music"
matcher.match_option("three", options)                        # "play classical music"
matcher.match_option("the last option", options)              # "play classical music"
matcher.match_option("die erste", options, lang="de-DE")      # "play jazz music"
matcher.match_option("xyzzy quux", options)                   # None

# Custom confidence threshold
strict = FuzzyOptionMatcherPlugin(config={"min_conf": 0.85})

Note: when the plugin is loaded automatically by ask_selection, it is instantiated with no config, so min_conf is always 0.65. Pass a custom value only when instantiating directly.

Supported languages

Ordinal, cardinal, and last-word vocab is provided for:

Tag Language
ca-ES Catalan
cs-CZ Czech
da-DK Danish
de-DE German
en-US English
es-ES Spanish
eu-ES Basque
fr-FR French
gl-ES Galician
it-IT Italian
nl-NL Dutch
pl-PL Polish
pt-BR Portuguese (Brazil)
pt-PT Portuguese (Portugal)
sv-SE Swedish

Falls back to the language prefix (de-DE → de) then en-US if a locale file is absent. Translations are contributed via the OVOS GitLocalize platform.

Entry point

Registered under opm.agents.option_matcher:

ovos-option-matcher-fuzzy-plugin = ovos_option_matcher_fuzzy:FuzzyOptionMatcherPlugin

This plugin is the default when no ask_selection_plugin is configured. See docs/integration.md for how to switch plugins per-skill or globally.

License

Apache 2.0

Metadata

Release files for ovos-option-matcher-fuzzy-plugin 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ovos-option-matcher-fuzzy-plugin 0.0.1
File Size Uploaded
ovos_option_matcher_fuzzy_plugin-0.0.1.tar.gz 27.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ovos-option-matcher-fuzzy-plugin 0.0.1
File Interpreter ABI Platform
ovos_option_matcher_fuzzy_plugin-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 107.0 kB

Release files / ovos_option_matcher_fuzzy_plugin-0.0.1.tar.gz

Download URL ovos_option_matcher_fuzzy_plugin-0.0.1.tar.gz
Size 27.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a6dc637a60f3f5d1b321bc4e7d4f1c78641ab072b671e977f977a47ce71e53bd
BLAKE2b-256 checksum
How to use checksums
84d812efbdfaf8e0293871b9d59005fcfe6564a9e2392fa4f223c95331a158d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / ovos_option_matcher_fuzzy_plugin-0.0.1-py3-none-any.whl

Download URL ovos_option_matcher_fuzzy_plugin-0.0.1-py3-none-any.whl
Size 80.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e252a7ce16a7f2406fb48d66528c5afde117445a67c2b8f1a648b1b97db30cb0
BLAKE2b-256 checksum
How to use checksums
97e99ca3364f347690df10f5457d84b60e515c0bcb97208e7cd36866e716114b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page