Actualización 2021: Paquete de Python instalable
Implementación de Python de algunos algoritmos de decodificación de clasificación temporal conexionista común (CTC) . Se proporciona un modelo de lenguaje minimalista.
pip install .tests/ y ejecute pytest para verificar si la instalación funcionó Aquí hay un ejemplo ejecutable minimalista:
import numpy as np
from ctc_decoder import best_path , beam_search
mat = np . array ([[ 0.4 , 0 , 0.6 ], [ 0.4 , 0 , 0.6 ]])
chars = 'ab'
print ( f'Best path: " { best_path ( mat , chars ) } "' )
print ( f'Beam search: " { beam_search ( mat , chars ) } "' ) Se espera que la mat de salida (matriz Numpy, Softmax ya aplicada) de la red neuronal entrenada por CTC tenga forma TXC y se pasa como el primer argumento a los decodificadores. T es el número de pasos de tiempo, y C el número de caracteres (el CTC-Wank es el último elemento). Los caracteres que pueden predecir la red neuronal se pasan como la cadena chars al decodificador. Los decodificadores devuelven la cadena decodificada.
Ejecutando las salidas de código:
Best path: ""
Beam search: "a"
Para ver más ejemplos sobre cómo usar los decodificadores, eche un vistazo a los scripts en las tests/ carpeta.
La búsqueda del haz puede integrar opcionalmente un modelo de idioma a nivel de caracteres. Las estadísticas de texto (BigRams) se utilizan mediante la búsqueda del haz para mejorar la precisión de la lectura.
from ctc_decoder import beam_search , LanguageModel
# create language model instance from a (large) text
lm = LanguageModel ( 'this is some text' , chars )
# and use it in the beam search decoder
res = beam_search ( mat , chars , lm = lm )El decodificador de búsqueda de léxico calcula una primera aproximación con la mejor decodificación de ruta. Luego, usa un árbol BK para recuperar palabras similares, las califica y finalmente devuelve la mejor palabra de puntuación. El árbol BK se crea proporcionando una lista de palabras de diccionario. Un parámetro de tolerancia define la distancia de edición máxima de la palabra de consulta a las palabras del diccionario devueltas.
from ctc_decoder import lexicon_search , BKTree
# create BK-tree from a list of words
bk_tree = BKTree ([ 'words' , 'from' , 'a' , 'dictionary' ])
# and use the tree in the lexicon search
res = lexicon_search ( mat , chars , bk_tree , tolerance = 2 )Algunas notas:
rnn_output tiene forma TXBXC, con B la dimensión de lotesmat = rnn_output[:, 0, :]Decodificadores recomendados:
best_path : el mejor decodificador de ruta (o codiciosa), el más rápido de todos los algoritmos, sin embargo, otros decodificadores a menudo funcionan mejorbeam_search : el decodificador de búsqueda del haz, opcionalmente integra un modelo de idioma a nivel de caracteres, se puede ajustar a través del parámetro de ancho del hazlexicon_search : Decoder de búsqueda de léxico, devuelve la mejor palabra de puntuación de un diccionarioOtros decodificadores, de mi experiencia, no son realmente adecuados para fines prácticos, pero pueden usarse para experimentos o investigaciones:
prefix_search : decodificador de búsqueda de prefijotoken_passing : algoritmo de pase de tokenextras/ carpeta)Este documento da sugerencias cuándo usar la mejor decodificación de ruta, decodificación de búsqueda de haz y pases de tokens.