Mise à jour 2021: package Python installable
Python Implémentation de certains algorithmes de décodage de classification temporelle connexion et de connexion) communs (CTC) . Un modèle de langue minimaliste est fourni.
pip install .tests/ et exécutez pytest pour vérifier si l'installation a fonctionné Voici un exemple exécutable minimaliste:
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 ) } "' ) Le mat de sortie (réseau Numpy, softmax déjà appliqué) du réseau neuronal formé par CTC devrait avoir forme TXC et est passé comme le premier argument aux décodeurs. T est le nombre de pas dans le temps, et C le nombre de caractères (le CTC-Blank est le dernier élément). Les caractères qui peuvent être prédits par le réseau neuronal sont passés sous forme de chaîne chars au décodeur. Les décodeurs renvoient la chaîne décodée.
Exécution des sorties de code:
Best path: ""
Beam search: "a"
Pour voir plus d'exemples sur la façon d'utiliser les décodeurs, veuillez consulter les scripts dans les tests/ dossier.
La recherche de faisceau peut éventuellement intégrer un modèle de langue au niveau des caractères. Les statistiques de texte (bigrams) sont utilisées par la recherche de faisceau pour améliorer la précision de la lecture.
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 )Le décodeur de recherche de lexique calcule une première approximation avec le meilleur décodage de chemin. Ensuite, il utilise un BK-Tree pour récupérer des mots similaires, les marque et renvoie enfin le meilleur mot de score. Le BK-are est créé en fournissant une liste de mots de dictionnaire. Un paramètre de tolérance définit la distance d'édition maximale du mot de requête aux mots du dictionnaire retourné.
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 )Quelques notes:
rnn_output a une forme txbxc, avec b la dimension lotmat = rnn_output[:, 0, :]Décodeurs recommandés:
best_path : Meilleur décodeur de chemin (ou gourmand), le plus rapide de tous les algorithmes, cependant, d'autres décodeurs fonctionnent souvent mieuxbeam_search : le décodeur de recherche de faisceau, intègre éventuellement un modèle de langue au niveau des caractères, peut être réglé via le paramètre de largeur de faisceaulexicon_search : Lexicon Search Decoder, renvoie le meilleur mot d'un dictionnaire d'un dictionnaireD'autres décodeurs, de mon expérience, pas vraiment adaptés à des fins pratiques, mais peuvent être utilisés pour des expériences ou des recherches:
prefix_search : décodeur de recherche de préfixetoken_passing : algorithme de passage à tokenextras/ dossier)Cet article donne des suggestions pour utiliser le meilleur décodage de chemin, le décodage de recherche de faisceau et le passage des jetons.