BookTranslator
BookTranslator

OCR pentru text vertical japonez: Păstrarea ordinii coloanelor și gestionarea furigana

Extrageți text vertical japonez cu setările corecte de layout, separați furigana de textul principal și verificați rezultatele OCR reale în comparație cu exemplele descărcabile.

BookTranslator

BookTranslator Team

14 min read

Pentru OCR-ul textului vertical japonez, verificați direcția de scriere înainte de a modifica filtrele de imagine. Folosiți un model japonez și o setare de segmentare capabilă să gestioneze textul vertical, verificați coloanele în ordinea lor intenționată și decideți dacă aveți nevoie doar de textul principal sau și de furigana. O pagină plină de caractere recognoscibile poate constitui în continuare o transcriere inutilizabilă dacă secvența acestora este greșită.

Am efectuat un experiment local mic și reproductibil pentru a transforma aceste decizii în elemente concrete. O configurație orizontală ne-a amestecat cele trei coloane verticale. O configurație verticală a recuperat textul simplu de bază, dar adăugarea furigana a modificat două semne de punctuație, iar decuparea textului ruby nu a eliminat erorile de punctuație.

Acestea sunt rezultate obținute dintr-un eșantion sintetic în mod deliberat mic, nu o afirmație de acuratețe referitoare la toate cărțile japoneze. Lecția utilă este mai restrânsă: evaluați separat recunoașterea caracterelor, ordinea de citire și gestionarea adnotărilor. Nu trimiteți rezultatul la traducere doar pentru că arată a japoneză.

Mai întâi identificați textul pe care îl doriți cu adevărat

În compoziția verticală japoneză convențională, caracterele progresează în jos pe o linie, iar liniile merg de la dreapta la stânga. Textul ruby este textul mai mic asociat cu caracterele de bază; furigana oferă de obicei pronunția acestora. Documentul W3C Requirements for Japanese Text Layout descrie aceste direcții de scriere și relații ruby.

Înainte de OCR, etichetați regiunile semnificative ale paginii:

  • coloane verticale principale;
  • text ruby mic alăturat corpului textului;
  • titluri orizontale, legende sau tabele;
  • numere de pagină și titluri curente;
  • note marginale sau pagini adiacente nerelevante.

Nu tratați fiecare fâșie verticală ca pe un paragraf independent. O fâșie de kana mici alături de 図書館 poate reprezenta citirea sa, としょかん, nu propoziția următoare.

Alegeți politica de ieșire înainte de a judeca rezultatul OCR:

Sarcina cititoruluiRezultatul doritCe constituie o problemă
Căutați sau traduceți textul corpuluiText principal în ordine; citirile utile salvate separatRuby inserat în proză, textul corpului omis, coloane reordonate
Studierea pronunțieiText principal plus citiri asociate corectRuby lipsă sau o citire atașată greșit la cuvânt
Produceți o transcriere fidelăTextul principal, relațiile de anotare și deciziile editoriale păstrateȘtergerea silențioasă sau normalizarea materialului pe care ați intenționat să îl păstrați

Același rezultat poate trece un test și poate eșua altul. Experimentul nostru folosește transcriere exclusiv a corpului ca țintă de comparație. Nu consideră lipsa furigana ca fiind acceptabilă pentru o ediție de studiu a pronunției.

Un experiment OCR real cu trei propoziții

Eșantionul folosește aceste propoziții scrise de autor:

朝の図書館で本を読む。
古い地図には川が見える。
明日は友人と駅で会う。

Ele descriu cititul la o bibliotecă, vederea unui râu pe o hartă veche și întâlnirea cu un prieten la o stație. Există 34 de puncte de cod Unicode pentru textul corpului atunci când întreruperile de rând sunt eliminate, inclusiv cele trei puncte finale japoneze.

Am randat același corp în trei forme:

  1. Text orizontal.
  2. Trei coloane verticale, citite de la dreapta la stânga.
  3. Aceleași coloane verticale cu furigana lângă 図書館, 地図, 友人, și 駅.

Eșantion OCR japonez sintetic cu trei coloane verticale citite de la dreapta la stânga și furigana mai mică în dreapta anumitor cuvinte.

Acestea sunt imagini didactice curate, nu pagini scanate dintr-o carte. Motorul de randare folosește Noto Sans CJK JP, caractere pentru corp de 64 de pixeli, ruby de 24 de pixeli și o plasare verticală simplificată, glyph cu glyph. Desenează puncte finale verticale sub formă de mici cercuri conturate în poziții alese manual, în loc să utilizeze poziționarea corectă pe verticală a fontului; prin urmare, rezultatele punctuației nu stabilesc cum se comportă OCR pe o carte tipărită corect. Nu reproduce fiecare regulă tipografică japoneză. Nu există estompare, înclinare, textură de hârtie, scriere de mână, tipar istoric sau pagină cu direcție mixtă în acest test.

