[PYTHON] Englisch PDF wird ins Japanische übersetzt

Ich möchte PDFs zusammen übersetzen

Wenn Sie eine PDF-Datei übersetzen möchten, wird zuerst die Standardfunktion von Google Translate in den Sinn gebracht. Es gibt jedoch eine Dateigrößenbeschränkung, die je nach PDF ein Problem darstellt. In Vorheriger Artikel habe ich die Google Übersetzer-API aufgerufen, um den englischen Text ins Japanische zu übersetzen. Wenn der Text, den Sie lesen möchten, PDF ist, können Sie den Text mit Google Documents oder Adobe Acrobat extrahieren. Es gibt jedoch den Nachteil, dass die Anzahl der Schritte groß ist. Auch hier scheint Python eine Reihe von Arbeiten mit einer Bibliothek namens PDF Miner ausführen zu können. Ich habe sehr viel auf die folgenden Artikel verwiesen. [PDF Miner] Text aus PDF extrahieren

Das erstellte Skript ist unten. https://github.com/KanikaniYou/translate_pdf

Alle PDFs in einem bestimmten Ordner werden extrahiert, übersetzt und als Textdateien ausgegeben.

Da nach dem Extrahieren mit PDFMiner auch unnötige Zeichenfolgen verwendet werden (Zeichenfolgen mit demselben Symbol wie "......" usw., die sich im Inhaltsverzeichnis befinden usw.), werden die extrahierten Textdateien als Zwischendatei zusammengestellt. Ich versuche, es Menschen zu ermöglichen, unnötige Teile zu entfernen.

Der gesamte Ablauf der Übersetzungsarbeit 0. Schnellstart| Google Cloud Translation API Documentation | Google Cloud PlatformHolen Sie sich die Google Übersetzer-API unter Bezugnahme auf

  1. Extrahieren Sie Text aus PDF und speichern Sie ihn als Textdatei (pdf_to_txt.py).
  2. Formatieren Sie den Text und speichern Sie ihn als neue Textzeile (let_translatable.py).
  3. Übersetzen Sie englischen Text ins Japanische und speichern Sie ihn als Textdatei (translate_en_jp.py)

Es wird sein. Wie oben erwähnt, können Sie durch manuelles Betrachten der Textdatei nach 1. den von PDF Miner extrahierten Text überprüfen und nur die erforderlichen Teile extrahieren, damit Sie die Google Translate-API nicht verschwenderisch aufrufen müssen. Ich werde.

Umgebung

Ich denke, dass Linux mit Python3-System verwendet werden kann. Meine Umgebung ist Cloud9 und Ubuntu 18.04.

pip install pdfminer.six

Übrigens ist PDF Miner sehr nützlich, aber es scheint, dass verstümmelte Zeichen wahrscheinlich auftreten, wenn Sie Japanisch usw. extrahieren möchten. Dieses Mal werde ich Englisch lernen, daher denke ich nicht, dass Probleme so oft auftreten werden.

Bekannte Fehler im Zusammenhang mit dem japanischen Abrufen in PDF Miner: Immer noch Probleme mit CID-Zeichen Nr. 39

git clone https://github.com/KanikaniYou/translate_pdf
cd translate_pdf

Dateistruktur. (Zur Erklärung habe ich bereits 10 PDFs platziert, die ich übersetzen möchte.)

.
├── eng_txt
├── eng_txt_split
├── jpn_txt
├── let_translatable.py
├── pdf_source
│   ├── report_1.pdf
│   ├── report_10.pdf
│   ├── report_2.pdf
│   ├── report_3.pdf
│   ├── report_4.pdf
│   ├── report_5.pdf
│   ├── report_6.pdf
│   ├── report_7.pdf
│   ├── report_8.pdf
│   └── report_9.pdf
├── pdf_to_txt.py
└── translate_en_jp.py
スクリーンショット 2019-12-11 15.07.11.png

1. Text extrahieren

pdf_to_txt.py


