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

近似文本匹配与同步更新:基于DataFrame的大学名称别名匹配需求

解决大学别名与正式名称匹配的方案

我来帮你搞定这个匹配问题,毕竟df1里的大学名称各种变体(带the、缩写、多余符号啥的)确实头疼,结合pandas和模糊匹配工具就能高效解决。首先如果还没装依赖库,先跑这个命令:

pip install pandas fuzzywuzzy python-Levenshtein

python-Levenshtein是可选的,但能大幅提升模糊匹配的速度,处理50万行数据更顺畅。

1. 文本标准化:统一格式减少匹配误差

不管是df1的正式名称还是df2的别名,先把它们转换成统一格式,去掉冗余内容:

import pandas as pd
from fuzzywuzzy import fuzz, process
import re

def standardize_text(text):
    if pd.isna(text):
        return ""
    # 转小写,避免大小写差异影响匹配
    text = text.lower()
    # 替换所有特殊符号和多余空格为单个空格
    text = re.sub(r'[-.,;:\s]+', ' ', text).strip()
    # 去掉常见的冗余前缀,比如"the "
    text = re.sub(r'^the\s+', '', text)
    # 如果你的数据里有特定缩写(比如"warw"对应"warwick"),可以在这里加自定义替换
    text = re.sub(r'\bwarw\b', 'warwick', text)
    return text

# 对两个DataFrame的相关列做标准化处理
df1['standardized_name'] = df1['University_name'].apply(standardize_text)
df2['standardized_official'] = df2['university_name'].apply(standardize_text)
df2['standardized_alias'] = df2['university_aliases'].apply(standardize_text)

2. 构建别名→正式名称的映射字典

把df2里的每个别名都和对应的正式名称绑定,方便后续匹配:

alias_to_official = {}

for _, row in df2.iterrows():
    official_name = row['university_name']
    # 这里假设别名是用逗号分隔的多个值,你可以根据实际的分隔符调整(比如分号、换行)
    aliases = [alias.strip() for alias in row['university_aliases'].split(',')]
    
    for alias in aliases:
        standardized_alias = standardize_text(alias)
        if standardized_alias:  # 跳过空的别名
            alias_to_official[standardized_alias] = official_name

3. 分阶段匹配:先精确再模糊

第一步:精确匹配(速度快,优先用)

先尝试直接用标准化后的名称匹配字典里的别名:

df1['matched_official_name'] = df1['standardized_name'].map(alias_to_official)

第二步:模糊匹配(处理变体和缩写)

对于精确匹配没命中的行,用模糊匹配找最相似的别名,设置相似度阈值来保证匹配准确性:

# 提取所有标准化后的别名列表,供模糊匹配使用
alias_list = list(alias_to_official.keys())

def fuzzy_match(text):
    if pd.isna(text) or text == "":
        return None
    # 用token_set_ratio来匹配,能忽略词序和部分冗余内容,阈值设为80(可根据需求调整)
    best_match = process.extractOne(text, alias_list, scorer=fuzz.token_set_ratio, score_cutoff=80)
    if best_match:
        return alias_to_official[best_match[0]]
    return None

# 只对未匹配到的行做模糊匹配,提升效率
unmatched_mask = df1['matched_official_name'].isna()
df1.loc[unmatched_mask, 'matched_official_name'] = df1.loc[unmatched_mask, 'standardized_name'].apply(fuzzy_match)

4. 验证与优化

最后检查匹配结果,看看有没有需要调整的地方:

# 查看未匹配到的行数和示例
unmatched_rows = df1[df1['matched_official_name'].isna()]
print(f"还有 {len(unmatched_rows)} 行未匹配到,可以针对性优化标准化函数或调整模糊匹配阈值")
print(unmatched_rows[['University_name', 'standardized_name']].head(10))

如果还是有不少未匹配的,你可以:

  • 调整standardize_text函数,增加更多自定义替换规则(比如处理特定缩写、地区后缀)
  • 降低模糊匹配的score_cutoff阈值(比如调到70),但要注意可能会引入误匹配
  • 手动补充df2里缺失的别名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:36