因最近在做语音问答系统,语音识别系统暂时调用大佬公司的API接口,试着针对我们垂直领域的问题测试了一批语音识别的效果,正确错误的各一半一半,错误有三种情况:1)只识别到小部分录入内容;2)识别内容完整,但是包含错词;3)识别的文字跟录入的内容毫无关系。第三种情况占比较少,前两种情况大概各一半一半。
不是大佬公司的语音识别模块做得不好,可能是因为我们专业领域中有些词不是常用词吧。针对前两种情况,我们只能采用一些策略进行补救,针对第一种情况,还未仔细考虑,有一个比较笨但可能有效的方法,现在主要针对第二种错误进行展开。
pycorrector
首先,特别感谢shibing624大佬开源项目pycorrector,是一个很好的中文文本纠错工具。能对音似、形似错字(或变体字)纠正,可用于中文拼音、笔画输入法的错误纠正,采用python3开发,感兴趣的童鞋可以将代码下载下来进行学习,代码还是很nice的。
pycorrector依据语言模型检测错别字位置,通过拼音音似特征、笔画五笔编辑距离特征及语言模型困惑度特征纠正错别字。
其主模块主要是基于规则,纠错主要分为两大步:1)检错;2)纠错。
先来说说检错,先对句子进行jieba切词,认为是错词的情况有两种:一种是该词在用户定义的混淆集中;另一种是该词不是常用词。以上是在词粒度进行检错,在字粒度进行检错是通过n-gram模型,因为打开字粒度检错,误检率太高,所以我没采用此模块。
检错后就该进行纠错了,如果错词是通过混淆集检出来的,则直接根据混淆词典改正;如果是另一种情况,则找出其音相近的词(我将原代码改了,对错词中的每个字都找其音相近的,再组合到一起;并且把字形相似的也关闭了,以适用于语音识别的结果)作为候选集,将候选词带入到原句中,句子混淆度最低的词则作为正确词。
语音识别的大多情况是:这个颈膜很好啊(原句)->这个警模很好啊(识别结果),即错词也是有意义的、常用的词,利用pycorrector很难检测出错误。这种情况下怎么办呢?
解决方案
下边的解决方案,目前也只是我的idea,还未进行实验,实验过后再进行补充。
- 比较笨的方法,依然基于上述主模块规则,大批量统计混淆词,语音识别结果中出现混淆词则认为是错词,将其混淆集作为候选集,利用上述句子混淆度选出正确词。缺点是:傻(原句是正确的也义无反顾的要把混淆集测一遍,可能还会换成错误的)。
- 利用rnn_crf进行检错,检出可能错误的词,再利用pycorrector的方法进行纠错,需要大量人力做训练集,定位错词位置。rnn_crf的检错能力至关重要。
- 现在有人采用seq2seq进行纠错,这个模型的缺点是对没见过的正确语句,也极大可能给改错,即误纠率很高。但是该模型纠错不需要进行错词的定位,所以训练一个句子混淆度模型,用该模型判断输入句子有无错误,如果有错,再送进seq2seq进行纠错。
测试结果
1.利用rnn_crf进行检错,误判率和正确检出率都很差,我实验的具体做法是,先用jieba分词对每句话进行切词,然后对词进行属性标记,将错词的属性记为R,然后进行训练,检错时,就是利用R定位错词位置。如果具体方法有误,望大神告知。因为测试效果很差,所以没采用此方法。
2.利用seq2seq进行纠错的方法,因为我们的适用场景对答案的准确度要求比较高,加之,通过pycorrector中示例,发现此种方法效果并不好,因此,没有采用这种方法。
3.最后就是采用傻傻的方法,录制一批数据,定制自己的混淆集,一句话中但凡出现混淆集中的词,则将该词和其候选集带入原句,通过kenlm对原数据集进行训练,对句子进行混淆度计算,选出混淆度最低的词。经过测试,这种算法的纠错率很高,而且误判率很低,虽然是很笨的方法,但是效果还是很好滴。