轻量级 Node.js 拼音库 pinyinlite
发布于 8 年前 作者 breeswish 9410 次浏览 来自 分享

以前一直使用 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。

回到顶部