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')