golang汉字转拼音

cao-guang · · 8093 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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("姓名"|"你/知道/单漂亮/单单/非常/漂亮")

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

参考:

基于贝叶斯算法的中国人名识别

golang实现中文汉字转拼音

 

 

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8093 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传