Motor, modele și setări

Experimentul a fost rulat pe 7 septembrie 2026, utilizând Tesseract.js 7.0.0 cu Tesseract.js-core 7.0.0 local pe macOS ARM64. Toate apelurile reușite au folosit tessdata_fast modele la commit-ul 87416418657359cb625c412a48b6e1d6d41c29bd, cu OEM 1, modul de motor exclusiv LSTM.

Depozitul oficial de modele al Tesseract furnizează separat jpn și jpn_vert fișiere. Documentația sa descrie PSM 5 ca un bloc uniform aliniat vertical și PSM 6 ca un bloc de text uniform; alegeți o ipoteză de segmentare care se potrivește regiunii recunoscute. Consultați documentația privind segmentarea paginii.

Cazurile noastre înregistrate au folosit jpn cu PSM 6 pentru textul orizontal, jpn_vert cu PSM 5 pentru textul vertical și un jpn/PSM 6 de control vertical necorespunzător în mod deliberat. Atât modelul, cât și segmentarea se schimbă între cele două configurații verticale, așa că aceasta este o comparație de flux de lucru, nu un experiment care izolează efectul vreuneia dintre setări în mod individual.

O încercare inițială cu tessdata_best a fost abandonată în nucleul WebAssembly disponibil înainte de a produce text OCR. Am trecut la oficialul întreg tessdata_fast modele pentru compatibilitate și am înregistrat acea eșuare. Nicio concluzie cu privire la acuratețea unei familii de modele nu decurge din acea trecere.

Ce s-a întors efectiv

Comparația elimină spațiile albe și aplică normalizarea Unicode NFC. Aceasta nu înlocuiește punctuația, nu corectează kanji și nu rearanjează textul. Datele complete ieșiri brute și hash-uri pentru versiune/model, comparație CSV pentru corp, și anotări de eroare sunt descărcabile.

Intrare și configurareRezultat observat față de ținta bazată exclusiv pe corp
Orizontal, jpn, PSM 6Toate cele 34 de puncte de cod s-au potrivit după eliminarea spațiilor albe
Vertical, jpn, control PSM 6Ieșirea s-a extins pe mai multe coloane și a inclus substituții de caractere; text neutilizabil ca proză
Vertical, jpn_vert, PSM 5Toate cele 34 de puncte de cod s-au potrivit după eliminarea spațiilor albe; ordinea coloanelor a fost corectă
Vertical cu furigana, jpn_vert, PSM 5Textul principal a rămas în ordine, dar două 。 semne au devenit ASCII .; scrierea ruby nu a fost returnată ca citiri separate
Trei decupări ale coloanelor de text din imaginea furigana, jpn_vert, PSM 5Prima coloană s-a încheiat cu ., a doua cu ,, a treia cu 。; decuparea nu a eliminat toate defectele de punctuație

De exemplu, cazul furigana a returnat această primă linie:

Expected: 朝の図書館で本を読む。
Observed: 朝 の 図書 館 で 本 を 読む .

Spațiile sunt ignorate de regula noastră de comparare menționată. Punctuația finală nu este. Un flux de lucru bazat exclusiv pe căutare ar putea tolera această diferență, dar o transcriere fidelă ar trebui să o înregistreze și să o corecteze.

Controlul vertical nepotrivit a început cu 明 古 昌, sărind peste caracterele de sus ale coloanelor în loc să urmeze prima propoziție intenționată. Rezultatul său ilustrează de ce recunoașterea simbolurilor individuale nu este același lucru cu reconstruirea unei secvențe de citire.

Au existat șapte apeluri OCR finalizate: patru cazuri pe imagine întreagă și trei decupaje. Am păstrat fiecare rezultat. Un agent a comparat rezultatele cu adevărul de bază autorizat și a inspectat vizual imaginile; nu a existat nicio revizuire umană orbită sau un corpus extins de benchmark. Experimentul nu stabilește un motor cel mai bun în mod universal, o rată de acuratețe la nivelul unei cărți sau performanța pe scanarea dumneavoastră.

Folosiți un flux de lucru orientat spre regiuni pe propria pagină

1. Păstrați sursa și alegeți o pagină dificilă

Păstrați imaginea sau PDF-ul original neschimbate. Lucrați pe o copie și notați numărul paginii. Alegeți o pagină care conține problema pe care încercați să o rezolvați: ruby dens, un șanț îngust, un titlu orizontal deasupra textului vertical sau caractere neobișnuit de mici.

