Nutzung von GPT-3.5 und unstrukturierten APIs für Übersetzungen

In diesem Blogbeitrag wird detailliert beschrieben, wie ich GPT genutzt habe, um die persönlichen Memoiren eines Freundes der Familie zu übersetzen und sie so einem breiteren Publikum zugänglich zu machen. Insbesondere habe ich GPT-3.5 für die Übersetzung und die APIs von Unstructured für die effiziente Extraktion und Formatierung von Inhalten verwendet.

Die Memoiren, ein tief empfundener Bericht meiner Freundin Carmen Rosa, schildern ihre Kindheit in Bolivien und ihre romantische Reise in Paris mit einem iranischen Mann in den lebhaften 1970er Jahren. Ursprünglich auf Spanisch verfasst, wollten wir die Essenz ihrer Erzählung bewahren und gleichzeitig ihre Reichweite auf englischsprachige Leser durch den Einsatz von LLM-Technologien erweitern.

Titelbild von „Un Destino Sorprendente“, Verwendung mit Genehmigung der Autorin Carmen Rosa Wichtendahl.
Titelbild von „Un Destino Sorprendente“, Verwendung mit Genehmigung der Autorin Carmen Rosa Wichtendahl.

Nachfolgend können Sie den Übersetzungsprozess detaillierter lesen oder dies tun Greifen Sie hier auf das Colab-Notizbuch zu.

Für die Übersetzung des Buches habe ich die nächsten Schritte befolgt:

  1. Buchdaten importieren: Ich habe das Buch mithilfe der Unstructured API aus einem Docx-Dokument importiert und es in Kapitel und Absätze unterteilt.
  2. Übersetzungstechnik: Ich habe jedes Kapitel mit GPT-3.5 übersetzt. Für jeden Absatz habe ich die letzten drei übersetzten Sätze (falls verfügbar) aus demselben Kapitel bereitgestellt. Dieser Ansatz diente zwei Zwecken:
  • Stilkonsistenz: Beibehaltung eines konsistenten Stils während der gesamten Übersetzung durch Bereitstellung des Kontexts aus früheren Übersetzungen.
  • Token-Restrict: Begrenzen Sie die Anzahl der gleichzeitig verarbeiteten Token, um eine Überschreitung des Kontextlimits des Modells zu vermeiden.

3. Übersetzung als Docx exportieren: Ich habe erneut die API von Unstructured verwendet, um den übersetzten Inhalt im Docx-Format zu speichern.

1. Bibliotheken

Wir beginnen mit der Set up und dem Import der notwendigen Bibliotheken.

pip set up --upgrade openai 
pip set up python-dotenv
pip set up unstructured
pip set up python-docx
import openai

# Unstructured
from unstructured.partition.docx import partition_docx
from unstructured.cleaners.core import group_broken_paragraphs

# Knowledge and different libraries
import pandas as pd
import re
from typing import Record, Dict
import os
from dotenv import load_dotenv

2. Verbindung zur OpenAI-API herstellen

Der folgende Code richtet den OpenAI-API-Schlüssel für die Verwendung in einem Python-Projekt ein. Sie müssen Ihren API-Schlüssel in einem speichern .env Datei.

import openai

# Specify the trail to the .env file
dotenv_path = '/content material/.env'

_ = load_dotenv(dotenv_path) # learn native .env file
openai.api_key = os.environ('OPENAI_API_KEY')

3. Laden des Buches

Der Code ermöglicht es uns, das Buch im Docx-Format zu importieren und in einzelne Absätze zu unterteilen.

parts = partition_docx(
filename="/content material/libro.docx",
paragraph_grouper=group_broken_paragraphs
)

Der folgende Code gibt den Absatz im 10. Index von zurück parts.

print(parts(10))

# Returns: Destino sorprendente, es el título que la autora le puso ...

4. Gruppieren Sie das Buch in Titel und Kapitel

Der nächste Schritt besteht darin, eine Liste von Kapiteln zu erstellen. Jedes Kapitel wird als Wörterbuch dargestellt und enthält einen Titel und eine Liste von Absätzen. Diese Struktur vereinfacht die Übersetzung jedes Kapitels und Absatzes einzeln. Hier ist ein Beispiel für dieses Format:

