如何实现拼音与汉字的互相转换

基于词库的汉字转拼音

词库中既要包含每一个字的拼音,也要包含经常使用单词/短语的读音。有些字是多音字,因此至少要保存其最经常使用的读音,不经常使用的读音多出如今单词/短语里。git

好了,词库准备好了,如今手头有一句话要转换要转换为拼音,这句话是:github

你好世界杯

咱们的词库是这样子的:算法

你:nǐ
好:hǎo,hào
世:shì
界:jiè
杯:bēi
世界:shì,jiè
你好:nǐ,hǎo
苦尽甘来:kǔ,jìn,gān,lái

词库中最长的词苦尽甘来包含4个字。因此你好世界杯从4个字开始匹配:工具

  • 判断你好世界是否在词库中,不在;
  • 判断你好世是否在词库中,不在;
  • 判断你好是否在词库中,在,获得nǐ,hǎo
  • 判断世界杯是否在词库中,不在;
  • 判断世界是否在词库中,在,获得shì,jiè
  • 判断是否在词库中,在,获得bēi

因而你好世界杯被转换为nǐ,hǎo,shì,jiè,bēicode

基于词库和分词工具的汉字转拼音

纯粹的基于词库的方法在实际的使用中会遇到问题,例如提出了解决方案这句话中了解会被看成一个单词,因此会获得错误的结果:ip

tí,chū,liǎo,jiě,jué,fāng,àn

更好的方法是先进行分词获得:get

提出
了
解决
方案

而后基于词库对每一个结果分别处理。it

基于HMM的拼音转汉字

这里的拼音通常不带声调。table

将汉字做为隐藏状态,拼音做为观测值,使用viterbi算法能够将多个拼音转换成合理的汉字。例如给出ti,chu,le,jie,jue,fang,an,viterbi算法会认为提出了解决方案是最合理的状态序列。方法

HMM须要三个分布,分别是:

  • 初始时各个状态的几率分布
  • 各个状态互相转换的几率分布
  • 状态到观测值的几率分布

这个3个分布就是三个矩阵,根据一些文本库统计出来便可。

viterbi算法基于动态规划,维基百科 - Viterbi algorithm给出了很好的解释和示例。

基于词库的拼音转汉字

原则:

  • 词的权重大于字的权重;
  • 转换中匹配的词越多,权重越小。

词库的格式是:

拼音:单词:权重

例如:

ni:你:0.15
ni:泥:0.12
a:啊:0.18
hao:好:0.14
nihao:你好:0.6

假如输入是ni,hao,a,咱们计算一下各类组合的权重:

组合 权重
你,好,啊 0.15*0.14*0.18 = 0.00378
泥,好,啊 0.12*0.14*0.18 = 0.003024
你好,啊 0.6*0.18 = 0.108

能够看出,你好,啊是最好的结果。

实际实现中须要用到动态规划, 和求有向无环图中两点之间最短距离相似。

代码实现

相关文章
相关标签/搜索