基于商业化glm大模型接口的pdf目录提取实验

server/2024/9/21 11:18:11/

鬼知道这个实验是怎么变成今天这个样子的。希望大家踊跃参加比赛,这样我的压力会更小。不然就要自己充钱了。这是参赛地址:智谱AI开放平台

世界上有很多PDF文档。这些PDF中有些非常标准化,可以从源码中直接解析出章节信息;而有些则非常不规范,根本没有按照常规的章节设计来编排。此外,还有一些PDF是直接由扫描件生成的,内容无法通过常规的文本解析方法获取。因此,今天我们将尝试几种不同的方法来应对这些挑战,并找到合适的解决方案。

正好赶上了智谱大模型训练平台在做活动,只要拉人报名比赛就可以获取到一定数量的api的token。其中包括2024年8月5日最强的glm模型glm-4-520,还有glm-4-air、glm-4-flash。

这是参赛地址:智谱AI开放平台

注册新用户送的token包括500万glm-4-520还有2000万的glm-4-flash。

所有参赛人员均可获得以下比赛专用资源,包括:

• 1000万tokens的GLM-4-0520 模型推理资源包( 可用于训练语料合成)

• 1000万tokens的GLM-4-Flash 模型微调资源包(可用于模型微调实验)

所有参赛人员均可获得以下比赛专用资源,包括:

• 每邀请 5人,额外获得:

◦ 1000万tokens的GLM-4-0520 模型推理资源包( 可用于训练语料合成)

◦ 1000万tokens的GLM-4-Flash 及 100元GLM-4-0520 模型微调资源包(可用于模型微调实验)

我不知道我这么拉新平台会不会记恨我(在中国宣传是一个很奇怪的事情,有很多平台会把拉新当成一种羊毛党,甚至会采取一种封号的手段来保障平台的安全。)。但是今天我就要试试这些模型来做章节提取的效果如何。

这段代码主要用于从一组文本文件中提取章节和子章节标题,并将结果保存到JSON中。以下是对代码的逐步解读:

1. 导入模块

python复制代码
from zhipuai import ZhipuAI
import pandas as pd
import json
import glob
  • ZhipuAI:用于调用智谱AI的API。
  • pandas:用于数据处理和保存到CSV文件。
  • json:用于将数据保存为JSON格式。
  • glob:用于匹配文件路径模式。

2. 初始化API客户端

python复制代码
client = ZhipuAI(api_key=".")  # 请填写您自己的APIKey
  • ZhipuAI类的实例client被创建,并传入API密钥,以便后续使用API进行请求。

3. 获取待处理的文本文件路径

python复制代码
full_texts = glob.glob("../full_texts/*.txt")
  • 使用glob模块匹配路径模式"…/full_texts/*.txt",获取所有.txt文件的路径列表。这些文件将作为输入进行处理。

4. 处理每个文本文件

python复制代码
out = []
for one in full_texts:data = open(one, encoding="utf-8").read()
  • 遍历每个匹配的文本文件,读取其内容。

5. 构建API请求消息

python复制代码messages = [{"role": "user","content": """请从以下提供的文档中提取所有章节和子章节标题,并按原文顺序列出。每个章节标题后面应列出其子章节标题(如果有)。输出格式应清晰并使用分层结构,例如:{"主章节1": {"子章节1": {},"子章节2": {"子子章节2.1": {},"子子章节2.2": {}},"子章节3": {}},"主章节2": {}
}请确保所有提取的章节标题在原文中确实存在,不要省略或添加。以下是需要提取的文本:""" + data + """
注意:保留章节和子章节的层级关系。
在输出中保持章节标题的原始文字和顺序。"""}]
  • 构建一个消息列表,消息内容包含了用于从文本中提取章节和子章节的请求。消息格式包含示例输出结构和处理说明,并将当前文件内容data嵌入到请求中。

6. 发送API请求并处理响应

