liangyi_LLaMA_Factory / data /preprocess_data /advanced_data_augmentation.py
Mickey25's picture
Upload folder using huggingface_hub
46b244e verified
#!/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()