基于模糊音的中文匹配Dimsim
dimsim介绍
中文的语音相似性Phonetic similarity算法,可以用于语音纠错spelling correction,比如将稀饭修改为喜欢。
dimsim三方库介绍:给定两个相同长度的中文单词,模型确定两个单词之间的距离,并返回几个与给定单词接近的候选单词。它包括 2 个API接口:
- get_distance:接收两个短语字符串,返回两个词语的发音相似度数值,数值越小表示越相似
- get_candidates:接收一个短语字符串,返回相似短语
代码示例如下:1
2
3
4import dimsim
# 计算词语间的发音相似度
score_py = dimsim.get_distance("星辰", "姓陈")
问题描述
在语音识别领域,由于我国方言众多,所以需要精准地匹配每个地方的方言目前还不太现实。市面上的语音识别服务基本上对普通话的识别率是最高的,但是也需要用户用很标准的普通话来讲。这就涉及到模糊音匹配的问题了。
提出问题
用户说:“大娘水饺好吃吗”,被语音识别成了“大亮睡觉好吃嘛”(举个栗子而已),这个时候怎么将语音识别后的结果转换成我想要的结果。
单词纠错
一般来说中文单词的拼写错误大致有这么几种类型:
- 字形相似
这种在手写字时特别容易出现,比如 “彬彬有礼“ 写成 ”杉杉有礼”。 - 读音相似
手写字或者拼音输入法时容易出现,比如 “南通市” 写成 “难通市”,前后的读音都是 “nan tong shi”。
因为汉语表达比较精炼,使用编辑距离去做纠错,效果就很不好,比如 “南通市 – 难通市 – 北通市”,这三者的编辑距离都是 1,就不好判断了。但这时结合拼音去判断,就会发现 “南通市” 与 “难通市” 的相似度高于 “南通市” 与 “北通市” 了。
所以对于汉字的纠错,我们需要同时结合拼音和字形上的特点:
- 读音相似度。示例:
胡
->hú
,福
->fú
读音上相对来说好处理一点,我们可以将汉字转成对于的拼音,比如说 “南” 字转成 “nan2”,其中 2 为声调部分,然后对拼音构成的字符串再用传统的相似度匹配算法,比如编辑距离,就可以达到很好的效果。
也可以使用 Soundex 语音算法,在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。不同这里有一点需要注意,由于不同地区有着各自截然不同的方言,所以在计算相似度时需要适当调整。
比如许多南方人很难分辨 “L” 和 “N’,他们常常会将这两个音弄混,将“篮球”读作“南球”,而“刘德华”就变成了“牛德华”。
另外有汉字是多音字,在汉字转拼音时不好处理,因为要考虑所有可能的拼音组合,在极端情况下会导致指数爆炸!例如美团的实现(枚举多音字全排列)。所以我们一般就取该汉字拼音出现次数较多的那个读音
- 字形相似度。示例:
门
->37001
,闩
->37101
字形相似读计算是个特别难的问题,一种朴素的思想,便是首先将汉字转化成一组的字母数字的序列,而这个转化所用到的hash算法必须能够将该汉字的字形特征保留下来。利用这样的转化,我们便将汉字字形的相似度问题,变成了两组字母数字序列的相似度问题。而这正是传统相似度匹配算法的强项。
这种解决方案的核心,就在于找到一个恰当的hash算法,能够将汉字进行适当的转化,并在转化结果中,保留住汉字的字形特征。
曾经有人发明了一种名为 四角编码 的汉字检字法来实现这样的算法。四角算法是由王云五于1925年发明,这种编码方式根据汉字所含的单笔或复笔对汉字进行编号,取汉字的左上角,右上角,左下角以及右下角四个角的笔形,将汉字转化成最多五位的阿拉伯数字。 通过将汉字转化成四角编码,再对四角编码的相似度进行计算,便可以得出两个汉字在字形上的相似程度。
这种编码可以在一定程度上解决形近词的问题,但也有其自身的问题,由于只取汉字的四角笔形,有些外形截然不同的汉字,因为四角结构相同,也拥有同样的四角编码。
比如:量 - 6010 ,日 - 6010 ,但它们是不一样的。
所以为了解决汉字相似度计算问题,我们可以结合汉字的拼音、声调、四角编码、笔画数、字形结构等来考虑。
解决思路
我们的做法:将ASR的2元结果跟姓氏库进行一一模糊匹配,检查用户的拼写是否有错误,如果有的话,给出正确的姓氏,完成姓氏读音纠错。
- 中文汉字大致有几个特征:
1)声母;2)韵母;3)声调;4)偏旁;5)结构;6)笔画
这几个特征中,在语音识别后的处理过程中,1、2、3的权重要高一些,其中,1、2最为重要,也就是语音识别为什么出错的原因,要做的事情就是通过模糊音将声母、韵母来进行匹配。 - 基于语言模型做文本自动纠错
- 查词典
词典
检查一个单词是否拼写错误,我们可以通过查词典找同音词,在词典中查找相似度阈值大于某个特定值的关键词即为候选正确词。
排序
如果得到多个正确词,但是通常显示给用户只有一个,按照下面规则对它们进行排序,越前面的规则权重越高。
- 同音词优先,同音词之间的顺序由同音词的搜索建议权重决定。搜索建议权重由搜索词的商品数目、搜索次数、添加方式决定。
- 拼写相近词的顺序由相似度决定,越相似的词排在越前面。
参考
PYTHON模糊匹配指南
浅谈基于模糊音的中文匹配算法
搜索关键词纠错算法
ALi, Min and Danilevsky, Marina and Noeman, Sara and Li, Yunyao_, “DIMSIM: An Accurate Chinese Phonetic Similarity Algorithm Based on Learned High Dimensional Encoding”, Proceedings of the 22nd Conference on Computational Natural Language Learning, 2018.