python复制代码one = {}response = client.chat.completions.create(model="glm-4-flash",  # 填写需要调用的模型名称messages=messages,)one['input'] = messages[0]['content']one['result'] = response.choices[0].message.contentout.append(one)
  • 向ZhipuAI API发送请求,指定使用的模型(如glm-4-flash)。
  • 从API响应中提取返回的结果,并将请求的内容和响应结果保存到one字典中。
  • 将one字典添加到out列表中,用于存储所有处理结果。

7. 保存结果

python复制代码print(one)json.dump(out, open("../out.glm-4-flash.json", "w", encoding='utf-8'), ensure_ascii=False)pd.DataFrame(out).to_csv("../航行通告e报文数据.glm-4-flash.csv")
  • 打印当前处理结果one。
  • 将所有处理结果保存为JSON文件"…/out.glm-4-flash.json"。
  • 将处理结果保存为CSV文件"…/航行通告e报文数据.glm-4-flash.csv"。

总结

这段代码的主要功能是:

  1. 从指定目录中读取所有文本文件。
  2. 使用智谱AI的API提取每个文本中的章节和子章节标题。
  3. 将提取结果保存到JSON和CSV格式的文件中,便于后续分析和使用。

如何判定生成结果好坏呢。

判定生成结果的好坏是一个重要的步骤,尤其是在处理自动化生成内容时。以下是一些判断生成结果好坏的方法:

1. 检查生成结果是否可以被直接转换为JSON

方法:

  • 确认生成的结果是否符合JSON格式规范。如果结果不是有效的JSON,则说明生成的内容可能存在格式问题。

步骤:

  • 验证JSON格式:尝试使用JSON解析器(如json.loads())来检查生成结果是否有效。如果解析失败,则可能是因为格式错误或结构不符合要求。 import json try: parsed_result = json.loads(generated_result) print(“生成结果可以被解析为JSON。”) except json.JSONDecodeError: print(“生成结果无法被解析为JSON。”)

以下是生成结果的汇报:

1. 模型 glm-4-flash 的生成结果

  • 总数量: 172
  • 可以被转换为 JSON: 1
  • 正确率: 0.0058 (约 0.58%)

2. 模型 glm-4 的生成结果

  • 总数量: 19
  • 可以被转换为 JSON: 6
  • 正确率: 0.3158 (约 31.58%)

这里只是按照这个指令来观察的结果。一个典型的长文档任务。
了解了您希望使用YAML格式替代JSON格式来处理生成的输出,以下是对这一改变的分析以及建议的处理步骤:

原因分析

  1. 内容完整性

    • JSON格式对数据的完整性和结构有严格的要求,缺失或不完整的结构会导致解析失败。
    • 由于 glm-4-flash 模型生成的内容不够完整,因此很多输出无法成功解析为JSON格式。
  2. YAML格式的优势

    • YAML是一种数据序列化格式,它比JSON更为宽松,可以更好地处理结构不完整或部分缺失的数据。
    • YAML支持注释和更人性化的语法,易于阅读和编辑,这对处理不完全结构的数据特别有用。

解决方案

1. 使用YAML格式替代JSON格式

步骤

  • 修改输出处理部分,将生成的内容转换为YAML格式。
  • 使用合适的库(如PyYAML)来处理YAML格式的读写操作。

示例代码

import yaml# 示例生成的内容 (假设生成的内容是一个字典)
generated_content = {"主章节1": {"子章节1": {},"子章节2": {"子子章节2.1": {},"子子章节2.2": {}},"子章节3": {}},"主章节2": {}
}# 将生成的内容转换为YAML格式
yaml_content = yaml.dump(generated_content, allow_unicode=True)# 将结果保存到文件中
with open("../out.glm-4-flash.yaml", "w", encoding="utf-8") as file:file.write(yaml_content)
2. 构建样本和验证

目的

  • 使用 glm-4-flash 模型生成一定量的YAML格式样本,进行测试和验证,确保输出符合预期。

步骤

  • 生成样本:使用修改后的流程生成多个样本文件。
  • 验证和调整:手动或自动验证生成的YAML文件,确保它们能正确表达原始数据中的章节和子章节信息。

示例验证代码

# 读取并验证YAML文件内容
try:with open("../out.glm-4-flash.yaml", "r", encoding="utf-8") as file:data = yaml.safe_load(file)print("YAML文件内容有效。")
except yaml.YAMLError as exc:print("YAML文件内容无效:", exc)

结论与展望

通过使用YAML格式,可以更灵活地处理数据不完整的输出,提高解析和使用的成功率。同时,通过构建和验证一定量的样本,可以进一步优化和确认模型的输出质量。

后续步骤

  1. 扩展样本生成:进一步生成和收集样本,以检测模型在不同文本类型和结构下的表现。
  2. 持续优化模型:根据样本的结果,不断调整和优化模型的生成能力,特别是在结构化信息的保持和输出方面。
  3. 建立验证标准:建立一套自动化验证标准,用于定期检查和评估生成的YAML文件的质量和完整性。

通过这些措施,可以更好地利用 glm-4-flash 模型的特点,并在实际应用中获得更稳定和可用的输出结果。

2. 检查结果的层级结构是否符合预期

方法:

  • 确认生成的JSON结构是否符合预期的层级结构。例如,检查章节和子章节是否正确嵌套,是否保持了原始文本中的顺序和层级关系。

步骤:

验证层级结构:编写代码检查生成的JSON结构是否符合预期的格式。

def validate_structure(data):     if not isinstance(data, dict):         return False for key, value in data.items():         if not isinstance(key, str) or not isinstance(value, dict):             return False if not validate_structure(value):             return False return True if validate_structure(parsed_result):     print("生成结果的层级结构符合预期。") else:     print("生成结果的层级结构不符合预期。") 

3. 验证生成内容的准确性

方法:

  • 确认生成的章节和子章节标题是否准确地反映了原始文本中的内容。检查是否有遗漏或错误。

步骤:

  • 人工检查:对照原始文本和生成结果,手动检查是否所有章节和子章节都被正确提取。
  • 自动化测试:编写测试用例检查常见的结构问题,如缺少章节标题或错误的层级关系。

4. 确保生成内容的完整性

方法:

  • 验证生成结果是否包含了原始文本中的所有章节和子章节,没有遗漏。

步骤:

  • 内容对比:对比原始文本和生成结果,确保所有内容都被包括在内。
  • 完整性检查:编写代码检查生成的JSON是否包含了所有预期的键和值。
def check_completeness(original_text, generated_json): # 实现具体的检查逻辑,根据实际需要编写 # 例如,检查生成JSON中的章节是否与原始文本一致 pass if check_completeness(original_text, parsed_result): print("生成结果包含了所有预期内容。") else: print("生成结果缺少部分内容。")

5. 评估生成内容的可读性和一致性

方法:

  • 检查生成的结果是否有逻辑一致性和可读性。确保生成内容没有语法错误或混乱的结构。

步骤:

  • 内容审查:查看生成的JSON内容是否易于理解,是否按预期组织章节和子章节。

6. 使用标准测试和验证工具

方法:

  • 使用JSON验证工具和测试框架,确保生成的结果符合所有标准。

步骤:

  • 使用工具:使用在线JSON验证工具检查格式和结构。
  • 测试框架:利用测试框架对生成结果进行自动化测试,确保满足所有标准。

总结

通过以上方法,可以有效评估生成结果的好坏,确保其符合预期的格式和内容要求。验证生成的JSON是否有效、结构是否正确、内容是否准确和完整,以及结果的可读性和一致性,都是确保生成结果质量的重要步骤。


http://www.ppmy.cn/server/100143.html

相关文章

HAProxy 负载均衡原理深度解析

目录 一、引言 二、HAProxy 简介 三、工作模式 3.1、四层负载均衡(Layer 4) 3.2、七层负载均衡(Layer 7) 3.3、区别和选择 四、 负载均衡算法 4.1、静态负载均衡算法 4.2、动态负载均衡算法 4.3、其他算法 4.4、选择算…

springboot使用WebSocket

1、、创建springboot项目&#xff0c;勾选Spring web&#xff0c;并导包 当前springboot选择的是2.6.13版本&#xff0c;jdk1.8尽量选2.几的springboot <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-we…

Video视频抽帧和WebCodecs API视频抽帧介绍

目录 mp4Box抽帧 ffmpeg抽帧 video元素抽帧 WebCodecs 核心API 视频文件是一个容器&#xff0c;里面有很多不同的轨道信息。如&#xff1a;图像、声音、字幕等。而视频图像信息又是由一系列图片序列帧的集合。如10秒时长的视频&#xff0c;假设每秒30帧。那大概有300条图像…

relativePath

Maven中的parent.relativePath元素用于指定父POM的相对路径。当你看到这样的错误信息时&#xff0c;它意味着Maven期望在某个位置找到一个父POM&#xff0c;但实际上找到的是另一个POM。 在你的情况下&#xff0c;错误信息表明com.cubemall:cubemall-product:0.0.1-SNAPSHOT项…

网络如何发送一个数据包

网络如何发送一个数据包 网络消息发送就是点一点屏幕。 骚瑞&#xff0c;这一点都不好笑。&#xff08;小品就是我的本质惹&#xff09; 之前我就是会被这个问题搞的不安宁。是怎么知道对方的IP地址的呢&#xff1f;怎么知道对方的MAC呢&#xff1f;世界上计算机有那么多&…

Element UI左侧导航栏写法(递归组件实现)

1、左侧导航栏组件使用的是Element Ui的导航栏组件&#xff0c;思路&#xff1a;首先判断导航栏数据是否存在children&#xff0c;以此来实现一级菜单与多级菜单的渲染&#xff0c;然后使用递归组件实现多级菜单的子菜单渲染&#xff0c;注意使用递归组件需将菜单栏数据在父组件…

ES环境搭建、ES安装

文章目录 简介与环境搭建全文检索倒排索引ElasticSearchWindows安装ES下载配置JDK环境启动ES服务 centos7安装ES下载ElasticSearch创建es用户配置JDK环境配置ElasticSearch配置JVM参数启动ElasticSearch服务常见启动报错 客户端Kibana安装下载修改Kibana.yml运行Kibana访问 ES安…

CSS

注释 /*单行*/ /* 多行 */样式选择器&#xff0c;属性名&#xff0c;属性值关键字全部使用小写字母 <head> <style> p { color: red; } </style> </head>字体属性 用于定义字体系列、大小、粗细、和文字样式 字体系列 font-family属性定义文本的…