1、为什么造轮子?

同事在开发过程中需要用到敏感词过滤检查,其中一个功能就是拼音搜索,需要用到汉字转拼音,然后网上找了这么一个库,首先感谢他对汉字转拼音的贡献,对golang源码的贡献。然后我们的golang执行文件编译后启动速度慢了100倍,经过逐一排查后发现原来是这个库导致的,于是便有了这么一个造轮子的过程。

2、源码

3、使用demo

添加引用

import(
"github.com/cao-guang/pinyin"
)

初始化调用

func main()  {
    pinyin.LoadingPYFileName("./data/pinyin.txt") //这里是字典文件路径程序启动调用一次,载入缓存
    //demo
       str1, err := pinyin.To_Py("汉字拼音", "", "") //默认造型: hanzipinyin
       if err != nil {
          fmt.Println(err)
       }
       fmt.Println(str1)
       str2, err := pinyin.To_Py("汉字拼音", "", pinyin.Tone) //带声调:hànzìpīnyīn
       if err != nil {
          fmt.Println(err)
       }
       fmt.Println(str2)
       str3, err := pinyin.To_Py("汉字拼音", "", pinyin.InitialsInCapitals) //首字母大写无声调:HanZiPinYin
       if err != nil {
          fmt.Println(err)
       }
       fmt.Println(str3)
       str4, err := pinyin.To_Py("汉字拼音", "-", pinyin.InitialsInCapitals) //首字母大写无声调加-分割:Han-Zi-Pin-Yin
       if err != nil {
          fmt.Println(err)
       }
       fmt.Println(str4)
}

4、多音字探讨

目前版本没有实现多音字,多音字有姓名多音字和普通词组中应用的多音字,我发现所有开源的汉字转拼音的多音字都有一个前提,就是在已知是多音字的情况,或者已知是姓名多音字的情况下进行转换。

假设有这么一段话: 你知道吗?单漂亮不单单是很漂亮而是非常漂亮。

这句话如何转换成多音字?首先你根本就不知道单这个汉字是作为姓氏还是作为普通词,也就是你需要通过算法确定中国人的姓名然后根据姓名取出他的姓氏,然后在判断该姓氏是否为多音字,另外在整个句子中是不是多音字的应用。

目前我能想到的解决方案

4.1、通过介词过滤,先过滤掉无意义的介词。得到:你知道单漂亮单单非常漂亮

4.2、再通过分词过滤得到:你/知道/单漂亮/单单/非常/漂亮

4.3、然后通过贝叶斯算法,公式如下:

p("姓名"|"你/知道/单漂亮/单单/非常/漂亮") = p("姓名"|"你/知道/单漂亮/单单/非常/漂亮")*p("姓名")/p("姓名"|"你/知道/单漂亮/单单/非常/漂亮")

得到单漂亮为姓名,然后到姓氏字典取出单的多音字发音。

参考: