Golang 中文转拼音

简介: 翻遍整个 GitHub , Golang 中文转拼音类库, 怎么就这么难找呢? 于是我造了一个轮子: 中文转拼音类库. 目前来说应该是最好用的了.

翻遍整个 GitHub , Golang 中文转拼音类库, 怎么就这么难找呢? 于是我造了一个轮子: 中文转拼音类库. 目前来说应该是最好用的了.

GitHub 传送门: https://github.com/Lofanmi/pinyin-golang

如果说基于汉字拼音字典, 逐个汉字替换, 也是可以转换的, 但是碰到多音字就很麻烦了. 而基于词库, 最起码可以解决大多数的多音字的转换, 人名姓氏的转换.

最开始我用了 CC-CEDICT 词典, 基于词组的长度, 以及英文释义的丰富程度, 来决定替换的优先级, 词组越长优先替换, 英文解释越丰富, 说明它越常用, 拥有更高的优先级, 后来发现它很多汉字都没有收录, 更别说生僻字了.

现在我把 安正超 的 PHP 开源项目 overtrue/pinyin 中的词库搬过来, 整理成一个 []string 放在 go 文件里面, 978K , 编译完也不需要依赖词库了, 非常符合 Go 的气质.

当然也不能说它可以解决 100% 的转换, 多多少少肯定会有瑕疵, 但是问题不大, 完善好词库, 对付一般的转换是绝对没问题的. 如果想完全解决, 词库定会无比庞大...

用法很简单, 接口都很清晰, 不再赘述.

INSTALL

go get -u -v github.com/Lofanmi/pinyin-golang/pinyin

DEMO

package main

import (
    "fmt"

    "github.com/Lofanmi/pinyin-golang/pinyin"
)

func main() {
    dict := pinyin.NewDict()

    // ----
    // 简单用法
    // ----

    // Redis shì yí gè Key-Value cún chǔ xì tǒng.
    str := `Redis 是一个 Key-Value 存储系统。`
    fmt.Println(dict.Sentence(str).Unicode())

    s := ""

    // wǒ hé shí néng bào fù
    s = dict.Convert(`我,何時能暴富?`, " ").Unicode()
    fmt.Println(s)
    // wǒ, hé shí néng bào fù?
    s = dict.Sentence(`我,何時能暴富?`).Unicode()
    fmt.Println(s)

    // ----
    // 转换接口: Dict.Convert
    // ----

    // 输入繁体中文, 输出为带 空格 分隔的拼音字符串
    // ASCII 格式显示
    // wo3 he2 shi2 neng2 bao4 fu4
    s = dict.Convert(`我,何時能暴富?`, " ").ASCII()
    fmt.Println(s)

    // 输入简体中文, 输出为带 连字符- 分隔的拼音字符串
    // Unicode 格式显示
    // wǒ-hé-shí-néng-bào-fù
    s = dict.Convert(`我,何时能暴富?`, "-").Unicode()
    fmt.Println(s)

    // 转换简体中文和繁体中文, 转换为带 斜杆/ 分隔的拼音字符串
    // 不显示声调
    // wo/he/shi/neng/bao/fu
    s = dict.Convert(`我,何时能暴富?`, "/").None()
    fmt.Println(s)

    // ----
    // 句子接口: Dict.Sentence
    // ----

    // 输入繁体中文, 输出为带 空格 分隔的拼音字符串
    // ASCII 格式显示
    // wo3, he2 shi2 neng2 bao4 fu4?
    s = dict.Sentence(`我,何時能暴富?`).ASCII()
    fmt.Println(s)

    // 输入简体中文, 输出为带 空格 分隔的拼音字符串
    // Unicode 格式显示
    // wǒ, hé shí néng bào fù?
    s = dict.Sentence(`我,何时能暴富?`).Unicode()
    fmt.Println(s)

    // 转换简体中文和繁体中文, 转换为带 空格 分隔的拼音字符串
    // 不显示声调
    // wo, he shi neng bao fu?
    s = dict.Sentence(`我,何时能暴富?`).None()
    fmt.Println(s)

    // ----
    // 转换人名: Dict.Name
    // ----

    // 输入繁体中文, 输出为带 空格 分隔的人名拼音字符串
    // ASCII 格式显示
    // mo4 qi2 wo4 xi3 huan1 chi1 suan1 nai3
    s = dict.Name(`万俟沃喜欢吃酸奶`, " ").ASCII()
    fmt.Println(s)

    // 输入简体中文, 输出为带 连字符- 分隔的人名拼音字符串
    // Unicode 格式显示
    // mò-qí-wò-xǐ-huan-chī-suān-nǎi
    s = dict.Name(`万俟沃喜欢吃酸奶`, "-").Unicode()
    fmt.Println(s)

    // 转换简体中文和繁体中文, 转换为带 斜杆/ 分隔的人名拼音字符串
    // 不显示声调
    // mo/qi/wo/xi/huan/chi/suan/nai
    s = dict.Name(`万俟沃喜欢吃酸奶`, "/").None()
    fmt.Println(s)

    // ----
    // 转换拼音简写: Dict.Abbr
    // ----

    // 转换简体中文和繁体中文, 输出为带 连字符- 分隔的拼音字符串首字符
    // m-q-w-x-h-c-s-n
    s = dict.Abbr(`万俟沃喜欢吃酸奶`, "-")
    fmt.Println(s)

    // ----
    // 转换为字符串 slice: ToSlice
    // ----
    // wo3 he2 shi2 neng2 bao4 fu4
    s = dict.Convert(`我,何時能暴富?`, " ").ASCII()
    fmt.Println(s)

    // [wo3 he2 shi2 neng2 bao4 fu4]
    fmt.Printf("%v", pinyin.ToSlice(s))

    // $ go run main.go
    // Redis shì yí gè Key-Value cún chǔ xì tǒng.
    // wǒ hé shí néng bào fù
    // wǒ, hé shí néng bào fù?
    // wo3 he2 shi2 neng2 bao4 fu4
    // wǒ-hé-shí-néng-bào-fù
    // wo/he/shi/neng/bao/fu
    // wo3, he2 shi2 neng2 bao4 fu4?
    // wǒ, hé shí néng bào fù?
    // wo, he shi neng bao fu?
    // mo4 qi2 wo4 xi3 huan1 chi1 suan1 nai3
    // mò-qí-wò-xǐ-huān-chī-suān-nǎi
    // mo/qi/wo/xi/huan/chi/suan/nai
    // m-q-w-x-h-c-s-n
    // wo3 he2 shi2 neng2 bao4 fu4
    // [wo3 he2 shi2 neng2 bao4 fu4]
}

Contribution

欢迎提意见及完善词库

License

MIT


文章来源于本人博客,发布于 2018-06-02,原文链接:https://imlht.com/archives/159/

目录
相关文章
|
Go
Golang 基础案例集合:中文拼音转换、解析二维码、压缩 zip、执行定时任务
曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得,可
244 0
|
8天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
36 4
Golang语言之管道channel快速入门篇
|
8天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
28 4
Golang语言文件操作快速入门篇
|
7天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
36 3
Golang语言之gRPC程序设计示例
|
8天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
28 4
|
8天前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
29 3
|
8天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
18 4
Golang语言goroutine协程篇
|
7天前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
17 3
Golang语言之Prometheus的日志模块使用案例
|
8天前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
14 3
Golang语言之函数(func)进阶篇
|
8天前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
15 2
Golang语言之函数(func)基础篇