#!/usr/bin/env python # encoding: utf-8 import sys from math import log from math import exp ttextref = 0 #numero de frases del texto de referencia lttextref = {} #lttextref[numero de frase] = numero de palabras ttraduc = 0 #numero de frases de la traduccion lttraduc = {} #lttraduc[numero de frase] = numero de palabras def calculacounts(ttoken, token, line, frase): """Calcula el numero de veces que el token sale en la frase""" if ttoken == 1: return frase.count(token[0]) n = 0 pos = 0 while pos <= lttraduc[line]-ttoken+1: try: pos = frase.index(token[0], pos) except: return n esta = True for i in range(1,ttoken): try: if frase[pos+i] != token[i]: esta = False break except: return n if esta: n = n + 1 pos = pos + 1 return n def calculacountr(ttoken, token, line, frase): """Calcula el numero de veces que el token sale en la frase""" if ttoken == 1: return frase.count(token[0]) n = 0 pos = 0 while pos <= lttextref[line]-ttoken+1: try: pos = frase.index(token[0], pos) except: return n esta = True for i in range(1,ttoken): try: if frase[pos+i] != token[i]: esta = False break except: return n if esta: n = n + 1 pos = pos + 1 return n def calculacountclip(i, token, line, fraser, frases): """Calcula el minimo de veces que sale el token entre la frase r y s""" cr = calculacountr(i, token, line, fraser) cs = calculacounts(i, token, line, frases) if cr > cs: return cs else: return cr def calculapifrase(i, line, fraser, frases): """Calcula Pi entre la frase r y s""" n = 0.0 l = [] for j in range(lttextref[line]-i+1): token = fraser[j:j+i] #crear token de tamaño i if token not in l: l.append(token) n = n + calculacountclip(i, token, line, fraser, frases) return n def calculantokensens(i, traduc): """Cuenta el numero de tokens de tamaño i en el texto traduc""" n = 0 #Por cada frase contar todos los posibles tokens for j in range(ttraduc): n = n + lttraduc[j] - i + 1 return n def calculapi(i, r, traduc): """Calcula Pi entre el texto r y traduc""" n = 0.0 for line in range(ttextref): n = n + calculapifrase(i, line, r[line], traduc[line]) nt = calculantokensens(i, traduc) return n/nt def calculapn(n, r, traduc): """Calcula el Pn de toda la traduccion""" pn = 0.0 for i in range(1,n+1): pn = pn + log(float(calculapi(i, r, traduc))) return pn def calculabp(tamr, tamt): """Calcula el coeficiente BP """ if tamt >= tamr: return 1 else: return exp(1.0-(float(tamr)/float(tamt))) def main(argv=None): global ttextref, lttextref, ttraduc, lttraduc N = int(sys.argv[1]) h = {} npalabras = 0 bleu = [] tamtextref = 0 r = file(sys.argv[2],"r") textref = r.readlines() r.close() ttextref = len(textref) ftraduc = sys.argv[3:] for i in range(ttextref): #Convierto cada frase en lista de palabras textref[i] = textref[i].split() for i in range(ttextref): #Convierto cada frase del texto en una lista de numeros lttextref[i] = len(textref[i]) tamtextref = tamtextref + lttextref[i] for j in range(lttextref[i]): if textref[i][j] not in h: h[textref[i][j]] = npalabras textref[i][j] = npalabras npalabras = npalabras + 1 else: textref[i][j]=h[textref[i][j]] #Aqui tengo la referencia en palabras y cada fila es una frase for f in ftraduc: s = file(f,"r") traduc = s.readlines() s.close() ttraduc = len(traduc) for i in range(ttraduc): traduc[i] = traduc[i].split() #En este punto, tengo la traduccion (una de todas las posibles) por palabras y en cada fila una frase tamtraduc = 0 for i in range(ttraduc): lttraduc[i] = len(traduc[i]) tamtraduc = tamtraduc + lttraduc[i] for j in range(lttraduc[i]): if traduc[i][j] not in h: h[traduc[i][j]] = npalabras traduc[i][j] = npalabras npalabras = npalabras + 1 else: traduc[i][j]=h[traduc[i][j]] pn = calculapn(N, textref, traduc) resul = exp(float(pn)/N) bp = calculabp(tamtextref, tamtraduc) bleu.append(bp*resul) m = max(bleu) print '%i %0.4f' % (bleu.index(m)+1, m) if __name__ == "__main__": sys.exit(main())