数据开发中,使用短文本相似度匹配,实现字段名自动映射

该博客介绍了利用Python实现字段名自动映射的方法。在开发模型时,可减少从数据到模型进行字段映射的工作量。其原理是利用莱文斯坦距离(fuzzywuzzy)进行短文本相似度匹配,自动找出合适字段,不过最后仍需人工筛查。

简介:字段名自动映射,开发模型的时候,利用原始数据进行模型开发时,部分工作量是从数据到模型进行字段映射,不再看花眼;
原理:利用莱文斯坦距离(fuzzywuzzy)进行短文本相似度匹配,自动找到"最"合适的字段;当然,最后人肉筛查还是必不可少的。

# 简介:字段名自动映射,开发模型的时候,利用原始数据进行模型开发时,部分工作量是从数据到模型进行字段映射,不再看花眼
# 原理:利用莱文斯坦距离(fuzzywuzzy)进行短文本相似度匹配,自动找到"最"合适的字段;当然,最后人肉筛查还是必不可少的。
# 作者:王振东
# 日期:2021-01-07

"""
依赖:
pip install python-Levenshtein
pip install fuzzywuzzy
约束:
字段必须有注释,且注释不能重复
"""
from fuzzywuzzy import fuzz

"""
准备字段信息文件:
1、模型的字段文件(model_fields_f),文件中每一行的格式为: 字段名称 字段注释
2、原始表的字段文件(orig_fields_f),文件中每一行的格式为: 字段名称 字段注释
"""
# 字段文件,文件中每一行的格式为: field_name 中文注释
model_fields_f = open('model_fields', 'r')
orig_fields_f = open('b_basy_xy', 'r')

model_str_list = model_fields_f.readlines()
model_list = [model_str.split() for model_str in model_str_list]
model_dict = {i[1]: i[0] for i in model_list}
orig_str_list = orig_fields_f.readlines()
orig_list = [orig_str.split() for orig_str in orig_str_list]
orig_dict = {i[1]: i[0] for i in orig_list}

# 通过遍历找到相似度最高的字段
result = dict()
for k in model_dict.keys():
    max_match = (0, '')
    for ok in orig_dict.keys():
        r = fuzz.ratio(k, ok)
        if r > max_match[0]:
            max_match = (r, ok)
    result[k] = max_match

# 生成字段映射
print('映射结果:')
print('SELECT ')
for k in result.keys():
    match = result[k]
    if match[1] == '':
        print('-- not match', k)
        continue
    orig_field_name = orig_dict[match[1]]
    print('\t%s, -- %s,对应模型字段(%s %s),匹配度(%d)' %(orig_dict[match[1]], match[1], model_dict[k], k,match[0]))

print('FROM ORIG_TABLE_NAME \nWHERE PARTITION_CONDITION;')
1. 项目概述 开发一个自动化数据处理流程,其核心功能是将一份非标准格式的源Excel文件中的数据,精准地填充到另一份预先定义好的标准模板Excel文件中。该流程需确保:模板中存在的字段被准确填充,模板中不存在的字段或数据则被严格忽略。 2. 核心输入与输出 输入文件1:源数据文件 (Source.xlsx) 描述:数据来源文件,其表格结构、列标题名称、列顺序与模板文件完全不同。 输入文件2:目标模板文件 (Template.xlsx) 描述:标准格式模板。定义了所有需要被填充的字段(列标题)和最终所需的格式。 输出文件:结果文件 (Output.xlsx) 描述:一个全新的文件,其格式与目标模板文件完全一致,但单元格中已填充了从源数据文件中匹配并提取出的数据。 3. 核心处理逻辑与要求 该流程必须严格遵循以下步骤: 第一步:字段映射关系的建立 (关键准备工作) 需求:由于两个文件格式完全不同,必须先由一个“映射表”来定义源数据文件中的哪一列数据,对应着目标模板文件中的哪一个字段。 实现方式(二选一或由AI提供): 由用户提供映射表:提供一个CSV或Excel文件,至少包含两列: 模板字段名:模板文件中的列标题名称。 源数据字段名:源文件中对应的列标题名称。 示例: 模板字段名 源数据字段名 员工编号 工号 姓名 name 部门 department_name 基本工资(元) Base Salary 由AI智能推荐映射:AI读取两个文件的列标题,基于语义相似度(如自然语言处理)智能推荐一个映射关系,但必须经过用户确认和修正后才能执行后续操作。 第二步:数据读取与匹配 程序读取目标模板文件,识别所有预设的列标题(字段),形成一个“需求字段列表”。 程序读取源数据文件的所有数据。 根据第一步建立好的字段映射关系,为需求字段列表中的每一个字段,找到源数据文件中对应的数据列。 第三步:数据提取与填充 创建一个新的Excel工作簿,其工作表结构和列标题顺序必须完全复制目标模板文件。 遍历源数据文件的每一行数据: 对于模板中的每一个字段(列),根据映射关系,从源文件的当前行中提取对应单元格的数据。 将提取到的数据,填充到新创建的工作簿的当前行的对应列中。 重要规则: 只填充有映射关系的字段:如果源数据文件中有某个字段(如生日)未在映射关系中与任何模板字段关联,则该数据必须被忽略,不得出现在输出文件中。 严格保持模板格式:输出文件除数据单元格外,不应改变模板的任何格式(如字体、颜色、公式、合并单元格、页眉页脚等)。通常这意味着只向模板的单元格写入值(Value),而非格式。 第四步:输出结果 将填充完数据的新工作簿保存为指定的结果文件 (Output.xlsx)。 4. 异常处理与考虑 数据缺失:如果源文件中某个被映射的字段下存在空单元格,则在输出文件的对应位置也应保留为空。 映射错误:如果提供的映射关系中,某个源数据字段名在源文件中不存在,程序应抛出明确错误,提示用户检查映射表,而不是继续执行。 数据格式转换:如果遇到需要简单转换的数据(如将源文件中的文本“¥1,000”转换为模板数字格式1000),可在需求中额外说明,AI可尝试处理。 5. 最终交付物 一个能够自动执行上述逻辑的脚本或程序(如Python Pandas代码)。 或一个清晰的、逐步的操作指南(如果使用Excel Power Query等工具实现)。 总结给AI的最终指令: “请根据上述需求,编写一个Python脚本(使用pandas库)。我需要提供三个输入:1. 源文件路径, 2. 模板文件路径, 3. 一个定义了模板字段名和源数据字段名对应关系的字典(或CSV文件路径)。脚本的核心任务是按照映射关系,将源文件的数据抽取出来,并严格按模板的字段顺序生成一个新Excel文件。模板中没有映射的字段,其数据绝对不能出现在输出中。”
最新发布
09-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值