含多音字的句子:这两批货物都打折出售,严重折本,再也经不起这样的折腾了!
1.python 导入pypinyin库
https://pypi.org/project/pypinyin/
python安装pypinyin库(该库集成了对中文转拼音的方法,可以直接调用)。
实例:
from pypinyin import pinyin
pinyinlist = pinyin("这两批货物都打折出售,严重折本,再也经不起这样的折腾了!")
print(pinyinlist)
[['zhè'], ['liǎng'], ['pī'], ['huò'], ['wù'], ['dōu'], ['dǎ'], ['zhé'], ['chū'], ['shòu'], [','], ['yán'], ['zhòng'], ['shé'], ['běn'], [','], ['zài'], ['yě'], ['jīng'], ['bù'], ['qǐ'], ['zhè'], ['yàng'], ['de'], ['zhē'], ['téng'], ['le'], ['!']]
2.字典法
把多音字组成的常用词组整理出来,弄成个库,取拼音时先判断当前词是否在词库里面,是的话就取词库的拼音。该方法暂时pass,已经实施效果不是很好。
3.C++调用python(可以实施,但是实施过程较麻烦)
尝试了几次,但是一直存在报错,目前没有把环境配置好。
找到的C++方法基本都是采用将20902个汉字的拼音按照unicode编码的大小排序写到文件中,然后对应汉字读取文件查询拼音。针对多音字问题建立一个多音字文件。
4.C++中文的拼音的开源代码
这里找到几篇C++博客。
- C++实现中文转换成拼音(有些字识别不出来)
- 汉字转拼音c/c++源码,支持gb2312和utf8(识别效果不好)
- C++汉字转拼音(不精确)
- Java中文转拼音的代码(不支持多音字)测试效果不是很好。:
- GitHub代码,将中文转换成首字母
- C++代码
一个适用于C#的汉字转拼音的库:
2009年3月31日,微软发布了 Microsoft Visual Studio International Pack 1.0 SR1。Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。下载地址是:http://www.microsoft.com/downloads/details.aspx?FamilyID=44cac7f0-633b-477d-aed2-99aee642fc10&DisplayLang=zh-cn 该软件包1.0版提供下面七个组件以增强.NET Framework对全球化软件应用开发的支持。
zhe liang pi huo wu dou da zhe chu shou , yan zhong zhe ben , zai ye jing bu qi zhe yang de zhe teng le !
5.C语言中文拼音开源代码
- 中文转拼音,不包含多音字C语言代码(不支持多音字)
- 中文转拼音,C语言代码(不确定支不支持多音字)
6.Java中文转拼音解决多音字
Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换。介绍了Java 中利用Pinyin4j 实现汉字转拼音,但是对于多音字问题采取的是组合拼音方式,例如长沙 取拼音结果就是 changsha zhangsha。某些情况下我们希望能得到多音字的唯一拼音,此时就需要借助多音字字典了,原理很简单:给多音字一个默认的拼音并告诉计算机碰到哪些词的时候使用其它的拼音,例如 长 字,我们可以给它指定默认拼音为 zhang,并标识 长沙 拼音为 chang。
总结:
网上比较流行的有三种方式:
第一种:基于词库的汉字转拼音
词库中既要包含每个字的拼音,也要包含常用单词/短语的读音。有些字是多音字,所以至少要保存其最常用的读音,不常用的读音多出现在单词/短语里。
好了,词库准备好了,现在手头有一句话要转换要转换为拼音,这句话是:
你好世界杯
我们的词库是这样子的:
你: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
更好的方法是先进行分词得到:
提出
了
解决
方案
然后基于词库对每个结果分别处理。
第三种:然后基于词库对每个结果分别处理。
这里的拼音一般不带声调。
将汉字作为隐藏状态,拼音作为观测值,使用viterbi算法可以将多个拼音转换成合理的汉字。例如给出ti,chu,le,jie,jue,fang,an
,viterbi算法会认为提出了解决方案
是最合理的状态序列。
HMM需要三个分布,分别是:
- 初始时各个状态的概率分布
- 各个状态互相转换的概率分布
- 状态到观测值的概率分布
这个3个分布就是三个矩阵,根据一些文本库统计出来即可。
viterbi算法基于动态规划,维基百科 - Viterbi algorithm给出了很好的解释和示例。
关于基于词库Mapping的思路,又有两种常见形式。
1. 代码里面硬编码所有的汉字拼音和编码,在程序里面使用对照,找到拼音——这个和Mapping的思路一样,这样不好。硬编码对于本身的代码来说,是种负担,而且,这个方法没有很好的解决多音字的问题,一个『了』可以发音:le,也可以发音liao,此时系统瘫了。
第二种方法更加干净简洁,可扩展性能比较好的东西。
2. Mapping,写文件,这里有两个思路:
第一个思路,就是直接做个(汉字,拼音)的Key&Value的Mapping,这个方法缺点是——笨拙,每个字都要映射上,多音字还要多次(格式调整下也可以,比如:汉字 拼音1 拼音2),而且,系统快速查找会是个瓶颈,怎么看也看不起眼啊,不过有个好处是,可控性强,而且扩展也比较好。
第二个思路,用汉字编码来Mapping,这样Mapping出来有个好处,编码有序,可以在文件中,用偏移量快速定位,假设每个汉字分配一个固定大小的编码块,在文件中,用编码得出偏移量,可以快速的找到汉字编码块进行解析。
准确识别各种复杂语句中混杂的多音字其实并没有那么容易,有两个关键的地方,一个是多音字词库的丰富程度,一个是能否正确的给语句进行分词。而词库和分词的实现都需要一个非常丰富的词典
文件。所以想要提高汉字2拼音性能,要增加词库的丰富程度,还有分词的能力。