当前位置: 首页 > news >正文

易学探索助手-项目记录(九)

本文介绍本地大模型推理数据集构成

(一)古籍数据获取

以44种竖向从右至左排列的繁体古文为研究对象,通过OCR识别、XML结构化处理,最终生成符合大模型训练要求的数据集。

1.技术路线设计

  1. 图像处理层:PaddleOCR识别竖排文本
  2. 结构转换层:生成标准XML文件
  3. 数据整合层:XML转Excel统一存储

2.关键技术实现

2.1OCR识别与XML生成(Python实现)

核心代码解析

def generate_xml(image_path, xml_path):# OCR识别(支持中文竖排识别)result = ocr.ocr(str(image_path), cls=True)# 从右至左排序逻辑boxes_texts.sort(key=lambda b: -b[0])# XML结构生成root = ET.Element('page', {'id': xml_id,'size': f'{width},{height}','md5': md5sum})# 文本块标注for idx, (x, y, h, text) in enumerate(boxes_texts, start=1):style = f'{x},{y},0,{h};f:0,{h-4}'ET.SubElement(root, 'text', {'id': str(idx+2), 'style': style}).text = text

关键技术点

  1. 竖排识别优化

    • 使用PaddleOCR的use_angle_cls=True参数启用方向分类
    • lang='ch'参数优化中文识别效果
  2. 从右至左排序

    boxes_texts.sort(key=lambda b: -b[0])  # 按x坐标降序排列
    
  3. 元数据保留

    • 图像MD5校验码
    • 图像尺寸与格式
    • 创建时间戳
2.2XML转Excel(Java实现)

核心处理逻辑

public class XmlToExcelConverter {// 多文件夹批处理File[] directories = rootDir.listFiles(File::isDirectory);// 创建Excel工作簿Workbook workbook = new XSSFWorkbook();// XML内容提取StringBuilder content = new StringBuilder();List<Node> textNodes = document.selectNodes("//text");
}

关键特性

  1. 批量处理架构

    • 支持多层级目录遍历
    • 自动识别index.xml元数据文件
  2. 数据标准化

    // Excel列设计
    headerRow.createCell(0).setCellValue("book_id");
    headerRow.createCell(1).setCellValue("book_name");
    headerRow.createCell(3).setCellValue("content");
    
  3. 内容聚合策略

    • 多XML文件合并为单个Excel
    • 章节自动编号
    • 文本块换行符分隔

3.成果展示

<page id="0891001001.xml" relate="0891001001.jpg" size="5696,4439">
<font id="0">zykkai</font>
<rect id="1" box="105,183,5490,4086" foreground="255,255,255"/>
<rect id="2" box="125,203,5450,4046" foreground="255,255,255"/>
<text id="3" style="4755,291,0,1304;f:0,730">周易內</text>
<text id="4" style="3938,288,0,1309;f:0,737">傳六卷</text>
<text id="5" style="3393,1373,0,345;f:0,322">後學吴讓之署</text>
<text id="6" style="1544,1046,0,374;f:0,358">同治四年湘鄉曽</text>
<text id="7" style="1034,1051,0,374;f:0,370">氏栞于金陵節署</text>
</page>

(二)古籍问答对数据生成

0.从文档中获取古籍内容

1.调用DeepSeek模型生成问题

response = client.chat.completions.create(model="deepseek-reasoner",messages=[{"role": "system", "content": "你是一名研究周易的专家"},{"role": "user", "content": f"这是一本古籍中的一段,\n{chunk}\n\n请根据文章内容提出2个问题"}],stream=False
)
  • 使用 deepseek-reasoner 专家模型模拟《周易》研究者,生成语义相关问题。

  • 要求:禁止使用“文中”、“文章”字眼,确保通用性。

2.去重判断 + 问题提取

def extract_questions(text):return re.findall(r"\d+\.\s*(.+)", text)
  • 提取格式如“1. 问题内容”的结构化问题,防止误提。

  • 利用 guji_answer_question.txt 做去重判断,确保每个问题只问一次。

3.自动回答生成并保存

