duminică, 21 noiembrie 2010

Corectarea unei carti dupa OCR (daca OCR e facut deficitar)

Salut,
Azi vreau sa impart cu voi un mic algoritm de lucru pe un text dupa OCR.
ORICE imbunatatire o astept aici, orice observatie suplimentara, orice regula noua descoperita.

Problema: un sir de caractere fara spatii trebuie impartit in cuvinte inteligibile in limba romana.
Cand apare problema: cand facem OCR pe un text si OCR-ul pune multe spatii intre literele cuvintelor. Decat sa sterg spatii intre literele unui cuvant (ex: “d e oa r e ce a p lec a t aca s a”), e mai simplu sa renuntam la ele peste tot si apoi sa reimpartim textul rezultat (un sir lung de caractere) folosind cateva reguli.
In plus, OCR recunoaste randurile (paragraph mark), numai ca intr-o carte frazele sunt impartite si ele in randuri – astfel, pe o pagina tiparita o fraza se poate intinde pe 4-5 randuri, randuri marcate cu “paragraph mark” desi nu este nevoie de ele -> asta nu e ok cand se doreste repaginare pe alte formate.

INAINTE DE FACE ORICE, AM DEZACTIVAT OPTIUNEA AUTOCORRECT IN WORD!!!!

Prima chestie pe care am facut-o:
Am inlocuit "de doua ori ENTER", adica doua paragraph mark (in Word: ^p^p) cu un sir imposibil in limba romana: “&&&###”.
Apoi, am inlocuit orice paragraph mark (ENTER) urmat de liniuta de dialog (in Word: ^p-) cu “&&&”.
Apoi, am inlocuit orice liniuta urmata de paragraph mark (in Word: -^p) cu "nimic" - aici am eliminat despartirea in silabe a cuvintelor.
Apoi am inlocuit orice paragraph mark cu un spatiu simplu.

Astfel am obtinut un sir lung de caractere fara impartire in paragrafe si fara spatii.

De aici am inceput:
* am reinlocuit “&&&###” cu DOUA paragraph mark (ca in original) = am refacut spatiile intre capitole
* am reinlocuit “&&&” cu paragraph mark (ca in original) = am refacut liniile de dialog

In acest moment am un text cu fraze care nu se impart pe mai multe randuri (paragraph mark) DAR nu au nici spatii intre cuvinte.

Apoi:
cateva find/replace simple:
* dupa fiecare semn de punctuatie trebuie spatiu. (spatiu dupa: punct, vigula, semn de exclamatie, semn de intrebare, doua puncte, punct si virgula)
* inaintea fiecarei litere mari ar trebui sa se puna spatiu (asta nu stiu cum se face in Word, astept solutii)

Urmeaza chestii observate pe parcurs (si aici astept de la voi alte reguli de introdus):
FIND/REPLACE
in limba romana nu exista in nici un cuvant alaturarea "dn". So, "dn" = "d n"
analog:
"ăa" -> "ă a"
"tc" -> "t c" (in textul test au rezultat 410 de inlocuiri)
"ds" -> "d s" (in textul test au rezultat 32 de inlocuiri)
"ăf" -> "ă f" (in textul test au rezultat 198 de inlocuiri)
"ăe" -> "ă e" (in textul test au rezultat 174 de inlocuiri)
"ld" -> "l d" (in textul test au rezultat 189 de inlocuiri) avem totusi un cuvant "caldura", unde apare alaturarea -> e mai usor sa corectezi "caldura" decat sa pui spatii la alte zeci/sute de cazuri unde regula este valabila
"tt" -> "t t" (in textul test au rezultat 97 de inlocuiri)
"ms" -> "m s" (in textul test au rezultat 219 de inlocuiri)
"rf" -> "r f" (in textul test au rezultat 100 de inlocuiri) - exista o mica scapare la "perfect" - se face la mana, la a doua citire
"md" -> "m d" (in textul test au rezultat 118 inlocuiri) - exista o mica scapare la "deocamdata" - se face la mana, la a doua citire
"în" -> " în " urmat imediat de "c în d" -> " cînd " si "v în d" -> "vînd "
"n-ai" -> " n-ai
"isă" -> "i să " urmat imediat de "să -" -> "să-"


Asta e stadiul de pana acum, astept sugestii de la cei care fac OCR si apoi reformateaza textul... voi cum faceti?


P.S.: am uitat de celebrele "verbe cu cratima" de tipul "mi-am", "ti-ai", "te-am"... aici incerc sa gasesc niste reguli care sa nu puna spatii aiurea...


UPDATE dupa 3 zile: munca e una foarte simpla dar foarte migaloasa. Sunt aproximativ 10.000 dde combinatii de analizat, practic trebuie analizat fiecare litera din alfabet cu toate celelalte litere.
Am inceput si am sa stau sa "fac" cate 2-3 litere pe zi.
Azi am luat 0 litera de la mijlocul alfabetului, litera "m".
In acel macro de find/replace am sa mai includ:
"mc" -> "m c" (in textul test au rezultat 223 de inlocuiri)
"mf" -> "m f" (in textul test au rezultat 80 de inlocuiri)
"mg" -> "m g" (in textul test au rezultat 15 de inlocuiri)
"mj" -> "m j"
"ml" -> "m l" (in textul test au rezultat 48 de inlocuiri)
"mt" -> "m t" (in textul test au rezultat 66 de inlocuiri)

3 comentarii:

denisa1999 spunea...

ce complicat suna la tine...
Ai incercat clear formatting in word, la style? la diacritice am observat ca nu se pastreaza litera 'î', care la inceput de rand ar trebui sa fie Î.
la find replace 'l' ti-l inlocuieste cu cifra 1.(exemplu: lovindu-l apare lovindu-1)

denisa1999 spunea...

la cuvintele gen Ioan litera 'I' apare inlocuita cu litera el - lioan

Cristian spunea...

Suna complicat dar imagineaza-ti ca fac un macro cu tot ce observ, si la urmatorul text de tipul asta dau un simplu "Run macro".
Mai cercetez si am sa scot un macro pe care sa si-l puna oricine.

Asta daca nu se baga baietii de la http://www.softset.ro/ sa faca o chestie mult mai inteligenta... pentru ca eu sunt constient ca sunt un simplu "palmas".