(
{"title": title 1, "content material": (paragraph 1, paragraph 2, ..., paragraph n)},
{"title": title 2, "content material": (paragraph 1, paragraph 2, ..., paragraph n)},
...
{"title": title n, "content material": (paragraph 1, paragraph 2, ..., paragraph n)},
)

Um dies zu erreichen, erstellen wir eine Funktion namens group_by_chapter. Hier sind die wichtigsten Schritte:

  1. Relevante Informationen extrahieren: Wir können jeden Erzähltext und Titel durch einen Anruf erhalten factor.class. Dies sind die einzigen Kategorien, an deren Übersetzung wir derzeit interessiert sind.
  2. Erzähltitel identifizieren: Wir erkennen an, dass einige Titel Teil des Erzähltextes sein sollten. Um dies zu erklären, gehen wir davon aus, dass kursiv geschriebene Titel zum narrativen Absatz gehören.
def group_by_chapter(parts: Record) -> Record(Dict):
chapters = ()
current_title = None

for factor in parts:

text_style = factor.metadata.emphasized_text_tags # checks whether it is 'b' or 'i' and returns checklist
unique_text_style = checklist(set(text_style)) if text_style just isn't None else None

# we think about a component a title if it's a title class and the type is daring
is_title = (factor.class == "Title") & (unique_text_style == ('b'))

# we think about a component a story content material if it's a narrative textual content class or
# if it's a title class, however it's italic or italic and daring
is_narrative = (factor.class == "NarrativeText") | (
((factor.class == "Title") & (unique_text_style is None)) |
((factor.class == "Title") & (unique_text_style == ('i'))) |
((factor.class == "Title") & (unique_text_style == ('b', 'i')))
)

# for brand spanking new titles
if is_title:
print(f"Including title {factor.textual content}")

# Add earlier chapter when a brand new one is available in, until present title is None
if current_title just isn't None:
chapters.append(current_chapter)

current_title = factor.textual content
current_chapter = {"title": current_title, "content material": ()}

elif is_narrative:
print(f"Including Narrative {factor.textual content}")
current_chapter("content material").append(factor.textual content)

else:
print(f'### No have to convert. Factor kind: {factor.class}')

return chapters

Im folgenden Beispiel sehen wir ein Beispiel:

book_chapters(2) 

# Returns
{'title': 'Proemio',
'content material': (
'La autobiografía es considerada ...',
'Dentro de las artes literarias, ...',
'Se encuentra más próxima a los, ...',
)
}

5. Buchübersetzung

Um das Buch zu übersetzen, gehen wir folgendermaßen vor:

  1. Kapiteltitel übersetzen: Wir übersetzen den Titel jedes Kapitels.
  2. Absätze übersetzen: Wir übersetzen jeden Absatz und stellen dem Modell die letzten drei übersetzten Sätze als Kontext zur Verfügung.
  3. Übersetzungen speichern: Wir speichern sowohl die übersetzten Titel als auch den Inhalt.

Die folgende Funktion automatisiert diesen Vorgang.

def translate_book(book_chapters: Record(Dict)) -> Dict:
translated_book = ()
for chapter in book_chapters:
print(f"Translating following chapter: {chapter('title')}.")
translated_title = translate_title(chapter('title'))
translated_chapter_content = translate_chapter(chapter('content material'))
translated_book.append({
"title": translated_title,
"content material": translated_chapter_content
})
return translated_book

Für den Titel bitten wir GPT um eine einfache Übersetzung wie folgt:

def translate_title(title: str) -> str:
response = shopper.chat.completions.create(
mannequin="gpt-3.5-turbo",
messages= ({
"position": "system",
"content material": f"Translate the next ebook title into English:n{title}"
})
)
return response.decisions(0).message.content material

Um ein einzelnes Kapitel zu übersetzen, versehen wir das Modell mit den entsprechenden Absätzen. Wir weisen das Modell wie folgt an:

  1. Identifizieren Sie die Rolle: Wir informieren das Modell darüber, dass es ein hilfreicher Übersetzer für ein Buch ist.
  2. Geben Sie den Kontext an: Wir teilen die letzten drei übersetzten Sätze aus dem Kapitel.
  3. Übersetzung anfordern: Wir bitten das Modell, den nächsten Absatz zu übersetzen.

Dabei fasst die Funktion alle übersetzten Absätze zu einem einzigen String zusammen.

