沒有具體代碼展示铁坎,只做思路分享,有更好的思路犁苏,歡迎交流硬萍。查看原文
背景介紹
字符串的相似度算法在許多領(lǐng)域都能經(jīng)常用到,在數(shù)據(jù)清理傀顾、語音識(shí)別襟铭、語音糾錯(cuò)、搜索等領(lǐng)域有重要的用處。本文主要介紹基于模糊音的方式匹配中文字符串寒砖,文末還會(huì)有作者對(duì)中文相似度匹配算法的其它想法赐劣。
問題描述
在語音識(shí)別領(lǐng)域,由于我國方言眾多哩都,所以需要精準(zhǔn)地匹配每個(gè)地方的方言目前還不太現(xiàn)實(shí)魁兼。市面上的語音識(shí)別服務(wù)基本上對(duì)普通話的識(shí)別率是最高的,但是也需要用戶用很標(biāo)準(zhǔn)的普通話來講漠嵌。這就涉及到模糊音匹配的問題了咐汞。
提出問題
用戶說:“大娘水餃好吃嗎”,被語音識(shí)別成了“大亮睡覺好吃嘛”(舉個(gè)栗子而已)儒鹿,這個(gè)時(shí)候怎么將語音識(shí)別后的結(jié)果轉(zhuǎn)換成我想要的結(jié)果化撕。
解決思路
中文漢字大致有幾個(gè)特征:1)聲母约炎;2)韻母植阴;3)聲調(diào);4)偏旁圾浅;5)結(jié)構(gòu)掠手;6)筆畫
這幾個(gè)特征中,在語音識(shí)別后的處理過程中狸捕,1喷鸽、2、3的權(quán)重要高一些灸拍,其中做祝,1、2最為重要株搔,也就是語音識(shí)別為什么出錯(cuò)的原因剖淀,要做的事情就是通過模糊音將聲母、韻母來進(jìn)行匹配纤房。
先將23個(gè)聲母編號(hào):
聲母 | 編號(hào) | 聲母 | 編號(hào) | 聲母 | 編號(hào) | 聲母 | 編號(hào) |
---|---|---|---|---|---|---|---|
b | 1 | p | 2 | m | 3 | f | 4 |
d | 5 | t | 6 | n | 7 | l | 7 |
g | 8 | k | 9 | h | 4 | j | B |
q | C | x | D | zh | E | ch | F |
sh | G | r | H | z | E | c | F |
s | G | y | I | w | J |
韻母編號(hào):
韻母 | 編號(hào) | 韻母 | 編號(hào) | 韻母 | 編號(hào) | 韻母 | 編號(hào) |
---|---|---|---|---|---|---|---|
a | 1 | o | 2 | e | 3 | i | 4 |
u | 5 | v | 6 | ai | 7 | ei | 7 |
ui | 8 | ao | 9 | ou | A | iu | B |
ie | C | ue | D | er | E | an | F |
en | G | in | H | un | I | ven | J |
ang | F | eng | G | ing | H | ong | K |
ian | L | uan | M | iang | N | uang | O |
iong | P | iao | Q |
我把常用模糊音的聲母和韻母各自都標(biāo)成相同的纵隔,比如n、l都是7炮姨,這樣便于后面處理捌刮。
將語音識(shí)別結(jié)果按照 “聲母-韻母-聲母-韻母” 這樣的格式轉(zhuǎn)換成編號(hào)就變成了“517NG8BQA9F431”,關(guān)鍵字中“大娘水餃”拼音編碼后是“517NG8BQ”舒岸,這個(gè)時(shí)候可以看出有兩個(gè)字符串已經(jīng)相同了绅作。
所以目前可以想到的基于模糊音的中文匹配算法大概就是:先將原語句通過聲母表和韻母表編碼,再將自建的關(guān)鍵詞庫(事先也通過這種方法編碼)與其對(duì)比蛾派,如果有相同的字符串俄认,則很大概率可以直接替換掉原文个少,當(dāng)然也有少數(shù)情況兩個(gè)關(guān)鍵詞拼音都一樣。
思維發(fā)散
目前這種方式是基于絕對(duì)匹配來做的眯杏,也就是關(guān)鍵詞庫和原語句必須完全相同才能相互替換夜焦,但是需要用到模糊匹配上面似乎這種方式已經(jīng)不行了。
不過岂贩,在這種方式的基礎(chǔ)上茫经,再利用到Edit Distance的算法似乎也可以實(shí)現(xiàn)模糊匹配,找出距離最相近的關(guān)鍵詞萎津,這種方式我沒有試過卸伞,算法可參見Edit Distance。
我真正想說的是下面的東西锉屈。
在輸入法上面會(huì)有簡拼的用法荤傲,相信大家很習(xí)慣了‘wzry’就會(huì)匹配到‘王者榮耀’這樣的輸入方式。這個(gè)用法會(huì)給我一個(gè)啟發(fā)部念,在模糊匹配的時(shí)候弃酌,有時(shí)候不需要用到韻母,有時(shí)候也不需要用到聲母儡炼,特別是在長語句當(dāng)中,簡拼這種方式尤其受人喜歡查蓉。我們可以將上面例子中的原語句只將聲母編碼出來“57GBAF3”乌询,“大娘水餃”關(guān)鍵詞的聲母是“57GB”,這個(gè)時(shí)候如果嫌精度不夠高的話豌研,可以把韻母加在后面妹田,原語句為“57GBAF31N8Q941”,關(guān)鍵詞為“57GB1N8Q”鹃共,這樣精度就高了點(diǎn)鬼佣,而且可以當(dāng)作hash來使用,查找的時(shí)候復(fù)雜度為O(1)霜浴,這個(gè)時(shí)候再用上前面的Edit Distance的算法的話晶衷,基本上基于模糊音的中文匹配精度就很高了。
如果不只是對(duì)語音識(shí)別后的語句做調(diào)整的話阴孟,還可以在前面編碼的過程中加入字形的特征晌纫,偏旁結(jié)構(gòu)筆畫等做到根據(jù)字形也能智能糾錯(cuò)。
甚至如果在有大量統(tǒng)計(jì)數(shù)據(jù)的情況下永丝,將每個(gè)聲母或者韻母的編號(hào)用出現(xiàn)的概率來表示的話锹漱,還可以定量地計(jì)算出兩個(gè)字符串之間的相似度,但是遺憾沒有這么大量的數(shù)據(jù)慕嚷。
中文字符串相似度算法還有很多可以拓展的哥牍,還需讀者自行探索下去毕泌。