Atualização 2021: pacote python instalável
Implementação de Python de alguma classificação temporal de conexão comum (CTC) de decodificação de algoritmos . Um modelo de linguagem minimalista é fornecido.
pip install .tests/ e execute pytest para verificar se a instalação funcionou Aqui está um exemplo executável 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 ) } "' ) O mat de saída (matriz Numpy, Softmax já aplicado) da rede neural treinado por CTC deve ter o Shape TXC e é passado como o primeiro argumento para os decodificadores. T é o número de etapas de tempo e C o número de caracteres (a queima de CTC é o último elemento). Os caracteres que podem ser previstos pela rede neural são passados como a sequência chars para o decodificador. Os decodificadores retornam a corda decodificada.
Executando as saídas do código:
Best path: ""
Beam search: "a"
Para ver mais exemplos sobre como usar os decodificadores, dê uma olhada nos scripts na tests/ pasta.
A pesquisa de feixe pode opcionalmente integrar um modelo de linguagem no nível do caractere. As estatísticas de texto (bigrams) são usadas pela pesquisa de feixe para melhorar a precisão da leitura.
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 )O decodificador de busca do léxico calcula uma primeira aproximação com a melhor decodificação do caminho. Em seguida, ele usa uma árvore BK para recuperar palavras semelhantes, obtê-las e finalmente retorna a melhor palavra de pontuação. O BK-Tree é criado fornecendo uma lista de palavras de dicionário. Um parâmetro de tolerância define a distância máxima de edição da palavra de consulta até as palavras de dicionário retornado.
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 )Algumas notas:
rnn_output possui forma txbxc, com b a dimensão do lotemat = rnn_output[:, 0, :]Decodificadores recomendados:
best_path : Melhor Path (ou Ganancioso) Decodificador, o mais rápido de todos os algoritmos, no entanto, outros decodificadores geralmente têm melhor desempenhobeam_search : decodificador de pesquisa de feixe, opcionalmente integra um modelo de linguagem no nível do caractere, pode ser ajustado através do parâmetro de largura do feixelexicon_search : Decodificador de pesquisa do léxico, retorna a melhor palavra de pontuação de um dicionárioOutros decodificadores, da minha experiência não são realmente adequados para fins práticos, mas podem ser usados para experimentos ou pesquisas:
prefix_search : decodificador de pesquisa prefixotoken_passing : algoritmo de passagem para tokenextras/ Pasta)Este artigo fornece sugestões quando usar a melhor decodificação do caminho, decodificação de pesquisa de feixe e passagem de token.