import sys

from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTContainer, LTTextBox
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage

import os
import re

def find_textboxes_recursively(layout_obj):
	if isinstance(layout_obj, LTTextBox):
		return [layout_obj]

	if isinstance(layout_obj, LTContainer):
		boxes = []
		for child in layout_obj:
			boxes.extend(find_textboxes_recursively(child))
		return boxes
	return[]
	
def pdf_read_controller(filepath):
	try:
		text_in_pdf = ""
			
		with open(filepath, 'rb') as f:

			for page in PDFPage.get_pages(f):
				try:
						
					interpreter.process_page(page)
					layout = device.get_result()
			
					boxes = find_textboxes_recursively(layout)
					boxes.sort(key=lambda b:(-b.y1, b.x0))
					
					text_in_page = ""
					for box in boxes:
						text_in_box = ""
						
						text_in_box += box.get_text().strip().strip(" ")
						
						text_in_box.rstrip("\n")
						text_in_box = re.sub(r'  ', " ", text_in_box)
			
						text_in_page += text_in_box
					text_in_pdf += text_in_page
				except Exception as e:
					print(e)
					
		return(text_in_pdf)
		
	except Exception as e:
		print(e)
		print("error: " + filepath)
		return("no-text")


def make_txtfile(folder_path,file_name,text='error'):
	if text != "no-text":
		with open(folder_path+"/"+file_name, mode='w') as f:
			f.write(text)
	

laparams = LAParams(detect_vertical=True)
resource_manager = PDFResourceManager()
device = PDFPageAggregator(resource_manager, laparams=laparams)
interpreter = PDFPageInterpreter(resource_manager, device)

if __name__ == '__main__':
	for file_name in os.listdir("pdf_source"):
		if file_name.endswith(".pdf"):
			print(file_name)
			text_in_page = pdf_read_controller("pdf_source/" + file_name)
			make_txtfile("eng_txt_split",file_name.rstrip("pdf")+"txt",text_in_page)

Lesen Sie alle PDFs im Ordner "pdf_source", um eine Textdatei zu erstellen und auszugeben.

 $ python pdf_to_txt.py
report_3.pdf
report_7.pdf
report_2.pdf
report_1.pdf
unpack requires a buffer of 10 bytes
unpack requires a buffer of 8 bytes
report_5.pdf
report_9.pdf
report_8.pdf
unpack requires a buffer of 6 bytes
unpack requires a buffer of 6 bytes
unpack requires a buffer of 4 bytes
report_4.pdf
report_6.pdf
report_10.pdf

