ChatGPT 调教指南:从 PDF 提取标题并保存

简介: ChatGPT 调教指南:从 PDF 提取标题并保存

一、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数。

我没有加任何的答案提示,看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息,一切标题或者正文全是文本框。

好的,以下是使用pymupdf包从pdf中提取标题,并保存标题名称和页数的代码示例:

import fitz
def extract_titles(pdf_path):
    doc = fitz.open(pdf_path)
    titles = []
    for page in doc:
        blocks = page.get_text("dict")["blocks"]
        for block in blocks:
            if block["type"] == 1 and block["bbox"][3] < 100:
                title = block["text"]
                page_num = page.number + 1
                titles.append({"title": title, "page": page_num})
    return titles
pdf_path = "example.pdf"
titles = extract_titles(pdf_path)
for title in titles:
    print("Title:", title["title"])
    print("Page:", title["page"])
    print()

它里面有个错误,page.getText应该是page.get_text,我改了过来。

这个逻辑完全不对,我试了以下我手头的一个文字 PDF(三眼文集.pdf),第二页doc[1]的第一行就是标题。看看能不能提取

pdf_path = r"d:/docs/wealth-books-2023/权谋/三眼文集.pdf"
doc = fitz.open(pdf_path)
print(doc[1].get_text("dict")['blocks'][0])
'''
{'number': 0,
 'type': 0,
 'bbox': (48.0, 52.383140563964844, 531.0696411132812, 96.42223358154297),
 'lines': [{'spans': [{'size': 16.440000534057617,
     'flags': 4,
     'font': 'MicrosoftYaHeiUI',
     'color': 0,
     'ascender': 1.015625,
     'descender': -0.25439453125,
     'text': '赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层',
     'origin': (48.0, 69.08001708984375),
     'bbox': (48.0,
      52.383140563964844,
      531.0696411132812,
      73.26226043701172)}],
   'wmode': 0,
   'dir': (1.0, 0.0),
   'bbox': (48.0, 52.383140563964844, 531.0696411132812, 73.26226043701172)},
  {'spans': [{'size': 16.440000534057617,
     'flags': 4,
     'font': 'MicrosoftYaHeiUI',
     'color': 0,
     'ascender': 1.015625,
     'descender': -0.25439453125,
     'text': '玩金融!(完整版)',
     'origin': (48.0, 92.239990234375),
     'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}],
   'wmode': 0,
   'dir': (1.0, 0.0),
   'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}]}
'''

这个文本块的确是标题,但是type不是 1,根本提取不出来。

二、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数,注意不要根据文本块的类型来判断,而是根据其大小。

但是我们知道,标题的大小明显和正文不一样,比如正文大小是12,标题是16,那OK,我们引导 GPT 从大小方面区分。

您可以使用以下代码使用pymupdf包从PDF中提取标题和页数,并将其保存在列表中:

import fitz
def extract_titles(pdf_path):
    doc = fitz.open(pdf_path)
    titles = []
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        blocks = page.get_text("dict", flags=11)["blocks"]
        for block in blocks:
            if block["type"] == 1 and block["bbox"][3] < 100:
                title = block["text"].strip()
                titles.append({"title": title, "page": page_num})
    return titles
pdf_path = "your_pdf_path.pdf"
titles = extract_titles(pdf_path)
for title in titles:
    print(f"Title: {title['title']}, Page: {title['page']}")

请将代码中的"your_pdf_path.pdf"替换为您要提取标题的PDF路径。该代码使用pymupdf包打开PDF文件并迭代每个页面,然后检查每个文本块的类型和大小。如果文本块的类型为1(即标题)且其边界框高度小于100,将提取标题和页数,并将其添加到标题列表中。最后,打印出所有提取的标题和页数。

看来还是不改,还是按照文本框高度和类型区分。

三、请使用python编写一段代码,使用pymupdf包从pdf中提取标题大致方法是获取每一页的每个文本框,如果字体大小超出平均值一定倍数,就判断为标题,之后保存标题名称和页数。

你可以使用pymupdf包来提取PDF文件中的标题。以下是一个示例代码,根据字体大小判断标题并保存标题名称和页数:

import fitz
def extract_titles_from_pdf(file_path, threshold=1.5):
    doc = fitz.open(file_path)
    titles = []
    for page in doc:
        text_blocks = page.getTextBlocks()
        font_sizes = [block[1] for block in text_blocks]
        avg_font_size = sum(font_sizes) / len(font_sizes)
        for block in text_blocks:
            font_size = block[1]
            text = block[4]
            if font_size > avg_font_size * threshold:
                titles.append((text, page.number))
    return titles
# 调用示例
pdf_path = "example.pdf"
titles = extract_titles_from_pdf(pdf_path)
for title, page_num in titles:
    print(f"标题: {title}\t页数: {page_num}")

这段代码有个错误,就是block的前四个数值是矩形四个分量并不是大小,不过这个思路改一改应该就可以用了。

四、修改后的代码

