You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 

245 lines
9.6 KiB

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试数据生成脚本
"""
import pandas as pd
import numpy as np
from datetime import datetime
import os
def generate_test_data():
"""生成测试数据"""
# A_TREE 测试数据(包含层次结构)
a_tree_data = [
# 省级节点
{'Id': 1, 'Pid': 0, 'name': '新疆维吾尔自治区'},
# 市级节点
{'Id': 2, 'Pid': 1, 'name': '乌鲁木齐市'},
{'Id': 3, 'Pid': 1, 'name': '克拉玛依市'},
{'Id': 4, 'Pid': 1, 'name': '吐鲁番市'},
{'Id': 5, 'Pid': 1, 'name': '哈密市'},
# 县级节点
{'Id': 6, 'Pid': 2, 'name': '天山区'},
{'Id': 7, 'Pid': 2, 'name': '沙依巴克区'},
{'Id': 8, 'Pid': 2, 'name': '新市区'},
{'Id': 9, 'Pid': 3, 'name': '独山子区'},
{'Id': 10, 'Pid': 3, 'name': '克拉玛依区'},
# 机构节点(完整名称)
{'Id': 11, 'Pid': 6, 'name': '新疆维吾尔自治区妇女联合会'},
{'Id': 12, 'Pid': 6, 'name': '新疆维吾尔自治区政治协商会议'},
{'Id': 13, 'Pid': 6, 'name': '新疆维吾尔自治区人民代表大会常务委员会'},
{'Id': 14, 'Pid': 6, 'name': '新疆维吾尔自治区人民政府'},
{'Id': 15, 'Pid': 6, 'name': '新疆维吾尔自治区发展和改革委员会'},
{'Id': 16, 'Pid': 7, 'name': '新疆维吾尔自治区人力资源和社会保障局'},
{'Id': 17, 'Pid': 7, 'name': '新疆维吾尔自治区卫生健康委员会'},
{'Id': 18, 'Pid': 7, 'name': '新疆维吾尔自治区应急管理局'},
{'Id': 19, 'Pid': 8, 'name': '新疆维吾尔自治区市场监督管理局'},
{'Id': 20, 'Pid': 8, 'name': '新疆维吾尔自治区自然资源局'},
{'Id': 21, 'Pid': 9, 'name': '新疆维吾尔自治区生态环境局'},
{'Id': 22, 'Pid': 9, 'name': '新疆维吾尔自治区住房和城乡建设局'},
{'Id': 23, 'Pid': 10, 'name': '新疆维吾尔自治区交通运输局'},
{'Id': 24, 'Pid': 10, 'name': '新疆维吾尔自治区农业农村局'},
{'Id': 25, 'Pid': 6, 'name': '新疆维吾尔自治区商务局'},
{'Id': 26, 'Pid': 7, 'name': '新疆维吾尔自治区文化和旅游局'},
{'Id': 27, 'Pid': 8, 'name': '新疆维吾尔自治区退役军人事务局'},
{'Id': 28, 'Pid': 9, 'name': '新疆维吾尔自治区审计局'},
{'Id': 29, 'Pid': 10, 'name': '新疆维吾尔自治区统计局'},
{'Id': 30, 'Pid': 6, 'name': '新疆维吾尔自治区医疗保障局'},
]
# B_TREE 测试数据(包含简称和变体)
b_tree_data = [
# 省级节点
{'Id': 101, 'Pid': 0, 'name': '新疆维吾尔自治区'},
# 市级节点
{'Id': 102, 'Pid': 101, 'name': '乌鲁木齐市'},
{'Id': 103, 'Pid': 101, 'name': '克拉玛依市'},
{'Id': 104, 'Pid': 101, 'name': '吐鲁番市'},
{'Id': 105, 'Pid': 101, 'name': '哈密市'},
# 县级节点
{'Id': 106, 'Pid': 102, 'name': '天山区'},
{'Id': 107, 'Pid': 102, 'name': '沙依巴克区'},
{'Id': 108, 'Pid': 102, 'name': '新市区'},
{'Id': 109, 'Pid': 103, 'name': '独山子区'},
{'Id': 110, 'Pid': 103, 'name': '克拉玛依区'},
# 机构节点(简称)
{'Id': 111, 'Pid': 106, 'name': '新疆维吾尔自治区妇联'},
{'Id': 112, 'Pid': 106, 'name': '新疆维吾尔自治区政协'},
{'Id': 113, 'Pid': 106, 'name': '新疆维吾尔自治区人大常委会'},
{'Id': 114, 'Pid': 106, 'name': '新疆维吾尔自治区政府'},
{'Id': 115, 'Pid': 106, 'name': '新疆维吾尔自治区发改委'},
{'Id': 116, 'Pid': 107, 'name': '新疆维吾尔自治区人社局'},
{'Id': 117, 'Pid': 107, 'name': '新疆维吾尔自治区卫健委'},
{'Id': 118, 'Pid': 107, 'name': '新疆维吾尔自治区应急局'},
{'Id': 119, 'Pid': 108, 'name': '新疆维吾尔自治区市场监管局'},
{'Id': 120, 'Pid': 108, 'name': '新疆维吾尔自治区自然资源局'},
{'Id': 121, 'Pid': 109, 'name': '新疆维吾尔自治区环保局'},
{'Id': 122, 'Pid': 109, 'name': '新疆维吾尔自治区住建局'},
{'Id': 123, 'Pid': 110, 'name': '新疆维吾尔自治区交通局'},
{'Id': 124, 'Pid': 110, 'name': '新疆维吾尔自治区农业局'},
{'Id': 125, 'Pid': 106, 'name': '新疆维吾尔自治区商务局'},
{'Id': 126, 'Pid': 107, 'name': '新疆维吾尔自治区文旅局'},
{'Id': 127, 'Pid': 108, 'name': '新疆维吾尔自治区退役军人局'},
{'Id': 128, 'Pid': 109, 'name': '新疆维吾尔自治区审计局'},
{'Id': 129, 'Pid': 110, 'name': '新疆维吾尔自治区统计局'},
{'Id': 130, 'Pid': 106, 'name': '新疆维吾尔自治区医保局'},
# 添加一些不匹配的数据
{'Id': 131, 'Pid': 106, 'name': '新疆维吾尔自治区教育局'},
{'Id': 132, 'Pid': 107, 'name': '新疆维吾尔自治区科技局'},
{'Id': 133, 'Pid': 108, 'name': '新疆维吾尔自治区民政局'},
{'Id': 134, 'Pid': 109, 'name': '新疆维吾尔自治区司法局'},
{'Id': 135, 'Pid': 110, 'name': '新疆维吾尔自治区财政局'},
]
# 创建DataFrame
a_tree_df = pd.DataFrame(a_tree_data)
b_tree_df = pd.DataFrame(b_tree_data)
# 确保data目录存在
os.makedirs('data', exist_ok=True)
# 保存到CSV文件
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
a_csv_path = f'data/a_{timestamp}.csv'
b_csv_path = f'data/b_{timestamp}.csv'
a_tree_df.to_csv(a_csv_path, index=False, encoding='utf-8-sig')
b_tree_df.to_csv(b_csv_path, index=False, encoding='utf-8-sig')
print(f"测试数据已生成:")
print(f" A_TREE: {a_csv_path} ({len(a_tree_df)} 条记录)")
print(f" B_TREE: {b_csv_path} ({len(b_tree_df)} 条记录)")
return a_tree_df, b_tree_df, a_csv_path, b_csv_path
def create_test_config(a_csv_path: str, b_csv_path: str):
"""创建测试配置文件"""
test_config = f'''# CSV文件配置
csv:
# A_TREE CSV文件路径
a_csv_path: "{a_csv_path}"
# B_TREE CSV文件路径
b_csv_path: "{b_csv_path}"
# 输出CSV文件路径
output_csv_path: "test_output/ab.csv"
# 匹配配置
matching:
# 相似度阈值
similarity_threshold: 0.7
# 最大匹配数
max_matches: 3
# 是否启用简称匹配
enable_abbreviation: true
# 日志配置
logging:
level: "DEBUG"
format: "{{time:YYYY-MM-DD HH:mm:ss}} | {{level}} | {{message}}"
file: "logs/test_matching.log"
rotation: "10 MB"
retention: "30 days"
# 输出配置
output:
# 匹配结果文件
result_file: "test_output/matching_results.csv"
# 日志文件目录
log_dir: "logs"
# 临时文件目录
temp_dir: "temp"
'''
with open('test_config.yaml', 'w', encoding='utf-8') as f:
f.write(test_config)
print("测试配置文件已创建: test_config.yaml")
def create_hierarchy_example():
"""创建层次结构示例"""
example_data = {
'A_TREE': [
{'Id': 1, 'Pid': 0, 'name': '新疆维吾尔自治区'},
{'Id': 2, 'Pid': 1, 'name': '乌鲁木齐市'},
{'Id': 3, 'Pid': 2, 'name': '天山区'},
{'Id': 4, 'Pid': 3, 'name': '新疆维吾尔自治区妇女联合会'},
],
'B_TREE': [
{'Id': 101, 'Pid': 0, 'name': '新疆维吾尔自治区'},
{'Id': 102, 'Pid': 101, 'name': '乌鲁木齐市'},
{'Id': 103, 'Pid': 102, 'name': '天山区'},
{'Id': 104, 'Pid': 103, 'name': '新疆维吾尔自治区妇联'},
]
}
# 保存层次结构示例
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
for tree_name, data in example_data.items():
df = pd.DataFrame(data)
filename = f'test_data/{tree_name}_hierarchy_{timestamp}.csv'
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f" {tree_name}: {filename}")
return example_data
def main():
"""主函数"""
import os
# 创建测试数据目录
os.makedirs('test_data', exist_ok=True)
os.makedirs('test_output', exist_ok=True)
os.makedirs('logs', exist_ok=True)
os.makedirs('temp', exist_ok=True)
print("="*60)
print("测试数据生成脚本")
print("="*60)
# 生成测试数据
a_tree, b_tree, a_csv_path, b_csv_path = generate_test_data()
# 创建层次结构示例
print("\n创建层次结构示例:")
hierarchy_example = create_hierarchy_example()
# 创建测试配置
create_test_config(a_csv_path, b_csv_path)
print("\n测试数据说明:")
print("- A_TREE 包含完整的机构名称和层次结构")
print("- B_TREE 包含简称和变体,以及层次结构")
print("- 预期匹配: 20个机构")
print("- 预期不匹配: 5个机构")
print("- 包含省级、市级、县级、机构级四个层次")
print("\n层次结构示例:")
print("新疆维吾尔自治区 -> 乌鲁木齐市 -> 天山区 -> 新疆维吾尔自治区妇女联合会")
print("新疆维吾尔自治区 -> 乌鲁木齐市 -> 天山区 -> 新疆维吾尔自治区妇联")
print("\n使用方法:")
print("1. 使用生成的CSV文件运行程序")
print(f"2. 运行: python3 main.py --a-csv {a_csv_path} --b-csv {b_csv_path}")
print("3. 或使用配置文件: python3 main.py --config test_config.yaml")
print("4. 查看结果: test_output/ 目录")
print("="*60)
if __name__ == "__main__":
main()