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.
245 lines
9.6 KiB
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()
|