Skip to content

Instantly share code, notes, and snippets.

@alonsoir
Last active October 31, 2024 18:42
Show Gist options
  • Save alonsoir/fb16eb66d4f5b644548c47cdc9af71c8 to your computer and use it in GitHub Desktop.
Save alonsoir/fb16eb66d4f5b644548c47cdc9af71c8 to your computer and use it in GitHub Desktop.
Explicación del código summarize_section: Envía cada sección de texto a la API de OpenAI para obtener un resumen de 400 caracteres (o menos de 100 tokens). split_text: Divide el texto en fragmentos de aproximadamente 8,000 tokens cada uno (aproximadamente 5,000 palabras), ajustando el tamaño si es necesario. summarize_document: Procesa cada secc…
# pip install openai
# para probarlo, me bajo el libro Moby Dick, lo divido en 72 secciones y envio cada seccion gpt-4.
# Hay que tener cuidado con los parametros MAX_TOKENS_PER_CHUNK y SUMMARY_TOKEN_LIMIT para no molestar a openAI.
from openai import OpenAI
import requests
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()
# Definir parámetros
MODEL = "gpt-4" # Usa "gpt-4" o "gpt-4-turbo" para optimización de tokens
MAX_TOKENS_PER_CHUNK = 3000 # Límite de tokens por sección, ajustado para evitar errores
SUMMARY_TOKEN_LIMIT = 100 # Tokens para el resumen de cada sección
def summarize_section(text):
"""Genera un resumen breve de una sección de texto."""
response = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": "Resume este texto en 400 caracteres o menos."},
{"role": "user", "content": text}
],
max_tokens=SUMMARY_TOKEN_LIMIT,
temperature=0.5
)
summary = response.choices[0].message.content
return summary.strip()
def split_text(text, max_tokens):
"""Divide el texto en secciones según el límite de tokens."""
tokens = text.split() # Asume que cada palabra cuenta como un token aprox.
chunks = []
for i in range(0, len(tokens), max_tokens):
chunk = " ".join(tokens[i:i + max_tokens])
chunks.append(chunk)
return chunks
def summarize_document(text):
"""Genera un resumen iterativo de un documento largo."""
# Dividir el texto en secciones manejables
sections = split_text(text, MAX_TOKENS_PER_CHUNK)
# Resumir cada sección
section_summaries = []
for i, section in enumerate(sections):
print(f"Resumiendo sección {i + 1}/{len(sections)}...")
summary = summarize_section(section)
section_summaries.append(summary)
# Combinar resúmenes de secciones y resumir el resultado
combined_summary_text = " ".join(section_summaries)
print("Generando el resumen final...")
final_summary = summarize_section(combined_summary_text)
return final_summary
def download_text_from_gutenberg(url):
"""Descarga el texto completo desde una URL de Proyecto Gutenberg."""
print(f"Descargando texto from {url}...")
response = requests.get(url)
response.raise_for_status()
# Limpiar el texto para eliminar cabecera y pie de página de Proyecto Gutenberg
text = response.text
return text
# Descargar "Moby Dick" de Proyecto Gutenberg
url = "https://www.gutenberg.org/files/2701/2701-0.txt"
texto_largo = download_text_from_gutenberg(url)
# Ejecutar el resumen del documento
resumen_final = summarize_document(texto_largo)
print("Resumen final:")
print(resumen_final)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment