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

鬼知道这个实验是怎么变成今天这个样子的。希望大家踊跃参加比赛,这样我的压力会更小。不然就要自己充钱了。这是参赛地址:智谱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.content
    out.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是否有效、结构是否正确、内容是否准确和完整,以及结果的可读性和一致性,都是确保生成结果质量的重要步骤。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值