如何实现拼音与汉字的互相转换
2016-04-25 09:12
357 查看
如何实现拼音与汉字的互相转换
发表于2个月前(2016-02-16 15:01) 阅读(58) | 评论(0) 6人收藏此文章, 我要收藏赞0
4月23日,武汉源创会火热报名中,期待您的参与>>>>>
目录[-]
基于词库的汉字转拼音
基于词库和分词工具的汉字转拼音
基于HMM的拼音转汉字
基于词库的拼音转汉字
代码实现
基于词库的汉字转拼音
词库中既要包含每个字的拼音,也要包含常用单词/短语的读音。有些字是多音字,所以至少要保存其最常用的读音,不常用的读音多出现在单词/短语里。好了,词库准备好了,现在手头有一句话要转换要转换为拼音,这句话是:
你好世界杯
我们的词库是这样子的:
你: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ēi。
基于词库和分词工具的汉字转拼音
纯粹的基于词库的方法在实际的使用中会遇到问题,例如提出了解决方案这句话中
了解会被当作一个单词,所以会得到错误的结果:
tí,chū,liǎo,jiě,jué,fāng,àn
更好的方法是先进行分词得到:
提出 了 解决 方案
然后基于词库对每个结果分别处理。
基于HMM的拼音转汉字
这里的拼音一般不带声调。将汉字作为隐藏状态,拼音作为观测值,使用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 |
你好,啊是最好的结果。
实际实现中需要用到动态规划, 和求有向无环图中两点之间最短距离类似。
代码实现
拼音转汉字(拼音输入法引擎):https://github.com/someus/Pinyin2Hanzi汉字转拼音:https://github.com/someus/ChineseTone
相关文章推荐
- 当PHP随机数遇到最小值是58以后
- 机房水题欢乐赛 2016-04-26 上午
- QVariant
- Bootstrap每天必学之响应式导航、轮播图
- redis的基本类型及操作命令
- 服务器上传,时间超时 Apache 如何设置保持连接
- 设计模式读书笔记之组合模式(Composite)
- 《巴黎圣母院》读后感
- 2Gb_DDR3_SDRAM——16 Meg x 16 x 8 Banks
- 服务器中文件夹权限
- Android多媒体分析(二)MediaStore
- React学习笔记---Props&State
- HTML5的progress元素
- 设计模式读书笔记之桥接模式(bridge pattern)
- 053(四十八)
- Java遍历集合方法分析(实现原理、算法性能、适用场合)
- iOS开发~CocoaPods使用详细说明
- 155. Min Stack
- 设计模式读书笔记之命令模式(Command Pattern)
- 新名词,要了解的