汉字转拼音技术方案讨论
将汉字转化成拼音的应用需求有很多,例如:1、在搜索引擎输入框的智能纠错上,将“刘德花”自动纠正成“刘德华”;2、按照拼音检索电话本。3、浏览器的输入框输入“搜狗”,能够自动识别到“http://www.sogou.com”。
正好我在最近在项目中有类似的需求,虽然之前对此有一些初步的了解,但还是不够系统,细节的地方考虑的不是很全面。所以又专门花时间对此进行了研究和梳理。再本文中总结了三种不同的方案,并分析了各种方案的优缺点。
方案一、汉字编码对应表
这个方案其实是利用了汉字GBK编码的规律。汉字GBK编码并不是乱无顺序的,是按照汉字的拼音的顺序来排列的。根据这个规律,就可以根据汉字的GBK码表来整理出拼音与汉字编码的对应关系。如下:
$_value= "-20319|-20317|-20304|-20295|-20292|……”
$_pinyin = "a|ai|an|ang|ao|ba|bai|ban……”
这个两个数组是这样解释的,拼音“a“对应的汉字编码是[20319,-20317),ai对应的汉字编码是[20317,-20304),以此类推。
例如,对于汉字“啊”的GBK编码是B0A1,其整数值为-20319。因此,我们得出”啊”的拼音为”a”。汉字“阿”的GBK编码是B0A2,其整数值为-20318,仍然是落在啊”a”这个拼音对应的区间内,所以其读音仍然是“a“。
但是这个方案有一个缺点,就是不能支持多音字。例如,对于汉字“重”的GBK编码是D6D8,其整数值为55000。根据上面的码表得出该字的读音是“zhong“,无法得到其另外一个读音“chong”。
注意:Unicode码表中编码并没有这个规律的,因此如果输入是unicodex系列(比如utf8)的汉字的话,需要首先转换编码到GBK,然后再采用本方案。
方案二、字库拼音对照表
为了支持多音字的拼音识别,这种方法需要将每一个汉字对应的拼音都标记下来,对于多音字就标多个拼音。因此该方法的算法空间复杂度要高不少,需要支持多少个汉字,就需要整理多少个汉字与拼音的对应关系。实际转换时,需要将待转换的汉字一个一个到表中来查。
例如:对于“长重”的转换结果有四种:Changchong、Zhang chong、Chang zhong、Zhang zhong。
该方法的缺点也很明显,虽然解决了多音字的问题。但是转换的结果却可能不是唯一的。在实际应用中,不唯一的转化结果基本上没有什么实际意义的。
方案三、词语拼音对照
方案三案解决了以上两种办法的缺陷,但同时技术成本也是最高的。其思想是,字虽然是多音字,但是在具体的环境中读音就能唯一确定下来。这个具体的环境中可以简化为一个词语,例如对于“重庆”中的重肯定是读“chong”的。
其实现过程如下:
1、首先将待转换的汉字序列进行分词,这个在网上有很多的源代码和算法。
2、实现一个词语拼音的对照库,
例如“重庆”->“chong qing”,“长白山”->“chang bai shan”。
3、先将分词后得到的结果在词语拼音表中进行查找
4、词语拼音表中不存在的汉字,采用方案一或者方案二的方法进行翻译。
这种方法的关键步骤在分词和分词后的词语拼音对照表。
以上三种方案,可以根据自己项目的实际需求来选择。如果能容忍多音字在少数情况下造成的badcase的话,方案一绝对是最佳选择。否则的话,那就可能需要考虑最为复杂的方案三了。