response2 = client.chat.completions.create(model="deepseek-reasoner",messages=[{"role": "system", "content": "你是一名研究周易的专家"},{"role": "user", "content": f"{chunk}\n请回答问题:{final_question}"}],stream=False
)
  • 模拟专家作答,并保存:

    • guji_answer.txt:包含问题、推理、最终回答

    • guji_answer_question.txt:仅保存问题列表

4. 输出样例

共处理349本易学古籍,共得到16068条问答数据。

(三)《周易研究》数据与易学知识图谱和百科全书获取

类似于易学古籍数据获取 

共处理349本易学古籍,共得到16068条问答数据。

对百科全书中概论、词汇、易学史、人物、著作等部分进行了处理,共得到3643条问答数据。

(四)DeepSeek通过Self-Instruct自行生成

1. 初始化 DeepSeek 客户端

from openai import OpenAI 
client = OpenAI(api_key="...", base_url="https://api.deepseek.com")

2. Prompt 模板设计


每条 prompt 都在模拟不同的教学/应用场景,覆盖从“入门科普”到“哲学讨论”再到“实际应用”三个层面。

覆盖广泛:基础 → 哲学 → 应用;

风格丰富:模拟学生提问、专家回答;

易于扩展:可增加更多领域 prompt。

3. 防止重复生成:问题去重机制
 

# 提取编号的问题(1. xxx)用于去重等处理
def extract_questions(text):pattern = re.compile(r"\d+\.\s*(.+)")return pattern.findall(text)# 读取已有问题列表,避免重复
existing_questions_file = Path("self_instruct_questions.txt")
if existing_questions_file.exists():with open(existing_questions_file, "r", encoding="utf-8") as f:asked_questions = set(line.strip() for line in f if line.strip())
else:asked_questions = set()

通过正则提取“1. xxx”结构的问题文本,并用 set 去重保存。这样可防止多个 Prompt 生成重复问题,提高数据独特性。 

4. 核心主循环:生成并保存数据

这里使用 DeepSeek 的 deepseek-reasoner 模型,适合处理复杂推理与专业领域任务,并用 system prompt 设置角色背景(国学专家),提升回答可信度和风格一致性。

5. 数据保存结构

保存问答数据为结构清晰的文本格式: 

  • reasoning_content: 模型的推理过程;

  • answers: 结构化问答列表;

  • 可用于微调前进一步清洗或分句。

 6.格式转换

共得到周易基础概念性、开放性等问答数据共4475条。 

相关文章:

  • 什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
  • 数据 分析
  • primitive创建图像物体
  • new optimizers for dl
  • 【3Ds Max】.ive格式文件的导出与加载
  • CMake入门与实践:现代C++项目的构建利器
  • 怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)
  • 对抗系统熵增:从被动救火到主动防御的稳定性实战
  • 笔记本/台式机加装PCIe 5.0固态硬盘兼容性与安装方法详解 —— 金士顿Kingston FURY Renegade G5装机指南
  • Python Day25 学习
  • Java实现美术机构教务管理系统:基于爱耕云功能模式的解决方案
  • Express项目解决跨域问题
  • 3337|3335. 字符串转换后的长度 I(||)
  • 不借助 Cursor,如何开发第一款 ios 产品并做到付费榜 Top 2
  • 右值引用和移动语义
  • 简单易懂的JavaScript中的this指针
  • K8S Ingress 实现AB测试、蓝绿发布、金丝雀(灰度)发布
  • 【Linux网络】认识网络
  • Vue:显示数据
  • MySQL基础之开窗函数
  • 商务部:今年前3月自贸试验区进出口总额达2万亿元
  • 一图看懂|印巴交火后,双方基地受损多少?
  • 男子恶意遗弃幼子获刑,最高法发布涉未成年人家庭保护典型案例
  • 上海145家博物馆、73家美术馆将减免费开放
  • 中国巴西民间推动建立经第三方验证的“森林友好型”牛肉供应链
  • 反犹、资金与抗议:特朗普的施压如何撕裂美国大学?|907编辑部