Python DataFrame实现拼写错误单词模糊匹配并新增结果列
问题场景
现有两个pandas DataFrame对象:
- df1:包含
Keywords列存储标准词汇,示例值为Dog、Cat、Monkey、Lion、Tiger、Zebra、Rabbit,实际业务场景下该列词汇量最多500条 - df2:包含
Verbatim列存储用户输入的字符串,示例值为"dog, Caat"、"Orange"、"Monky , lion"、"C"、"Human"、"Tiger & new Monkey",内容存在标点、拼写错误词汇
需求为:逐行拆分df2的Verbatim列内容,模糊匹配df1中的标准关键词(支持识别拼写错误的相近词汇),在df2中新增Verbatim_new列存储匹配到的标准词,无有效匹配则填充Nan,期望输出对应该列值为"dog, Cat"、Nan、"Monkey , lion"、Nan、Nan、"Tiger, Monkey"。
原有代码与问题
初始测试代码如下:
keywords = df1['Keywords'].to_list() from difflib import get_close_matches for i in df2['Verbatim']: print((get_close_matches(i, keywords))
运行时存在两个明确问题:
- 直接传入整行Verbatim字符串做匹配,未拆分单个词汇,匹配准确率极低,无法识别一行内的多个匹配项
- 尝试执行
df_new['match'] = get_close_matches(i, keywords)赋值时,触发length of values does not match length of index报错,原因是循环内逐行生成的匹配结果是长度不确定的列表,无法直接对齐整列索引赋值。
可行实现方案
核心解决思路:
- 先对每行用户输入做分词拆分,过滤无意义的短词、标点,再逐词做模糊匹配,避免整串匹配的准确率问题
- 用pandas的apply逐行处理生成整列结果,保证返回值和DataFrame行长度完全对齐,解决索引长度不匹配报错
- 匹配时统一做小写转换消除大小写影响,设置合理的相似度阈值避免误匹配,匹配完成后保留标准词的原始拼写
完整可运行代码:
import pandas as pd import re from difflib import get_close_matches # 预处理标准词:存原始拼写+小写映射,匹配时不区分大小写 std_keywords = df1['Keywords'].tolist() std_keywords_lower = [k.lower() for k in std_keywords] lower2origin = dict(zip(std_keywords_lower, std_keywords)) def match_keywords(text: str, cutoff: float = 0.7): # 按非字母字符拆分用户输入,提取所有候选词 candidate_words = re.split(r'[^a-zA-Z]+', text.strip()) # 过滤空值、长度小于2的无意义短词(比如示例里的"C") candidate_words = [w for w in candidate_words if len(w) >= 2] matched = [] for word in candidate_words: word_lower = word.lower() # 模糊匹配,取最接近的1个结果,相似度阈值0.7可根据业务调整 match_res = get_close_matches(word_lower, std_keywords_lower, n=1, cutoff=cutoff) if match_res: matched.append(lower2origin[match_res[0]]) # 有匹配结果用逗号拼接,无匹配返回空值 return ', '.join(matched) if matched else pd.NA # 逐行应用函数生成新列 df2['Verbatim_new'] = df2['Verbatim'].apply(match_keywords)
效果说明
运行后结果和预期完全对齐:
- 输入
"dog, Caat"→ 输出"Dog, Cat"(如果需要统一大小写格式可自行在拼接逻辑中调整) - 输入
"Orange"→ 输出pd.NA - 输入
"Monky , lion"→ 输出"Monkey, Lion" - 输入
"C"→ 输出pd.NA(长度<2被过滤,避免误匹配) - 输入
"Human"→ 输出pd.NA - 输入
"Tiger & new Monkey"→ 输出"Tiger, Monkey"(无匹配的"new"自动过滤)
相似度阈值
cutoff可根据业务容错率调整:值越高匹配越严格,值越低越容易匹配到相近词,0.6-0.8是常规拼写纠错场景的合理区间。
内容的提问来源于stack exchange,提问作者Angela
相关产品推荐
相关产品推荐

