Progetto:Bot/Programmi in Python per i bot/fixOCR.py

Da Wikisource.
#!/usr/bin/python
# -*- coding: utf-8  -*-

# per lanciare il programma usare la riga di comando: python fixOCR.py [nome file djvu]
# nel file replace.text (UTF-8) elencare le coppie di eventuali sostituzioni, una coppia alla riga, con i due elementi separati dai caratteri ->. Gli spazi vengono conservati. 
# esempi:
'''
é->è
ì->í
'->’
eh’->ch’
cbe->che
'''

import re,sys,pickle   # importo i moduli re (regex), sys (necessario per l'eventuale passaggio parametri da riga di comando),
                       # pickle (permette di salvare su file qualsiasi variabile anche complessa)
from os import system, path # da os (routine per interfaccia con il sistema operativo) importo system (che serve per lanciare un programma esterno
                       # come se si operasse dalla riga di comando: ci serve per lanciare routine djvuLibre su file djvu

# Questa funzione accetta il nome di un djvu, ne estrae il testo in formato "dsed", ossia in blocchi sempre più piccoli fino al livello word
# (singole parole), e permette di applicare a ogni singola parola una funzione di modifica repl().
# La seconda parte del programma usa il  file dsed modificato e lo rificca dentro il file djvu.

replaceList=[]
if path.isfile("replace.txt"):
    testo=unicode(open("replace.txt").read(),"utf-8").split("\n")
    for i in range(len(testo)):
        coppia=testo[i].split("->")
        if len(coppia)==2 and coppia[0]!="":
            replaceList.append(coppia)
            

def dsedEdit(djvu):
    comando='djvused -u %s -e "select; output-txt" > input.dsed' % (djvu) # preparo la riga di comando da inviare al sistema operativo
    res=system(comando)   # la lancio; il comando estrae il testo e lo salva in input.dsed (file testo uft-8)
    if res != 0:          # verifica eventuale errore
        print "errore nella generazione input.dsed"
        return
    else:
        print "File input.dsed regolarmente creato"
    r=re.compile(r'(word \d+ \d+ \d+ \d+ ")(.+)("[)]+)$')   # preparo la regex per isolare dalle righe word il testo 
    l=unicode(open("input.dsed").read(),"utf-8").split("\n")  # apro input.dsed, lo leggo, lo trasformo in unicode, lo divido in una lista di righe
    for i in range(len(l)):              # scorro tutta la lista....
        if "(word " in l[i]:             # se la riga contiene (word ....
            x=r.findall(l[i])[0]         # scateno la regex; se tutto va bene mi restituisce una lista di tre elementi, quello centrale è il testo
                                         # della singola word (parola). 
            old="".join(x)               # memorizzo la vecchia stringa costituita dalla lista
            if len(x)==3:                # se tutto va bene...
                x1=repl(x[1])                          # lancio la funzione repl sull'elemento centrale x[1]
                l[i]=l[i].replace(old,x[0]+x1+x[2])    # e sostituisco, nella riga, la stringa "vecchia" con quella modificata
    open("output.dsed","w").write(("\n".join(l)).encode("utf-8"))     # salvo il tutto in output.desd
    print "File output.dsed regolarmente creato"
    comando='djvused %s -f output.dsed -s' % (djvu)                   # preparo il comando per ficcare il nuovo testo nel djvu
    res=system(comando)                                               # lo lancio....
    if res != 0:                                                      # verifico eventuali errori di sistema...
        print "errore nel montaggio di output.dsed"
        return
    print "Finito; testo corretto montato in ",djvu
    return                                                  # finito. 
                                  
	
# funzione di trasformazione : può essere qualsiasi, una serie di replace, una serie di regex.....
def repl(testo):                       # riceve una parola...
    for i in replaceList:
        testo=testo.replace(i[0],i[1]) # la modifica ....
    return testo                # la restituisce  modificata

''' unused utilities        
### pickle utilities 

def carica_pcl(nome_file, folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file)
    contenuto=pickle.load(f)
    f.close()
    return contenuto

def salva_pcl(variabile,nome_file="dato",folder="dati/"):
    nome_file=folder+nome_file+".pcl"
    f=open(nome_file,"w")
    pickle.dump(variabile, f)
    f.close()
    print "Variabile salvata nel file "+nome_file
    return

### find_stringa() and produci_lista

def find_stringa(stringa,idi,idf,dc=0,x=None,side="left"):
    if side=="right":
        idip=stringa.rfind(idi)
    else:
        idip=stringa.find(idi)
    idfp=stringa.find(idf,idip+len(idi))+len(idf)
    if idip>-1 and idfp>0:
        if x!=None:
            while stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                if stringa[idip:idfp].count(x)>stringa[idip:idfp].count(idf):
                    idfp=stringa.find(idf,idfp)+len(idf)
                
        if dc==0:
            vvalore=stringa[idip+len(idi):idfp-len(idf)]
        else:
            vvalore=stringa[idip:idfp]
    else:
        vvalore=""
    return vvalore

def produci_lista(testo,idi,idf,dc=1,inizio=None):
    t=testo[:]
    lista=[]
    while not find_stringa(t,idi,idf,1,inizio)=="":
        el=find_stringa(t,idi,idf,1,inizio)
        t=t.replace(el,"",1)
        if dc==0:
            el=find_stringa(el,idi,idf,0,inizio)
        lista.append(el)
    return lista
'''

if __name__ == "__main__":

    djvu=sys.argv[1]
    dsedEdit(djvu)