dmlls / jizt-tfg

Servicio de Resumen de Textos con AI en la Nube (versión TFG).
https://dmlls.github.io/jizt-tfg-website/
GNU General Public License v3.0
13 stars 3 forks source link

[Encoder] Optimización del algoritmo de división del texto #97

Closed dmlls closed 3 years ago

dmlls commented 3 years ago

Al momento de escribir en la memoria la parte relativa a la codificación de texto, nos hemos dado cuenta de que la forma en la que dividíamos el texto se puede mejorar.

Anteriormente, realizábamos una aproximación del número de tókenes que tendría una frase una vez codificada. Si dicha aproximación había resultado incorrecta, teníamos que corregirla y ejecutar de nuevo el algoritmo, así hasta que fuera correcta. Esto lo hacíamos tratando de conseguir un algoritmo general, válido para cualquier modelo. Sin embargo, con la arquitectura de microservicios actual, cada encoder de cada modelo es un servicio por separado, por lo que podemos escribir dicho algoritmo de forma que se ajuste al funcionamiento concreto del modelo que estamos utilizando.

Por ello, dado que usamos el modelo T5, ajustaremos el algoritmo a la forma en la que dicho modelo codifica el texto. Esto nos permite calcular exactamente (es decir, sin aproximaciones, como sucedía anteriormente) el número de tókenes que le corresponderán a cada frase.

Además, dado que prácticamente hay que reescribir el código completo, intentaremos optimizarlo, ya de paso. Una mejora clara puede ser utilizar solo los índices de las frases (enteros) en vez de trabajar directamente con estas (strings).

dmlls commented 3 years ago

Hemos utilizado el siguiente script para comparar los rendimientos de la versión antigua y la nueva:

import timeit
from text_encoding import SplitterEncoder as old
from text_encoding_new import SplitterEncoder as new

def wrapper(func, *args, **kwargs):
    def wrapped():
        return func(*args, **kwargs)
    return wrapped

if __name__ == "__main__":
    with open("article_6.txt", "r") as file:
        text = " ".join(file.readlines())
    print("Longitud del texto:", len(text), "caracteres.")

    tk_old = old()
    tk_new = new()

    wrapped = wrapper(tk_old.encode, text)
    print("Encoder antiguo:", timeit.timeit(wrapped, number=20), "segundos.")

    wrapped = wrapper(tk_new.encode, text)
    print("Encoder nuevo:  ", timeit.timeit(wrapped, number=20), "segundos.")

La mejora es clara:

Longitud del texto:   119298 caracteres.
Encoder antiguo:      25.57345193799847 segundos.
Encoder nuevo:        7.182184395998775 segundos.