# Perform to translate a chapter utilizing OpenAI API
def translate_chapter(chapter_paragraphs: Record(str)) -> str:
translated_content = ""

for i, paragraph in enumerate(chapter_paragraphs):

print(f"Translating paragraph {i + 1} out of {len(chapter_paragraphs)}")

# Builds the message dynamically primarily based on whether or not there may be earlier translated content material
messages = ({
"position": "system",
"content material": "You're a useful translator for a ebook."
})

if translated_content:
latest_content = get_last_three_sentences(translated_content)
messages.append(
{
"position": "system",
"content material": f"That is the newest textual content from the ebook that you've got translated from Spanish into English:n{latest_content}"
}
)

# Provides the person message for the present paragraph
messages.append(
{
"position": "person",
"content material": f"Translate the next textual content from the ebook into English:n{paragraph}"
}
)

# Calls the API
response = shopper.chat.completions.create(
mannequin="gpt-3.5-turbo",
messages=messages
)

# Extracts the translated content material and appends it
paragraph_translation = response.decisions(0).message.content material
translated_content += paragraph_translation + 'nn'

return translated_content

Schließlich sehen wir unten die unterstützende Funktion, um die neuesten drei Sätze zu erhalten.

def get_last_three_sentences(paragraph: str) -> str:
# Use regex to separate the textual content into sentences
sentences = re.break up(r'(?<!w.w.)(?<!(A-Z)(a-z).)(?<=.|?)s', paragraph)

# Get the final three sentences (or fewer if the paragraph has lower than 3 sentences)
last_three = sentences(-3:)

# Be part of the sentences right into a single string
return ' '.be part of(last_three)

6. Buchexport

Schließlich übergeben wir das Wörterbuch der Kapitel an eine Funktion, die jeden Titel als Überschrift und jeden Inhalt als Absatz hinzufügt. Nach jedem Absatz wird ein Seitenumbruch eingefügt, um die Kapitel zu trennen. Das resultierende Dokument wird dann lokal als Docx-Datei gespeichert.

from docx import Doc

def create_docx_from_chapters(chapters: Dict, output_filename: str) -> None:
doc = Doc()

for chapter in chapters:
# Add chapter title as Heading 1
doc.add_heading(chapter('title'), stage=1)

# Add chapter content material as regular textual content
doc.add_paragraph(chapter('content material'))

# Add a web page break after every chapter
doc.add_page_break()

# Save the doc
doc.save(output_filename)

Obwohl die Verwendung von GPT und APIs für die Übersetzung schnell und effizient ist, gibt es im Vergleich zur menschlichen Übersetzung wesentliche Einschränkungen:

  • Pronomen- und Referenzfehler: GPT interpretierte Pronomen oder Referenzen in einigen Fällen falsch und ordnete möglicherweise Handlungen oder Aussagen der falschen Particular person in der Erzählung zu. Ein menschlicher Übersetzer kann solche Unklarheiten besser lösen.
  • Kultureller Kontext: GPT vermisste subtile kulturelle Bezüge und Redewendungen, die ein menschlicher Übersetzer genauer interpretieren könnte. In diesem Fall wurden mehrere umgangssprachliche Begriffe, die nur in Santa Cruz, Bolivien, vorkommen, in der Originalsprache ohne zusätzlichen Kontext oder Erklärung beibehalten.

Die Kombination von KI und menschlicher Überprüfung kann Geschwindigkeit und Qualität in Einklang bringen und sicherstellen, dass Übersetzungen sowohl korrekt als auch authentisch sind.

Dieses Projekt demonstriert einen Ansatz zur Übersetzung eines Buches mithilfe einer Kombination aus GPT-3 und unstrukturierten APIs. Durch die Automatisierung des Übersetzungsprozesses haben wir den manuellen Aufwand deutlich reduziert. Während die anfängliche Übersetzungsausgabe möglicherweise einige geringfügige menschliche Überarbeitungen erfordert, um die Nuancen zu verfeinern und höchste Qualität sicherzustellen, dient dieser Ansatz als solide Grundlage für eine effiziente und effektive Buchübersetzung

Wenn Sie Suggestions oder Vorschläge zur Verbesserung dieses Prozesses oder der Qualität der Übersetzungen haben, können Sie diese gerne in den Kommentaren unten teilen.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert