You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现错误拼写宝可梦名称的相近匹配查询

宝可梦名称拼写近似匹配Python实现方案

核心实现思路

这个需求属于封闭词表下的短文本拼写纠错场景,和Pokemon Showdown图鉴搜索的匹配逻辑完全可以通过轻量方案实现,不需要复杂模型:

  • 首先预处理标准宝可梦名称词表:收集全世代对应语言的官方宝可梦名称(包含形态名),统一转为小写存储,匹配时用户输入也先做转小写、去首尾空格的标准化处理,消除大小写、多余空格的干扰。
  • 选择适配短文本的相似度算法:优先使用Levenshtein编辑距离计算相似度,针对多打/漏打/错打字符的常见拼写错误(比如输入Hooppa比正确名hoopa多打了一个o,属于典型的插入类拼写错误)识别准确率高,计算速度快。可以额外给前缀匹配的结果加权重,和Showdown的搜索优先级对齐——开头字符匹配的名称排序更靠前。
  • 结果过滤:计算完输入和所有词表名称的相似度后,按分数从高到低排序,过滤掉相似度低于阈值的结果,返回TopN匹配项即可。

可直接运行的代码

高性能版本(推荐)

依赖python-Levenshtein库做编辑距离计算,千级词表下匹配延迟低于1ms:

# 安装依赖:pip install python-Levenshtein
from Levenshtein import ratio
from typing import List

# 替换为全量宝可梦名称词表即可,示例为部分名称
POKEMON_NAMES = [
    "hoopa", "pikachu", "charizard", "bulbasaur", "squirtle",
    "hoothoot", "hoppip", "honchkrow", "hapu"
]

def match_fuzzy_pokemon(input_name: str, top_n: int = 3, score_threshold: float = 0.6) -> List[tuple]:
    """
    错误拼写宝可梦名称匹配
    :param input_name: 用户输入的拼写有误的名称
    :param top_n: 最多返回的匹配结果数量
    :param score_threshold: 最低相似度阈值,低于该值的结果会被过滤
    """
    query = input_name.strip().lower()
    candidates = []
    for std_name in POKEMON_NAMES:
        score = ratio(query, std_name)
        # 前两个字符匹配的结果加权重,对齐Showdown搜索优先级
        if std_name.startswith(query[:2]):
            score += 0.1
        if score >= score_threshold:
            candidates.append((std_name, round(score, 3)))
    # 按相似度降序排序
    candidates.sort(key=lambda x: x[1], reverse=True)
    return candidates[:top_n]

# 测试样例
if __name__ == "__main__":
    print(match_fuzzy_pokemon("Hooppa"))
    # 输出: [('hoopa', 0.933), ('hoothoot', 0.667), ('hoppip', 0.615)]

无第三方依赖版本

不需要额外安装库,直接用Python标准库difflib实现,适合不想加依赖的场景:

from difflib import SequenceMatcher
from typing import List

POKEMON_NAMES = [
    "hoopa", "pikachu", "charizard", "bulbasaur", "squirtle",
    "hoothoot", "hoppip", "honchkrow", "hapu"
]

def calc_similarity(a: str, b: str) -> float:
    return SequenceMatcher(None, a, b).ratio()

def match_fuzzy_pokemon(input_name: str, top_n: int = 3, score_threshold: float = 0.6) -> List[tuple]:
    query = input_name.strip().lower()
    candidates = []
    for std_name in POKEMON_NAMES:
        score = calc_similarity(query, std_name)
        if std_name.startswith(query[:2]):
            score += 0.1
        if score >= score_threshold:
            candidates.append((std_name, round(score, 3)))
    candidates.sort(key=lambda x: x[1], reverse=True)
    return candidates[:top_n]

if __name__ == "__main__":
    print(match_fuzzy_pokemon("Hooppa"))
    # 输出: [('hoopa', 0.909), ('hoothoot', 0.667), ('hoppip', 0.6)]

可选优化点

  • 针对带形态后缀的名称(如Mega、Gigantamax、地区形态等),可以做后缀拆分匹配,避免漏打后缀时匹配失败
  • 支持中文名称匹配时,可叠加拼音相似度计算,解决同音字、近形字的拼写错误
  • 词表规模较大(全世代加所有形态超过1000条)时,可先按首字母做分桶预筛选,减少相似度计算的遍历量,进一步提升速度

内容的提问来源于stack exchange,提问作者Kai Hiwatari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:30:44