Fuzzy matching for exercise references in WPL-AI.
Provides "Did you mean?" suggestions when unknown exercise references are encountered during parsing. Uses Jaro-Winkler distance for similarity matching, which is effective for typo detection.
Examples
iex> ExerciseMatcher.suggest("pushup")
["push_up"]
iex> ExerciseMatcher.suggest("squats")
["squat"]
iex> ExerciseMatcher.suggest("benchpress")
["bench_press"]
Summary
Functions
Get all known exercise references.
Find the best match for an unknown reference, if similarity is high enough.
Get exercises by category.
Check if an exercise reference is known.
Suggest similar exercise references for an unknown reference.
Validate an exercise reference, returning suggestions if unknown.
Functions
Get all known exercise references.
Find the best match for an unknown reference, if similarity is high enough.
Returns {:ok, match} if similarity > 0.85, otherwise :no_match.
This is useful for auto-correction.
Examples
iex> ExerciseMatcher.best_match("pushup")
{:ok, "push_up"}
iex> ExerciseMatcher.best_match("xyz")
:no_match
Get exercises by category.
Check if an exercise reference is known.
Examples
iex> ExerciseMatcher.known?("push_up")
true
iex> ExerciseMatcher.known?("pushup")
false
Suggest similar exercise references for an unknown reference.
Returns up to 3 suggestions sorted by similarity (best match first). Only returns suggestions with similarity > 0.7 to avoid noise.
Examples
iex> ExerciseMatcher.suggest("pushup")
["push_up"]
iex> ExerciseMatcher.suggest("squats")
["squat"]
iex> ExerciseMatcher.suggest("xyz123")
[]
Validate an exercise reference, returning suggestions if unknown.
Returns :ok if known, or {:unknown, suggestions} if not.
Examples
iex> ExerciseMatcher.validate("push_up")
:ok
iex> ExerciseMatcher.validate("pushup")
{:unknown, ["push_up"]}