调研CSV预处理:硬编码匹配效率低,如何快速归类不规则课程名
自由填报课程名的高效分组匹配方案
现有手写if规则的核心局限
- 需人工穷举所有大小写、标点、空格、拼写差异的文本变体,新增匹配规则的边际成本极高,大量未覆盖的变体最终会落到
misc分类中 - 未做前置文本归一化处理,同一特征的不同格式要单独写判断分支,代码冗余度很高
- 部分判断逻辑容易出现错分,比如单独把
CSE、Biotech划入B.Tech类,会将非目标课程误归类
低成本可落地的优化方案
前置:统一文本归一化清洗
所有待匹配文本先做通用标准化处理,从根源上消除格式差异带来的重复规则:
import re def normalize_raw_text(raw_input): # 去首尾空白、统一转小写 cleaned = str(raw_input).strip().lower() # 移除所有点号、连字符、多余空格,消除格式差异 cleaned = re.sub(r'[.\-\s]+', '', cleaned) return cleaned
处理后,B.A. L.L.B.、Ballb、bal.l.b.等不同写法的文本会被转换为统一形态的可比对字符串,无需为每种格式单独写判断条件。
替换冗长if分支为字典映射逻辑
将原有判断逻辑改为可维护的键值对映射表,后续新增规则只需要修改字典内容,不需要改动判断链条:
# 映射关系:归一化后的文本特征 -> 课程标准名 course_mapping = { "be": "B.E.", "ballb": "B.A. LLB", "btech": "B. Tech", "bpharm": "B. Pharma", "pharmacy": "B. Pharma", "bba": "BBA", "mba": "MBA", "mtech": "M. Tech", "mbbs": "MBBS", "bsc": "B. Science", "msc": "M. Science" } def map_course(normalized_text): # 逐特征匹配,命中即返回对应标准名 for feature_key, standard_name in course_mapping.items(): if feature_key in normalized_text: return standard_name return "misc"
匹配流程调用
直接结合pandas完成批量处理与频次统计,代码结构更简洁:
# 第一步:清洗原始课程名 df1['cleaned_course'] = df1['Course Name'].apply(normalize_raw_text) # 第二步:映射为标准课程名 df1['Course Name'] = df1['cleaned_course'].apply(map_course) # 第三步:统计各课程频次 course_frequency = df1['Course Name'].value_counts()
进阶降低维护成本的方法
针对现有规则无法覆盖的长尾变体,不需要手动逐一枚举:
- 先筛选所有被归类为
misc的原始课程值,基于字符串相似度做自动聚类(可借助difflib.get_close_matches实现),把相似度高于阈值的文本归为同一候选组,人工仅需确认每组对应的标准课程名即可 - 确认后的聚类特征直接补充到
course_mapping字典中即可,无需调整核心判断逻辑
匹配注意事项
- 避免设置过于宽泛的匹配特征,比如原规则中直接将
CSE划入B.Tech类,容易把独立填写的其他学科代码错分,设置特征词前需确认匹配边界 - 归一化处理完成后,原有需要单独判断的
B .Tech、B-tech、B.TECH等变体都会被自动识别,无需重复编写规则
内容的提问来源于stack exchange,提问作者versace crispies
相关产品推荐
相关产品推荐

