基于Levenshtein计算asr准确率

ASR常用测试指标

字正确率、字准确率、字错率、句错率等

  • 方法一:基于Levenshtein原理统计
  • 方法二:基于“最小代价匹配”原则运用动态规划算法

设正确文本字数为 N,识别结果文本字数为 M,按照识别结果文本与正确文本根据“最小代价匹配(Levenshtein)”原则运用动态规划算法,得到正确识别字数 Mc、删除错误字数 D、插入错误字数 I, 和替换错误字数 S,则有:

N=Mc+S+D
M=Mc+S+I
定义以下性能指标:

1.句错率(SER)

句错误率:Sentence Error Rate
解释:句子识别错误的的个数,除以总的句子个即为SER

SER = 错误句数 / 总句数

2.句正确率(S.Corr)

句正确率:Sentence Correct
S.Corr = 1 - SER = 正确句数 / 总句数

3.字错率(WER/CER)

WER,Word error rate,词错率,但一般称为字错率,是语音识别领域的关键性评估指标,WER越低表示效果越好!
CER,Character Error Rate,字符错误率,中文一般用CER来表示字错率

WER = (S + D + I ) / N = (S + D + I ) / (S + D + Mc)

5.字正确率(W.Corr)

字正确率,Word Correct,一般国内宣传用的多,识别率(识别正确率)达到多少多少(请见1.7)。

W.Corr = ( N - D - S ) / N = Mc / N

问题:只计算了识别正确的字,没有管多出来的字(I插入),当然一般情况下不会有什么问题

6.字准确率(W.Acc)

字准确率,Word Accuracy

W.Acc = 1 - WER = ( N - D - S - I ) / N = (Mc - I) / N
特殊情况:当 I=0 时, W.Acc = W.Corr

import pandas as pd
import Levenshtein 
import re
data=pd.read_excel(r'/Users/atsushi/Desktop/nlp/data.xlsx')
data.head()
filename label_txt zy_txt
0 br1 我什么意思 我就是这个意思
1 br2 你跳高哟 你好高呀呀
2 br2 你得到的 你的
data.fillna('NAN',inplace=True)
pattern=re.compile('[,;\.\?:!!?,。;:“”/s+\n]')
data['label_txt']=data.apply(lambda x:re.sub(pattern,'',x['label_txt']),axis=1)
data['zy_txt']=data.apply(lambda x:re.sub(pattern,'',x['zy_txt']),axis=1)
data.head()
filename label_txt zy_txt
0 br1 我什么意思 我就是这个意思
1 br2 你跳高哟 你好高呀呀
2 br2 你得到的 你的
def get_edit(label_txt,asr_txt):
    result_dict={'S':0,'D':0,'I':0,'N':0,'ser':0}
    label_txt=label_txt.replace('NAN','')
    asr_txt=asr_txt.replace('NAN','')
    result=Levenshtein.editops(label_txt,asr_txt)
    for row in result:
        if 'replace' in row:
            result_dict['S']+=1
        if 'delete' in row:
            result_dict['D']+=1
        if 'insert' in row:
            result_dict['I']+=1
    result_dict['N']=len(label_txt)
    return result_dict
data['zy_I']=data.apply(lambda x:get_edit(x['zy_txt'],x['label_txt'])['I'],axis=1)
data['zy_D']=data.apply(lambda x:get_edit(x['zy_txt'],x['label_txt'])['D'],axis=1)
data['zy_S']=data.apply(lambda x:get_edit(x['zy_txt'],x['label_txt'])['S'],axis=1)
data['N']=data.apply(lambda x:get_edit(x['zy_txt'],x['label_txt'])['N'],axis=1)
data['zy字准率']=data.apply(lambda x:(x['N']-x['zy_I']-x['zy_D']-x['zy_S'])/x['N'],axis=1)
data['zy字正率']=data.apply(lambda x:(x['N']-x['zy_D']-x['zy_S'])/x['N'],axis=1)
data.head()
filename label_txt zy_txt zy_I zy_D zy_S N zy字准率 zy字正率
0 br1 我什么意思 我就是这个意思 0 2 2 7 0.428571 0.428571
1 br2 你跳高哟 你好高呀呀 0 1 2 5 0.400000 0.400000
2 br2 你得到的 你的 2 0 0 2 0.000000 1.000000
data.to_excel('/Users/atsushi/Desktop/nlp/data.xlsx',encoding='gbk')

你可能感兴趣的:(自然语言学习)