Оптимизация кода WER (Word Error Rate)? - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь вычислить WER для оценки системы ASR, но вычисление оценки занимает много времени (так как я хочу выполнить на ней несколько загрузок, чтобы получить доверительные интервалы для более надежной оценки системы ).

Вот код, который я придумал до сих пор, кто-нибудь видит более эффективный способ сделать это (быстрее, и если у вас есть идеи сделать его более эффективным с точки зрения памяти, это также приветствуется).

def modify_text(text):
    """
    Function to modify a clean text to add some errors in it.
    """
    modified_text = []
    for word in true_text:
        action = np.random.choice(['deletion','addition','subsitution','nothing'],
                                   p = [0.1,0.1,0.1,0.7])
        if action in ['addition','substitution']:
            modified_text.append(random.choice(voca))
        if action in ['addition','nothing']:
            modified_text.append(word)
    return modified_text

def wer(s1,s2):

    d = np.zeros([len(s1)+1,len(s2)+1])
    d[:,0] = np.arange(len(s1)+1)
    d[0,:] = np.arange(len(s2)+1)

    for j in range(1,len(s2)+1):
        for i in range(1,len(s1)+1):
            if s1[i-1] == s2[j-1]:
                d[i,j] = d[i-1,j-1]
            else:
                d[i,j] = min(d[i-1,j]+1, d[i,j-1]+1, d[i-1,j-1]+1)

    return d[-1,-1]/len(s1)

text = """I am happy to join with you today in what will go down in history as
the greatest demonstration for freedom in the history of our nation.
Five score years ago, a great American, in whose symbolic shadow
we stand today, signed the Emancipation Proclamation. This momentous
decree came as a great beacon light of hope to millions of Negro slaves
who had been seared in the flames of withering injustice. It came as a
joyous daybreak to end the long night of their captivity. """

true_text = list(tokenize(text))
modified_text = modify_text(true_text)
%timeit wer(true_text,modified_text)

Выход:

7.04 ms ± 49.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Ладно, это не так уж и плохо, но у меня есть десятки тысяч текстов для оценки, с начальной загрузкой, и тексты намного длиннее. Поэтому я хотел бы найти более быстрый способ выполнения функции wer. Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2018

Большинство оценок распознавания речи сначала разбивают речь на предложения или высказывания. Затем вы вычисляете WER, выравнивая каждое высказывание. Это может дать вам большое ускорение, потому что WER вычисляет O (n ^ 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...