ОБНОВЛЕНИЕ 2021: Установочный пакет Python
Реализация Python некоторых общих алгоритмов декодирования височной классификации (CTC) . Минималистичная языковая модель предоставлена.
pip install .tests/ и выполните pytest , чтобы проверить, работает ли установка Вот минималистичный исполняемый пример:
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 ) } "' ) Ожидается, что выходной mat (массив Numpy, Softmax уже применяется), обученной CTC, будет иметь форму TXC и передается в качестве первого аргумента декодерам. T-это количество временных шагов, а C количество символов (CTC-Blank-последний элемент). Персонажи, которые могут быть предсказаны нейронной сетью, передаются в качестве строки chars для декодера. Декодеры возвращают декодированную строку.
Запуск выходов кода:
Best path: ""
Beam search: "a"
Чтобы увидеть больше примеров того, как использовать декодеры, посмотрите на сценарии в tests/ папке.
Поиск луча может опционально интегрировать языковую модель уровня символа. Статистика текста (Bigrams) используется в результате поиска луча для повышения точности чтения.
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 )Декодер поиска лексиконов вычисляет первое приближение с лучшим декодированием пути. Затем он использует BK-дерево для получения похожих слов, забивает их и, наконец, возвращает лучшее слово. BK-дерево создается путем предоставления списка словарных слов. Параметр толерантности определяет максимальное расстояние редактирования от слова запроса до возвращаемых словарных слов.
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 )Некоторые примечания:
rnn_output имеет форму txbxc, с b пакетный размерmat = rnn_output[:, 0, :]Рекомендуемые декодеры:
best_path : лучший путь (или жадный) декодер, самый быстрый из всех алгоритмов, однако другие декодеры часто работают лучшеbeam_search : декодер поиска луча, необязательно интегрирует языковую модель на уровне символов, можно настроить через параметр ширины лучаlexicon_search : декодер Lexicon Search, возвращает лучшее слово из словаряДругие декодеры, по моему опыту, не подходят для практических целей, но могут использоваться для экспериментов или исследований:
prefix_search : декодер поиска префиксаtoken_passing : алгоритм передачи токенаextras/ Polder)Эта статья дает предложения, когда использовать лучшую декодирование пути, декодирование поиска луча и передача токена.