Ich erhalte einige Fehler, ignoriere sie jedoch und erstelle eine Textdatei. PDF ist verwirrend. Ähnlicher Fehler: [struct.error: unpack erfordert ein String-Argument der Länge 16](https://stackoverflow.com/questions/40158637/struct-error-unpack-requires-a-string-argument-of-length -16)

1-2. Visuelle Überprüfung des Textes (OK ohne)

スクリーンショット 2019-12-11 16.34.43.png

Zum Beispiel enthielt ein Teil des Textes diese Teile. Ich möchte die Google Translate-API nicht umsonst verwenden. Löschen Sie daher die Teile, die Sie nicht benötigen.

2. Textformatierung

let_translatable.py


import os

if __name__ == '__main__':
	for file_name in os.listdir("eng_txt_split"):
		if file_name.endswith(".txt"):
			print(file_name)
			text = ""
			with open("eng_txt_split/"+file_name) as f:
				l = f.readlines()
				for line in l:
					text += str(line).rstrip('\n')
				
			path_w = "eng_txt/" + file_name
			with open(path_w, mode='w') as f:
				f.write(text)

Der in PDF Miner angezeigte Text ist voller Zeilenumbrüche. Wenn Sie ihn so wie er ist in Google Translate einfügen, wird er nicht gut übersetzt. Erstellen Sie daher eine neue Textdatei ohne Zeilenumbrüche und geben Sie sie in den Ordner eng_txt aus.

$ python let_translatable.py
report_4.txt
report_10.txt
report_2.txt
report_6.txt
report_9.txt
report_5.txt
report_8.txt
report_7.txt
report_3.txt
report_1.txt

3. Übersetzen Sie vom Englischen ins Japanische!

Der resultierende Text wird schließlich übersetzt. Den Inhalt finden Sie unter oben.

translate_en_jp.py


import requests
import json
import os
import re
import time

API_key = '<Bitte geben Sie hier den API-Schlüssel ein>'
def post_text(text):
    url_items = 'https://www.googleapis.com/language/translate/v2'
    item_data = {
        'target': 'ja',
        'source': 'en',
        'q':text
    }
    response = requests.post('https://www.googleapis.com/language/translate/v2?key={}'.format(API_key), data=item_data)
    return response.text
    
def jsonConversion(jsonStr):
    data = json.loads(jsonStr)
    return data["data"]["translations"][0]["translatedText"]
    
def split_text(text):
    sen_list = text.split('.')
    
    to_google_sen = ""
    from_google = ""
    
    for index, sen in enumerate(sen_list[:-1]):
        to_google_sen += sen + '. '
        if len(to_google_sen)>1000:
            from_google += jsonConversion(post_text(to_google_sen)) +'\n'
            time.sleep(1)
            
            to_google_sen = ""
        if index == len(sen_list)-2:
            from_google += jsonConversion(post_text(to_google_sen))
            time.sleep(1)
    return from_google
        

if __name__ == '__main__':
	for file_name in os.listdir("eng_txt"):
		print("source: " + file_name)
		with open("eng_txt/"+file_name) as f:
		    s = f.read()
		    new_text = split_text(s)
		    path_w = "jpn_txt/" + file_name
		    with open(path_w, mode='w') as f:
			    f.write(new_text)
 $ python translate_en_jp.py
source: report_4.txt
source: report_10.txt
source: report_2.txt
source: report_6.txt
source: report_9.txt
source: report_5.txt
source: report_8.txt
source: report_7.txt
source: report_3.txt
source: report_1.txt

Langtext wird einige Zeit dauern.

Ergebnisse

Die übersetzte Textdatei befindet sich im Ordner jpn_txt. スクリーンショット 2019-12-11 17.04.05.png

Damit müssen Sie sich keine Sorgen um englische PDF-Dateien machen! Der von diesem ausgegebene Text hat jedoch kein Konzept für das Layout, und ich denke, dass er möglicherweise nicht gut zwischen den Seiten übersetzt werden kann. Ursprünglich wäre es schön, wenn wir diesen Bereich bewältigen könnten, aber es scheint ziemlich schwierig zu sein. Ich hoffe, Sie können es verwenden, wenn Sie viele PDFs auf Japanisch lesen möchten.

Recommended Posts

Englisch PDF wird ins Japanische übersetzt
PDF mit Python rastern
Japanische Ausgabe mit Python
Ich habe Python auf Japanisch geschrieben
OCR aus PDF in Python
Versuchen Sie, Englisch PDF Teil 1 zu übersetzen
Japanische JSON-Datei anzeigen
Ich verstehe Python auf Japanisch!
Holen Sie sich japanische Synonyme mit Python
Konvertieren Sie Markdown in Python in PDF
Machen Sie matplotlib in 3 Minuten mit Japanisch kompatibel
"Ausnahmestapelüberlauf!" In PyMu PDF
Umgang mit Japanisch mit Python
Vergleich japanischer Konvertierungsmodule in Python3
Fügen Sie mit Colaboratory japanische Schriftarten in Bilder ein
Extrahieren Sie japanischen Text aus PDF mit PDFMiner
PDF mit Latex-Erweiterung mit Sphinx ausgeben
R: Verwenden Sie im Skript Japanisch anstelle von Japanisch
Behandelt japanische UTF-8-Zeichen in MySQL db of Python.