Fix poor fuzzy results due to changes in rapidfuzz 3.0 (#6224)

Co-authored-by: aikaterna <20862007+aikaterna@users.noreply.github.com>
This commit is contained in:
Jakub Kuczys 2023-08-10 07:03:21 +02:00 committed by GitHub
parent 3ac2512c14
commit dbb91dfce8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 8 deletions

View File

@ -7,7 +7,7 @@ import discord
import lavalink import lavalink
from red_commons.logging import getLogger from red_commons.logging import getLogger
from rapidfuzz import process import rapidfuzz
from redbot.core import commands from redbot.core import commands
from redbot.core.i18n import Translator from redbot.core.i18n import Translator
from redbot.core.utils import AsyncIter from redbot.core.utils import AsyncIter
@ -116,7 +116,9 @@ class LocalTrackUtilities(MixinMeta, metaclass=CompositeMetaClass):
to_search_string = { to_search_string = {
i.local_track_path.name for i in to_search if i.local_track_path is not None i.local_track_path.name for i in to_search if i.local_track_path is not None
} }
search_results = process.extract(search_words, to_search_string, limit=50) search_results = rapidfuzz.process.extract(
search_words, to_search_string, limit=50, processor=rapidfuzz.utils.default_process
)
search_list = [] search_list = []
async for track_match, percent_match, __ in AsyncIter(search_results): async for track_match, percent_match, __ in AsyncIter(search_results):
if percent_match > 85: if percent_match > 85:

View File

@ -7,7 +7,7 @@ import discord
import lavalink import lavalink
from red_commons.logging import getLogger from red_commons.logging import getLogger
from rapidfuzz import process import rapidfuzz
from redbot.core import commands from redbot.core import commands
from redbot.core.i18n import Translator from redbot.core.i18n import Translator
from redbot.core.utils import AsyncIter from redbot.core.utils import AsyncIter
@ -132,7 +132,9 @@ class QueueUtilities(MixinMeta, metaclass=CompositeMetaClass):
track_title = track.title track_title = track.title
tracks[queue_idx] = track_title tracks[queue_idx] = track_title
search_results = process.extract(search_words, tracks, limit=50) search_results = rapidfuzz.process.extract(
search_words, tracks, limit=50, processor=rapidfuzz.utils.default_process
)
search_list = [] search_list = []
async for title, percent_match, queue_position in AsyncIter(search_results): async for title, percent_match, queue_position in AsyncIter(search_results):
if percent_match > 89: if percent_match > 89:

View File

@ -6,7 +6,7 @@ from typing import Iterable, List, Mapping, Tuple, Dict, Set, Literal, Union
from urllib.parse import quote_plus from urllib.parse import quote_plus
import discord import discord
from rapidfuzz import process import rapidfuzz
from redbot.core import Config, commands from redbot.core import Config, commands
from redbot.core.commands import Parameter from redbot.core.commands import Parameter
@ -324,7 +324,9 @@ class CustomCommands(commands.Cog):
- `<query>` The query to search for. Can be multiple words. - `<query>` The query to search for. Can be multiple words.
""" """
cc_commands = await CommandObj.get_commands(self.config.guild(ctx.guild)) cc_commands = await CommandObj.get_commands(self.config.guild(ctx.guild))
extracted = process.extract(query, list(cc_commands.keys())) extracted = rapidfuzz.process.extract(
query, list(cc_commands.keys()), processor=rapidfuzz.utils.default_process
)
accepted = [] accepted = []
for key, score, __ in extracted: for key, score, __ in extracted:
if score > 60: if score > 60:

View File

@ -32,7 +32,7 @@ from typing import (
import aiohttp import aiohttp
import discord import discord
from packaging.requirements import Requirement from packaging.requirements import Requirement
from rapidfuzz import fuzz, process import rapidfuzz
from rich.progress import ProgressColumn from rich.progress import ProgressColumn
from rich.progress_bar import ProgressBar from rich.progress_bar import ProgressBar
from red_commons.logging import VERBOSE, TRACE from red_commons.logging import VERBOSE, TRACE
@ -154,7 +154,13 @@ async def fuzzy_command_search(
choices = {c: c.qualified_name for c in commands} choices = {c: c.qualified_name for c in commands}
# Do the scoring. `extracted` is a list of tuples in the form `(cmd_name, score, cmd)` # Do the scoring. `extracted` is a list of tuples in the form `(cmd_name, score, cmd)`
extracted = process.extract(term, choices, limit=5, scorer=fuzz.QRatio) extracted = rapidfuzz.process.extract(
term,
choices,
limit=5,
scorer=rapidfuzz.fuzz.QRatio,
processor=rapidfuzz.utils.default_process,
)
if not extracted: if not extracted:
return None return None