以前一直使用 hotoo/pinyin,不过最近在一个前端项目中需要做基于拼音的列表匹配,这个库就显得比较笨重了,并且发现 web 版词库太小不够用,nodejs 版又体积太大不能用,因此自己写了一个 pinyinlite。欢迎大家拍砖、完善代码和字典。
GitHub: https://github.com/SummerWish/pinyinlite
pinyinlite 用于那些不需要显示拼音的场合,例如在一个列表中基于拼音进行匹配。所以它不会(以后也不会)自作主张地去尝试“智能地”选择一个正确的拼音,而是会把所有可能的拼音都给你。
特点
-
Zero dependency!
-
字典包含 2.4 万多个简体繁体字,覆盖 Unicode BMP 常见汉字。
-
体积小巧(minified ~ 80KB, gzip ~ 55 KB),适合前端使用。
-
内存占用低(~ 1 MB),效率高(~ 10,000,000 字/s),适合后端使用。
-
支持多音字。
-
不支持且不计划支持智能选择多音字拼音。
-
不支持且不计划支持音调。
体积小巧,字典够用
pinyinlite 在源代码中内置一个紧凑的字典,体积很小,非常适合在前端使用。pinyinlite 目前字典大小 24000 字左右,覆盖了大多数常见简体和繁体字,不会有 hotoo web 版拼音那样一些常见姓氏都会没有拼音的问题。
pinyinlite 整个库在没有 gzip 情况下也只有 80KB(24000 字)。相比之下,hotoo 拼音库 web 版约 3500 字,字典大小 30KB,没有压缩字典的 Node.js 版约 41000 字,仅字典大小就超过 1MB。
内存占用低,效率高
造这个轮子另一个直接原因是看到 hotoo/pinyin issue 里有一些很好的优化想法一直没有付诸实现。pinyinlite 设计之初就向着减少内存占用和尽量保持较高性能而去,代码中处处都有优化 :-) pinyinlite没有简单地像 hotoo/pinyin 那样使用 Object 做中文与拼音的映射和查询,而是使用了几个非常紧凑的整数数组查询。这不仅大大节约了内存,而且还意外地发现不论是初始化还是查询效率都更高 :-)
话不多说,上性能测试结果:
测试项 | 字典大小 | require() 内存和耗时 | 长句耗时 | 速度 |
---|---|---|---|---|
pinyinlite | ~24000 字 | +1.2 MB, 9.1 ms | ~2.2 ms | ~10^7 字/s |
hotoo/pinyin (web) | ~3500 字 | +2.1 MB, 10.0 ms | ~17.1 ms | ~10^6 字/s |
hotoo/pinyin (node) | ~41000 字 | +32.3 MB, 123.5 ms | ~184.8 ms | ~10^5 字/s |
测试基于 Node.js 5.4.1,hotoo/pinyin 关闭了智能选择多音字。hotoo/pinyin 由于使用的是对象映射,因此内存占用特别大;而又由于需要映射很多内容,所以效率反而没有纯数组高。
使用方法
见 GitHub: https://github.com/SummerWish/pinyinlite/blob/master/README.md
example 中附带一个效果很好的基于拼音的列表匹配的样例
还有什么不足呢
出于浏览器兼容性考虑,现在的代码只支持 Unicode BMP(即 codePoint < 0xFFFF)。不过我看了一眼其他平面里的中文字符,在我的 OS X 上基本都显示不出来,想必应该用得比较少 :-) 但是如果有很多人反馈不够用的话,可以再扩充。
我随手找了些简体的、繁体的文章和百家姓用作测试样例,发现词库都涵盖了,所以就没有继续找其他词库或者完善当前词库。如果大家在使用时发现有常见字不在这个词库里的话,欢迎发 issue/PR。