O pagină de titlu curată nu este un test de acceptare util pentru o carte ale cărei pagini de text au un alt aspect. Dacă sursa este un PDF, extrageți sau randați pagina selectată folosind un instrument în care aveți încredere înainte de a rula un flux de lucru OCR exclusiv pe imagine. Scripturile acestui articol acceptă fișiere PNG; ele nu procesează PDF-uri și nici nu construiesc straturi PDF căutabile.

Pentru întregul proces de pregătire și traducere a documentelor scanate, utilizați mai largul flux de lucru pentru PDF-uri scanate. Acest ghid se concentrează pe direcția japoneză, segmentare, ruby și deciziile de transcriere.

2. Corectați defectele de captură fără a distruge textul mic

Inspectați caracterele efective la un nivel de zoom util. Îndreptați înclinările neintenționate, eliminați marginile de pagină irelevante și păstrați un contrast suficient pentru a distinge kana mici și punctuația. Evitați să tratați pragul agresiv sau accentuarea ca pe o îmbunătățire automată: comparați imaginea rezultată cu cea originală înainte de a avea încredere în OCR.

Orientarea Tesseract privind calitatea imaginii acoperă rezoluția, zgomotul, înclinarea și marginile. Acestea sunt separate de direcția de scriere. Corectarea înclinării unei pagini care a fost fotografiată în unghi nu este aceeași operațiune cu rotirea laterală a textului vertical japonez orientat în sus.

Fișierele eșantion conțin metadate de 300 dpi, dar acel număr nu creează detalii lipsă. Dimensiunea lor efectivă a glifelor de text este de 64 de pixeli. O fotografie de joasă rezoluție reetichetată „300 dpi” este tot acea fotografie de joasă rezoluție.

3. Separați regiunile atunci când pagina încalcă o ipoteză de machetă

Încercați blocul vertical principal separat înainte de a cere unui singur apel OCR să gestioneze un titlu orizontal, proză verticală, o ilustrație și un număr de pagină. Păstrați o înregistrare simplă a regiunilor, cum ar fi „pagina 12, corpul textului, coloana 1 din dreapta”. Această înregistrare face ca asamblarea ulterioară să poată fi auditată.

Pentru materialul cu direcții mixte, recunoașteți regiunea orizontală cu setarea orizontală adecvată și regiunea verticală cu o setare verticală, apoi asamblați-le în ordinea intenționată de document. Acesta este un flux de lucru recomandat de testat pe fișierul dumneavoastră, nu o capabilitate de machetă mixtă măsurată prin cele trei imagini eșantion ale noastre.

Experimentul nostru de decupare a folosit coordonate exacte cunoscute pentru a exclude banda ruby de lângă fiecare coloană sintetică, păstrând în același timp textul său și o marjă albă. A fost o demonstrație de selectare manuală a regiunilor, nu un algoritm automat de eliminare a furigana. Nu aplicați coordonatele sale pe o pagină reală de carte.

4. Verificați coloanele înainte de a corecta caracterele individuale

Comparați primul și ultimul caracter al corpului textului din fiecare coloană, lucrând în direcția intenționată. Confirmați că nu lipsește nicio coloană, că nu este duplicată, inversată sau amestecată cu vecinul ei. Apoi inspectați propozițiile de la granițele coloanelor.

Abia după aceea ar trebui să corectezi kanji individuale, kana, punctuație, numere și nume. Altfel, poți pierde timp șlefuind fragmente care sunt asamblate în paragraful greșit.

O revizuire utilă în trei pași este:

  1. Regiuni și ordine: fiecare regiune de corp vizată este prezentă o singură dată și în secvență.
  2. Caractere: compară imaginea efectivă cu textul, incluzând punctuația mică și semnele kana.
  3. Anotații: decide dacă fiecare element ruby, notă sau etichetă marginală este păstrat, separat sau exclus în mod deliberat.

Valoarea de încredere a unui motor nu este un substitut pentru aceste verificări. Controlul nostru amestecat a returnat totuși un număr de încredere raportat de motor; acest lucru nu a făcut ca ordinea de citire să fie acceptabilă.

Nu elimina furigana până când nu știi de ce

Pentru extracția exclusivă a corpului textului, caracterele ruby nu ar trebui să devină accidental un al doilea strat de proză. Dar ștergerea fiecărui șir mic de kana nu este o regulă generală sigură. O lectură poate ajuta la clarificarea unui nume, la păstrarea pronunției alese de un autor sau la sprijinirea sarcinii de studiu a cititorului.

