yihui 我的老天,这黑科技太牛了,然而藏得也太深了,搜啊搜只在 blogdown 的 NEWS 里搜到一条:
pinyin 包跑起来略慢,原因可能是因为下面这一句,把 py()
和 pydic()
两个函数合成一句的缘故:
pinyin::py(x, sep = '-', dic = pinyin::pydic('toneless'))
慢在 pydic()
,它用来载入字典,然而一劳永逸,载入之后,每次转换时只需执行 py()
函数就快了。例如:
require(pinyin)
mydic <- pydic("toneless")
py("我喜欢旅游", dic= mydic)
py("我受不了了", dic= mydic)
肯定比
pinyin::py("我喜欢旅游", dic= pinyin::pydic("toneless"))
pinyin::py("我受不了了", dic= pinyin::pydic("toneless"))
快很多。
历史上,pinyin 经过了一次提速。提速前,用的方法是简单粗暴的文本查找替换。有一天,有个用户要转换大量的汉字,发现这样太慢,就给我提出了两个改进方案:一个是把拼音库转成 environment,另一个是并行计算。我采纳了第一个,所以才有了 pydic()
函数,目的就是把原来的文本拼音库转成 environment。
tctcab 准确率堪忧的原因是没有解决多音字的问题。因为现在是逐字在拼音库里找一个字的拼音,它没法根据上下文(字)判断受不了了
里的两个了
的读音区别,所以默认从库里选择第一个。也可以把所有读音都在结果里列出来,但是就是不会智能选择正确的那个。默认拼音库里的多音字很多,有些音从来没见过。可以换个拼音库 (dic = 'pinyin2'
),内含常用读音:
mydic <- pydic(method = 'toneless', dic = 'pinyin2')
py("我喜欢旅游", dic= mydic)
我喜欢旅游
"wo_xi_huan_lv_you"
然而这仍然没解决 我受不了了
的问题。目前只能凑合用了。
我看了一下别的软件,好像也没能解决这个问题。例如<http://xh.5156edu.com/conversion.html> 和 <https://zhongwenzhuanpinyin.51240.com/>。
Cloud2016
a-b-c
这个问题当时我考虑过,一度想挽起袖子给解决了,后来懒兵一犯,得过且过了。
pinyin 包是刚学会写包时写的,生涩得很,目的是够用,在不得已的一些场合(例如 bookdown 的中文章节 ID,例如操作系统不支持中文文件名等)里把汉字替换成字母而已。现在回头去看,要改的地方很多,连文档都没好好写,无奈没有那个精力了,可预见的未来也没有时间去改进。哪位好汉有时间的话就接过去吧。
对了,它还可以把汉字转换成五笔码和四角号码,例如:
dic_wb98 <- 'https://github.com/pzhaonet/pinyin/raw/master/inst2/wubi98.txt'
mywb98 <- load_dic(dic_file = dic_wb98)
py("春眠不觉晓,处处闻啼鸟", sep = '_', dic = mywb98)
也支持用户自定义字典。反正本质就是个批量查找替换。可以开开脑洞,看看它还能做什么。