'''
block: {'number': 1,
  'type': 0,
  'bbox': (158.25, 569.15625, 446.25, 663.375),
  'lines': [{'spans': [{'size': 72.0,
      'flags': 0,
      'font': 'SimSun',
      'color': 16776960,
      'ascender': 1.04296875,
      'descender': -0.265625,
      'text': '三眼文集',
      'origin': (158.25, 644.25),
      'bbox': (158.25, 569.15625, 446.25, 663.375)}],
    'wmode': 0,
    'dir': (1.0, 0.0),
    'bbox': (158.25, 569.15625, 446.25, 663.375)}]}
'''
def extract_titles_from_pdf(file_path, thres=1.2):
    doc = fitz.open(file_path)
    titles = []
    for i, page in enumerate(doc):
        blocks = [
            block for block in page.get_text("dict")["blocks"]
            if block['type'] == 0
        ]
        sizes = [
            span['size'] 
            for block in blocks
            for line in block['lines']
            for span in line['spans']
        ]
        avg_size = sum(sizes) / (len(sizes) + 1e-9)
        page_titles = [
            (span['text'], i) 
            for block in blocks
            for line in block['lines']
            for span in line['spans']
            if span['size'] > avg_size * thres
        ]
        titles += page_titles
    return titles

好,然后调用:

res = extract_titles_from_pdf(pdf_path, 1.2)
print(res)
'''
[('赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层', 1),
 ('玩金融!(完整版)', 1),
 ('钱就是债!——金融家的秘密,老百姓的盲点!明白这个才能不被', 8),
 ('收割', 8),
 ('穷人才想赚快钱!教人致富多为骗局!想变富要明白一个逻辑:分', 11),
 ('配!', 11),
 ('历史观比财经观更重要!经济是政治的延伸,而今天是昨日的推', 14),
 ('演!', 14),
 ('大钱要靠分配!不是卖苦力赚的!人生是无数个局,看局方能破局', 17),
 ('为何啥都不好干了?为何经济放缓了?本质在于这一群体快被抽', 21),
 ('干!', 21),
 ('过去高增长的本质是什么?', 21),
 ...]
'''

OK 初步完成。

相关文章
|
5月前
|
数据采集 自然语言处理 程序员
ChatGPT 调教日记(一):Markdown 解析器
ChatGPT 调教日记(一):Markdown 解析器
154 0
|
3月前
ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享
**掌握ChatGPT高质量Prompt技巧的指南,教你艺术性提问以获取卓越答案。适用于各层次用户,提升内容创作效率。了解Prompt工程,作为对话模式触发器,有效引导ChatGPT生成人类般文本。点击获取PDF资源:[ChatGPT提问艺术](https://zhangfeidezhu.com/?p=334)**
46 0
ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享
|
3月前
ChatGPT提问提示指南PDF下载经典分享推荐书籍,让你做好prompt工程
**掌握ChatGPT提问艺术:本书提供有效互动策略,教你构造精准提示获取专业答案。适用于各层次用户,通过实例解析提示工程,驱动模型生成定制化文本。[PDF下载](https://zhangfeidezhu.com/?p=335)**
91 0
ChatGPT提问提示指南PDF下载经典分享推荐书籍,让你做好prompt工程
|
3月前
|
算法
「AIGC」readLink实现url识别pdf、网页标题和内容
AIGC算法实现服务,通过Express接收URL,识别内容类型:HTML使用Cheerio解析,PDF用`pdf-parse`。自定义函数提取标题和内容。示例代码展示了如何处理HTTP响应,提取HTML的`&lt;title&gt;`及PDF文本,并提供错误处理。服务器运行在端口3000。
29 0
|
5月前
|
人工智能
一定要知道如何用ChatGPT编写标题, 快速提升公众号的爆款概率
一定要知道如何用ChatGPT编写标题, 快速提升公众号的爆款概率
|
人工智能 自然语言处理 API
如何调教一个定制化的ChatGPT私人助理,接入自家知识库
ChatGPT 虽然很能“聊”,但它并了解你的产品啊。就好比你把郭德纲喊来做你的客服,他也并不会比一个经过培训的客服人员做得更好。
|
5月前
|
人工智能 算法 数据挖掘
ChatGPT 调教日记(二):程序员转量化的背景知识
ChatGPT 调教日记(二):程序员转量化的背景知识
58 0
ChatGPT: 读PDF、生成思维导图几种方案
ChatGPT: 读PDF、生成思维导图几种方案
998 0
ChatGPT: 读PDF、生成思维导图几种方案
|
人工智能
ChatGPT - 如何高效的调教ChatGPT (指令建构模型-LACES问题模型)
ChatGPT - 如何高效的调教ChatGPT (指令建构模型-LACES问题模型)
255 0
|
机器学习/深度学习 人工智能 监控
《花雕学AI》23:中文调教ChatGPT的秘诀:体验测试与通用案例,解锁无限有趣玩法!
ChatGPT是一个基于深度学习的中文对话生成系统,它可以根据用户的输入,生成流畅、自然、有趣的对话回复。ChatGPT不仅可以进行各种主题和风格的闲聊,还可以进行各种类型和形式的创作、学习、娱乐和社交。ChatGPT具有强大的逻辑推理和创造性思维能力,可以应对各种复杂和有趣的情境和挑战。 但是,要充分发挥ChatGPT的潜力和魅力,你需要了解如何调教它,让它更符合你的期望和需求。在本文中,我将为你揭示中文调教ChatGPT的秘诀,通过体验测试和通用案例,让你解锁无限有趣玩法,享受与ChatGPT的对话乐趣。请跟随我,一起探索ChatGPT的奇妙世界吧!
640 0