Python中Counter统计字符串时如何归并相似错拼项到标准匹配
基于Counter的错拼输入聚合统计方案
原有Counter统计逻辑不需要重构,直接在其输出结果上做相似度匹配聚合即可,整体实现无额外重型依赖,适配拼写错误、漏空格、多空格这类常见人工输入问题。
- 相似度计算直接使用Python标准库
difflib.SequenceMatcher,不需要安装第三方NLP包,对短文本输入的匹配精度足够覆盖常规错拼场景 - 遍历Counter的键值对,为每一条原始输入匹配相似度最高的标准参考值,设置阈值过滤完全不相关的无效输入
- 聚合时单独拆分「完全匹配标准写法的计数」和「相似错拼写法的总计数」,可选保留错拼明细方便后续校验调整
from collections import Counter from difflib import SequenceMatcher # 配置项:按需调整 STANDARD_INPUTS = ["Input 1", "Input 2"] # 预设的标准参考输入列表 SIMILARITY_THRESHOLD = 0.8 # 相似度阈值,短文本建议设置在0.75-0.85区间 def match_standard_input(raw_text: str, standard_list: list[str]) -> tuple[str | None, float]: """为原始输入匹配最相似的标准值,返回(匹配到的标准值, 相似度得分)""" highest_score = 0 matched_std = None # 预处理:统一转小写、去掉首尾空白,减少格式差异带来的匹配误差 processed_raw = raw_text.strip().lower() for std in standard_list: processed_std = std.strip().lower() score = SequenceMatcher(None, processed_raw, processed_std).ratio() if score > highest_score: highest_score = score matched_std = std # 得分低于阈值则判定为无有效匹配 return (matched_std, highest_score) if highest_score >= SIMILARITY_THRESHOLD else (None, highest_score) # --------------- 原有统计逻辑完全保留 --------------- # 替换为实际读取到的人工输入文本列表 raw_input_list = [ "Input 1", "Input 1", "Input 1", "Input 2", "Input1", "Inpt 1", "Input 2", "Iput 2" ] raw_counter = Counter(raw_input_list) # --------------------------------------------------- # 聚合结果初始化 final_result = { std: { "exact_count": 0, "typo_total_count": 0, "typo_details": dict() } for std in STANDARD_INPUTS } unmatched_total = 0 # 遍历Counter结果做匹配聚合 for raw_text, cnt in raw_counter.items(): matched_std, _ = match_standard_input(raw_text, STANDARD_INPUTS) if not matched_std: unmatched_total += cnt continue # 区分完全匹配和错拼匹配 if raw_text.strip() == matched_std: final_result[matched_std]["exact_count"] += cnt else: final_result[matched_std]["typo_total_count"] += cnt final_result[matched_std]["typo_details"][raw_text] = cnt
运行上述代码后,示例数据的统计结果为:
Input 1完全匹配计数3,错拼总计数2;Input 2完全匹配计数1,错拼总计数2,完全匹配需求中的统计口径。
调优建议
- 如果漏空格场景占比高,可以在相似度计算前增加预处理逻辑,比如移除所有空白字符、特殊符号后再比对,能大幅提升漏输入空格场景的匹配准确率
- 阈值不要设置过低,避免将无关输入错误归类;文本长度越长,阈值可适当下调,长度小于10的短输入阈值建议不低于0.7
- 如果后续遇到谐音、字符顺序错乱等更复杂的错拼场景,只需要替换
match_standard_input里的相似度计算逻辑即可,外层Counter遍历、聚合的代码不需要改动
内容的提问来源于stack exchange,提问作者IRed
相关产品推荐
相关产品推荐

