File size: 13,068 Bytes
46b244e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
高级数据增强脚本 - 专门针对旅游订单资源抽取
基于你的实际case分析,提供以下增强策略:
1. 针对"新叶古村"、"大慈岩"等低频景点的样本生成
2. 针对"江清月近人"等特殊演艺项目的样本生成
3. 混合资源组合的增强
"""
import json
import random
import copy
from collections import defaultdict
from typing import List, Dict, Any
import re
class AdvancedDataAugmenter:
def __init__(self):
# 定义各类变量用于数据增强
self.dates = [
"7月15日", "7月16日", "7月19日", "7月21日", "7月22日", "7月25日",
"7月26日", "7月27日", "8月1日", "8月2日", "8月3日", "8月5日", "8月6日"
]
self.people_counts = [
"8人", "12人", "15人", "18人", "22人", "25人", "28人", "32人",
"35人", "38人", "42人", "45人", "48人", "52人", "55人"
]
self.travel_agencies = [
"杭州天翼", "苏州快乐", "建德光大", "建德中旅", "嘉兴米兰",
"浙江吉程", "上海东方", "宁波海天", "温州山水", "台州阳光"
]
self.guide_names = [
("张", "13567300196"), ("王", "18806210530"), ("李", "13958298707"),
("陈", "13868126262"), ("刘", "13588024400"), ("赵", "13819120723"),
("孙", "13862111871"), ("周", "18989479865"), ("吴", "13805701560"),
("郑", "13396506951")
]
def create_xinye_samples(self, count: int = 3) -> List[Dict[str, Any]]:
"""创建新叶古村的增强样本"""
samples = []
templates = [
"{agency},{date},{people},新叶古村,\n导游:{guide_name} {phone}",
"{date} {agency}\n新叶古村门票+导游服务\n人数:{people}\n导游联系:{guide_name} {phone}",
"{agency}团队,新叶古村一日游\n日期:{date}\n人数:{people}\n领队:{guide_name}({phone})"
]
for i in range(count):
template = random.choice(templates)
agency = random.choice(self.travel_agencies)
date = random.choice(self.dates)
people = random.choice(self.people_counts)
guide_name, phone = random.choice(self.guide_names)
input_text = template.format(
agency=agency, date=date, people=people,
guide_name=guide_name, phone=phone
)
sample = {
"instruction": "请从OCR文本中抽取旅行订单中的所有资源名称。\n\n可识别的资源名称包括:七里扬帆-七里扬帆草莓采摘入园票、七里扬帆-七里扬帆小火车、七里扬帆-七里扬帆葫芦山庄餐饮、七里扬帆-七里扬帆门票、七里扬帆-七里扬帆游船、七里扬帆-三江口游线(游船)、七里扬帆-七里扬帆停车场、七里扬帆-七里扬帆葫芦峡漂流、千岛湖好运岛-千岛湖好运岛门票、千岛湖好运岛-千岛湖好运岛游船、灵栖洞-灵栖洞门票、灵栖洞-灵栖洞手划船、灵栖洞-灵栖洞西游魔毯、新安江-新安江游船、宿江公司-江清月近人实景演艺门票、大慈岩-大慈岩门票、大慈岩-大慈岩索道、大慈岩-大慈岩中餐、大慈岩-大慈岩餐饮、大慈岩-大慈岩停车场、新叶古村-新叶古村门票、导服中心-灵栖洞景区导服。",
"input": input_text,
"output": '{"resource_names": ["新叶古村-新叶古村门票"]}'
}
samples.append(sample)
return samples
def create_daciyan_samples(self, count: int = 2) -> List[Dict[str, Any]]:
"""创建大慈岩索道+门票的增强样本"""
samples = []
templates = [
"{agency},日期:{date} 大慈岩(含上下索道),\n导游:{guide_name} {phone} 人数{people}",
"{date} {agency}\n大慈岩索道+门票套票\n{people} 导游:{guide_name}({phone})",
]
for i in range(count):
template = random.choice(templates)
agency = random.choice(self.travel_agencies)
date = random.choice(self.dates)
people = random.choice(self.people_counts)
guide_name, phone = random.choice(self.guide_names)
input_text = template.format(
agency=agency, date=date, people=people,
guide_name=guide_name, phone=phone
)
sample = {
"instruction": "请从OCR文本中抽取旅行订单中的所有资源名称。\n\n可识别的资源名称包括:七里扬帆-七里扬帆草莓采摘入园票、七里扬帆-七里扬帆小火车、七里扬帆-七里扬帆葫芦山庄餐饮、七里扬帆-七里扬帆门票、七里扬帆-七里扬帆游船、七里扬帆-三江口游线(游船)、七里扬帆-七里扬帆停车场、七里扬帆-七里扬帆葫芦峡漂流、千岛湖好运岛-千岛湖好运岛门票、千岛湖好运岛-千岛湖好运岛游船、灵栖洞-灵栖洞门票、灵栖洞-灵栖洞手划船、灵栖洞-灵栖洞西游魔毯、新安江-新安江游船、宿江公司-江清月近人实景演艺门票、大慈岩-大慈岩门票、大慈岩-大慈岩索道、大慈岩-大慈岩中餐、大慈岩-大慈岩餐饮、大慈岩-大慈岩停车场、新叶古村-新叶古村门票、导服中心-灵栖洞景区导服。",
"input": input_text,
"output": '{"resource_names": ["大慈岩-大慈岩索道", "大慈岩-大慈岩门票"]}'
}
samples.append(sample)
return samples
def create_jiangqing_samples(self, count: int = 4) -> List[Dict[str, Any]]:
"""创建江清月近人相关的增强样本"""
samples = []
# 纯江清月近人样本
for i in range(2):
agency = random.choice(self.travel_agencies)
date = random.choice(self.dates)
people = random.choice(self.people_counts)
guide_name, phone = random.choice(self.guide_names)
input_text = f"{agency},{date},{people},江清月近人演出,导游:{guide_name} {phone}"
sample = {
"instruction": "请从OCR文本中抽取旅行订单中的所有资源名称。\n\n可识别的资源名称包括:七里扬帆-七里扬帆草莓采摘入园票、七里扬帆-七里扬帆小火车、七里扬帆-七里扬帆葫芦山庄餐饮、七里扬帆-七里扬帆门票、七里扬帆-七里扬帆游船、七里扬帆-三江口游线(游船)、七里扬帆-七里扬帆停车场、七里扬帆-七里扬帆葫芦峡漂流、千岛湖好运岛-千岛湖好运岛门票、千岛湖好运岛-千岛湖好运岛游船、灵栖洞-灵栖洞门票、灵栖洞-灵栖洞手划船、灵栖洞-灵栖洞西游魔毯、新安江-新安江游船、宿江公司-江清月近人实景演艺门票、大慈岩-大慈岩门票、大慈岩-大慈岩索道、大慈岩-大慈岩中餐、大慈岩-大慈岩餐饮、大慈岩-大慈岩停车场、新叶古村-新叶古村门票、导服中心-灵栖洞景区导服。",
"input": input_text,
"output": '{"resource_names": ["宿江公司-江清月近人实景演艺门票"]}'
}
samples.append(sample)
# 江清月近人+新安江游船组合样本
for i in range(2):
agency = random.choice(self.travel_agencies)
date = random.choice(self.dates)
people = random.choice(self.people_counts)
guide_name, phone = random.choice(self.guide_names)
input_text = f"{agency},{date},{people},江清月近人+新安江游船,导游:{guide_name} {phone}"
sample = {
"instruction": "请从OCR文本中抽取旅行订单中的所有资源名称。\n\n可识别的资源名称包括:七里扬帆-七里扬帆草莓采摘入园票、七里扬帆-七里扬帆小火车、七里扬帆-七里扬帆葫芦山庄餐饮、七里扬帆-七里扬帆门票、七里扬帆-七里扬帆游船、七里扬帆-三江口游线(游船)、七里扬帆-七里扬帆停车场、七里扬帆-七里扬帆葫芦峡漂流、千岛湖好运岛-千岛湖好运岛门票、千岛湖好运岛-千岛湖好运岛游船、灵栖洞-灵栖洞门票、灵栖洞-灵栖洞手划船、灵栖洞-灵栖洞西游魔毯、新安江-新安江游船、宿江公司-江清月近人实景演艺门票、大慈岩-大慈岩门票、大慈岩-大慈岩索道、大慈岩-大慈岩中餐、大慈岩-大慈岩餐饮、大慈岩-大慈岩停车场、新叶古村-新叶古村门票、导服中心-灵栖洞景区导服。",
"input": input_text,
"output": '{"resource_names": ["宿江公司-江清月近人实景演艺门票", "新安江-新安江游船"]}'
}
samples.append(sample)
return samples
def create_mixed_samples(self, count: int = 3) -> List[Dict[str, Any]]:
"""创建复杂混合资源的样本"""
samples = []
# 大慈岩+新叶古村组合
agency = random.choice(self.travel_agencies)
date1 = random.choice(self.dates)
date2 = random.choice(self.dates)
people = random.choice(self.people_counts)
guide_name, phone = random.choice(self.guide_names)
input_text = f"{agency},日期:{date1}大慈岩(含上下索道),{date2}新叶古村\n导游:{guide_name} {phone} 人数{people}"
sample = {
"instruction": "请从OCR文本中抽取旅行订单中的所有资源名称。\n\n可识别的资源名称包括:七里扬帆-七里扬帆草莓采摘入园票、七里扬帆-七里扬帆小火车、七里扬帆-七里扬帆葫芦山庄餐饮、七里扬帆-七里扬帆门票、七里扬帆-七里扬帆游船、七里扬帆-三江口游线(游船)、七里扬帆-七里扬帆停车场、七里扬帆-七里扬帆葫芦峡漂流、千岛湖好运岛-千岛湖好运岛门票、千岛湖好运岛-千岛湖好运岛游船、灵栖洞-灵栖洞门票、灵栖洞-灵栖洞手划船、灵栖洞-灵栖洞西游魔毯、新安江-新安江游船、宿江公司-江清月近人实景演艺门票、大慈岩-大慈岩门票、大慈岩-大慈岩索道、大慈岩-大慈岩中餐、大慈岩-大慈岩餐饮、大慈岩-大慈岩停车场、新叶古村-新叶古村门票、导服中心-灵栖洞景区导服。",
"input": input_text,
"output": '{"resource_names": ["大慈岩-大慈岩索道", "大慈岩-大慈岩门票", "新叶古村-新叶古村门票"]}'
}
samples.append(sample)
return samples
def generate_all_samples(self) -> List[Dict[str, Any]]:
"""生成所有增强样本"""
all_samples = []
print("🔄 正在生成增强样本...")
# 新叶古村样本
xinye_samples = self.create_xinye_samples(3)
all_samples.extend(xinye_samples)
print(f"✅ 生成新叶古村样本: {len(xinye_samples)}个")
# 大慈岩索道样本
daciyan_samples = self.create_daciyan_samples(2)
all_samples.extend(daciyan_samples)
print(f"✅ 生成大慈岩索道样本: {len(daciyan_samples)}个")
# 江清月近人样本
jiangqing_samples = self.create_jiangqing_samples(4)
all_samples.extend(jiangqing_samples)
print(f"✅ 生成江清月近人样本: {len(jiangqing_samples)}个")
# 混合样本
mixed_samples = self.create_mixed_samples(1)
all_samples.extend(mixed_samples)
print(f"✅ 生成混合资源样本: {len(mixed_samples)}个")
print(f"\n📊 总计生成增强样本: {len(all_samples)}个")
return all_samples
def main():
augmenter = AdvancedDataAugmenter()
print("🚀 开始高级数据增强...")
print("=" * 50)
# 生成增强样本
enhanced_samples = augmenter.generate_all_samples()
# 保存增强样本
output_file = "enhanced_samples.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(enhanced_samples, f, ensure_ascii=False, indent=2)
print(f"\n💾 增强样本已保存到: {output_file}")
print("🎉 数据增强完成!")
# 显示样本预览
print("\n📋 样本预览:")
print("-" * 30)
for i, sample in enumerate(enhanced_samples[:3]):
print(f"\n样本 {i+1}:")
print(f"输入: {sample['input'][:100]}...")
print(f"输出: {sample['output']}")
if __name__ == "__main__":
main()
|