Guía de ajuste de ChatGPT: extraiga títulos de PDF y guárdelos

1. Utilice Python para escribir un código, utilice el paquete pymupdf para extraer el título del pdf y guarde el nombre del título y el número de página.

No agregué ninguna sugerencia de respuesta para ver cómo reacciona GPT. Debe saber que el PDF no tiene ninguna información semántica y que todos los títulos o texto son solo cuadros de texto.

Bien, aquí hay un ejemplo de código que usa el paquete pymupdf para extraer títulos de un pdf y guardar el nombre del título y el número de página:

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()


Había un error, page.getTextdebería serlo page.get_text, lo corregí.

Esta lógica es completamente errónea. Probé el siguiente texto PDF que tenía a mano (Three Eyes Anthology.pdf). La doc[1]primera línea de la segunda página es el título. A ver si puedes extraerlo.

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)}]}
'''

Este bloque de texto es de hecho un título, pero typeno es 1 y no se puede extraer en absoluto.

2. Utilice Python para escribir un fragmento de código, utilice el paquete pymupdf para extraer el título del PDF, guarde el nombre del título y el número de página, tenga cuidado de no juzgar según el tipo de bloque de texto, sino según su tamaño. .

Pero sabemos que el tamaño del título es obviamente diferente del texto principal, por ejemplo, el tamaño del texto principal es 12 y el título es 16, entonces está bien, guiamos a GPT para que los distinga en términos de tamaño.

Puede usar el siguiente código para extraer el título y el número de página de un PDF usando el paquete pymupdf y guardarlo en una lista:

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']}")

Reemplace "your_pdf_path.pdf" en el código con la ruta al PDF del que desea extraer los títulos. El código utiliza el paquete pymupdf para abrir el archivo PDF e iterar a través de cada página, luego verifica el tipo y tamaño de cada bloque de texto. Si el bloque de texto es de tipo 1 (es decir, título) y la altura del cuadro delimitador es inferior a 100, el título y el número de página se extraerán y agregarán a la lista de títulos. Finalmente, imprima todos los títulos y números de página extraídos.

Parece que todavía no ha cambiado y todavía se distingue según la altura y el tipo del cuadro de texto.

3. Utilice Python para escribir un fragmento de código y utilice el paquete pymupdf para extraer títulos de PDF. El método general es obtener cada cuadro de texto de cada página. Si el tamaño de fuente excede un cierto múltiplo del promedio, es Se juzga como un título y luego se guardan el nombre del título y el número de página.

Puede utilizar el paquete pymupdf para extraer títulos de archivos PDF. El siguiente es un código de muestra que determina el título según el tamaño de fuente y guarda el nombre del título y el número de página:

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}")

Hay un error en este código, es decir, blocklos primeros cuatro valores son los cuatro componentes del rectángulo y no el tamaño, sin embargo, si se cambia esta idea, debería poder usarse.

4. Código modificado

'''
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

Bien, entonces llama:

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 Finalización inicial.

Supongo que te gusta

Origin blog.csdn.net/wizardforcel/article/details/133465513
Recomendado
Clasificación