În imaginea noastră cu furigana, rezultatul OCR a conținut kanji-ul principal, dar nu a returnat cele patru lecturi ca set separat de anotații. Acest lucru ar putea fi suficient, după corectarea punctuației, pentru o sarcină de căutare bazată doar pe corp. Este insuficient dacă livrabilul promite informații privind pronunția.

Stochează lecturile importante separat și asociază-le cu apariția corectă. De exemplu:

Page: sample 1
Column: 1 from the right
Base text: 図書館
Reading shown: としょかん
Decision: retain body text; save reading in the annotation record

Transcrierea ruby separată din eșantion face această politică explicită. Este un adevăr de bază creat împreună cu imaginea, nu o revendicare de succes OCR.

Dacă OCR-ul amestecă kana într-un cuvânt sau își pierde asocierea, compară cu imaginea și repară transcrierea. Nu cere unui model lingvistic să ghicească sursa și să prezinte ghiciul ca text recuperat. Marchează în schimb o lectură incertă pentru revizuire.

Rezultatele decupării pledează, de asemenea, împotriva unei reguli simpliste de tip „elimină ruby și totul se îmbunătățește”: două diferențe de punctuație au rămas, iar sfârșiturile de propoziție afectate s-au schimbat. Această observație aparține acestui exemplar curat anume. Ne spune să verificăm rezultatul după segmentare, nu că decuparea ajută sau dăunează în general OCR-ului.

Reprodu testul sau păstrează un jurnal de revizuire

Descarcă fișierul README al experimentului pentru sursele fixate ale modelelor și fonturilor, versiunile de dependențe, descrierile fișierelor și comenzile. Generatorul de eșantioane, Rulatorul OCR, și scriptul de comparație separă crearea imaginii, recunoașterea și evaluarea.

Runner-ul utilizează documentatul API pentru worker Tesseract.js. Pentru o regiune verticală, setările sale esențiale sunt:

const worker = await createWorker("jpn_vert", 1, {
  langPath: modelDirectory,
  gzip: false,
  cacheMethod: "none",
});
await worker.setParameters({
  tessedit_pageseg_mode: "5",
  user_defined_dpi: "300",
});

modelDirectory trebuie să conțină fișierul descărcat și decomprimat jpn_vert.traineddata. Acesta este un extras, nu programul complet; runner-ul furnizat salvează, de asemenea, rezultatele brute și închide workerii.

Dacă folosiți o altă aplicație OCR, păstrați aceleași dovezi chiar și atunci când numele setărilor diferit: regiunea sursă, fișierul original, versiunea modelului sau a instrumentului, direcția, opțiunea de segmentare, ieșirea efectivă, textul corectat și caracterele nerezolvate. Șablonul jurnalului de revizuire este gol, astfel încât să nu sugereze că paginile dumneavoastră au trecut deja.

Nu convertiți rezultatul nostru minuscul de potrivire exactă într-un procent promis pentru un roman întreg. Diferitele fonturi, coloanele aglomerate, formele istorice, scanările de calitate inferioară și bulele de dialog din manga necesită propriile teste reprezentative. Aspectul manga și recunoașterea scrisului de mână sunt în afara acestui experiment.

Traduceți numai atunci când sursa recuperată este de încredere

Dacă scopul dumneavoastră este căutarea, copierea citatelor sau consultarea dicționarului, textul japonez verificat poate fi rezultatul final. Nu trebuie să traduceți un document întreg doar pentru că a fost implicat OCR.

Dacă o barieră lingvistică vă împiedică în continuare citirea și aveți un fișier utilizabil pe care îl puteți încărca, continuați cu fluxul de lucru pentru traducerea PDF-urilor. Păstrați scanarea originală și transcrierea verificată, astfel încât să puteți distinge erorile de recunoaștere de erorile de traducere. Runner-ul eșantion produce fișiere text și TSV, nu un PDF pregătit pentru încărcare automată; pregătiți formatul de intrare efectiv pe care îl cere următorul instrument.

Modul OCR al BookTranslator reconstruiește conținutul tradus în loc să garanteze aspectul vertical original. Nu presupuneți că va păstra fiecare asociere ruby sau că va repara greșelile de recunoaștere neverificate. Revizuiți ordinea de citire și formatarea documentului final folosind ghidul de păstrare a formatului PDF și lista de verificare finală pentru QA a PDF-urilor.

Predarea sigură nu este „OCR finalizat”. Este „textul japonez intenționat este prezent, secvența sa a fost verificată, iar tratarea adnotărilor este documentată.”

Articole asociate