按:本文可以供 R 初学者用来练习字符串的合并、分割、查找、替换……
前不久写了一篇闲谈《千字文》里重复用字的帖子。碧云飘鹤的博主马光留言说,还有一部类似的《中华字经》,并提供了一个转载的链接。这部字经初读来真是膜拜万分,想不到二十一世纪的中国还有这样的神作。后来,无聊的我点到了《中华字经》的官方网站,发现上面是这么介绍的:
《中华字经》是世界上最奇妙的汉字学习课本。……全文4000汉字没有一个字是重复使用的。
这个是国际网站,有繁体字版,还有英文介绍:
The book does not repeat any characters…… “Chinese Character Canon” is a poem composed of 4,000 characters…..
听听,用了 any 这个词,读起来多痛快。在网上一搜,“无一字重复”这几个字铺天盖地。比如有一篇说:“谁能相信!谁能做到!写篇4000字的文章,竟无一字重复,简直不可思议!”人民日报也说:中华字经共收录无重复汉字4000个。其他网站多是人云亦云的转载和添油加醋的吹捧。
我顿时感觉不妙。字经既然涵盖了天文地理历史文化等知识,那么想必作者和推广者深谙国学,应该懂得物极必反、过犹不及的道理吧?干嘛把话说那么死呢?在“世界上最奇妙的汉字学习课本”后面加上个“之一”不算过谦吧?为啥不用汉字“四千”或者科学记数法“4.00 x 10 ^ 3”,而非要用“4000”这种精确到个位的表达呢?难道你们不知道世界上有一种东西,唤作“理科生”吗?
果然,有理科生看不下去了。益辉同学挺身而出,写了一篇有趣的文章,用寥寥几行 R 代码对字经进行了分析,并且严肃指出,字经里其实有 44 个字是重复出现的。他还指出:字经有句意不通、文字拼凑之嫌,并且对这种识字方法持怀疑态度。
作为益辉的铁杆粉丝,我完全赞同他的观点。但是我想说一句:
益辉啊,你分析的那个中华字经,好像是盗版的,因为里边有错别字耶。
不过,论点的光辉不会被论据材料的错误所掩盖。下面我对益辉的观点作些补充和延伸,来说说这重复的 44 个字是怎么回事。
先纠正 5 个字
我用的 R 代码,凡是用等号“=”来赋值的,都是从益辉那里抄来的;用箭头“<-”赋值的,是我新添的。
con = url("http://pastebin.com/raw.php?i=ZaQiHU1m", encoding = "UTF-8")
x = readLines(con, warn = FALSE)
close(con)
# 去掉奇数行的注音,去掉空格,去掉标点,合并。
x = x[seq(2, length(x), 2)]
x = gsub("\\s+", "", x)
x = gsub(",|。", "", x)
x <- paste(x, collapse = "")
# 拆成单字x1,数数一共多少字
x1 <- unlist(strsplit(x, ""))
length(x1)
## [1] 3984
果然少了 16 个字!益辉说了,因为作者调皮地把四个小标题“第一部分”“第二部分”“第三部分”“第四部分”也算进去了。那么,小标题里这些字有没有包含在正文里呢?
# 拆成四字一组x4
x4 <- substring(x, seq(1, nchar(x), by = 4), seq(4, nchar(x), by = 4))
for (i in c("一", "二", "三", "四", "第", "部", "分")) print(paste(i, grep(i,
x4, value = TRUE), sep = ":"))
## [1] "一:一理万方"
## [1] "二:炎黄二帝"
## [1] "三:西三红水"
## [1] "四:四季芬芳"
## [1] "第:"
## [1] "部:部属僚员"
## [1] "分:形分上下"
可见,除了“第”字外(为啥?别急,见下文),他们还出现在了正文里,所以小标题不算在内。这样,实际字数是 3984 个字。这 3984 个字有没有重复呢?
# 作频数表,看哪些字的频数大于1。
x.tab = table(x1)
(x.dup <- names(x.tab[x.tab > 1]))
## [1] "阿" "膀" "藏" "长" "朝" "传" "弹" "弟" "调" "哥" "核" "解" "灸" "乐"
## [15] "陆" "率" "漫" "糜" "朴" "圈" "日" "塞" "享" "行" "畜" "腋" "已" "勇"
length(x.dup)
## [1] 28
的确有 28 个重复字!算上小标题那 16 个字,总共 44 个字重复!
益辉的分析到此为止,他没有指出重复字出现在哪里。我接过接力棒继续做下去。
for (i in x.dup) print(paste(i, grep(i, x4, value = TRUE)))
## [1] "阿 阿弥陀佛" "阿 好娃阿丹"
## [1] "膀 鸠鹏张膀" "膀 膀胱菌沾"
## [1] "藏 秋收冬藏" "藏 大臣驻藏"
## [1] "长 春生夏长" "长 长城伟墙"
## [1] "朝 朝觐跪拜" "朝 谆诲朝夕"
## [1] "传 先知注传" "传 克隆遗传"
## [1] "弹 舒额弹腮" "弹 洲际导弹"
## [1] "弟 兄弟姐妹" "弟 府弟别墅"
## [1] "调 调息止纷" "调 调派遣返"
## [1] "哥 但丁哥德" "哥 哥嫂咨询"
## [1] "核 脱氧核酸" "核 颗粒籽核"
## [1] "解 人民解放" "解 翟解丞冉"
## [1] "灸 针灸疗伤" "灸 糜费羹灸"
## [1] "乐 苦乐恼烦" "乐 乐吹轿娶"
## [1] "陆 陆地漂移" "陆 伍陆描绘"
## [1] "率 税率加乘" "率 率晤睦歧"
## [1] "漫 油浸漫馒" "漫 毗澈沮漫"
## [1] "糜 糜黍荸荠" "糜 糜费羹灸"
## [1] "朴 纯朴宽厚" "朴 邹朴俞雒"
## [1] "圈 陡拱椭圈" "圈 猪仔满圈"
## [1] "日 日明月亮" "日 矗日耸屹"
## [1] "塞 塞涓救荧" "塞 塞竺郜冼"
## [1] "享 享爵彬斌" "享 永享勋誉"
## [1] "行 践约宜行" "行 银行贷款"
## [1] "畜 牧畜粪烟" "畜 衙巷畜豢"
## [1] "腋 瘁疟腋胺" "腋 胳膊腋弛"
## [1] "已 忏悔已憾" "已 函恋私已"
## [1] "勇 威严毅勇" "勇 唆使怂勇"
仔细读来会发现,这 28 个重复字中,其实包括了 18 个多音字:”阿” “膀” “藏” “长” “朝” “传” “弹” “调” “核” “解” “乐” “陆” “率” “朴” “圈” “塞” “行” “畜” 。一个字如果有两个读音,那是算一个字还是算两个字?我认为是算一个字。
这里提醒一下:当爹妈的小心了!华版虽然有注音,但这些多音字有注错的,比如“邹朴俞雒”的“朴”是姓,发音同“瓢”(别提朴树,虽然朴树原名姓濮,但“朴树”却是艺名,没说姓朴),但注音注成了“普”。其他的这里不列举了,请爹妈自己查字典。
另外,我发现了 5 个错别字:府弟(应为“府第”)别墅,但丁哥德(应为“歌德”),矗日(应为“曰”,发音“约”)耸屹,函恋私已(应为“私己”),唆使怂勇(应为“怂恿”)。其中“矗日耸屹”隐藏很深,需要看上一句是“泵谓唧筒”,才知道“曰”是跟“谓”对仗的。
那么,纠正之后的这 5 个字是不是跟别的地方有重复呢?
x1[x1 %in% c("第", "恿", "歌", "曰", "己")]
## character(0)
看来,这 5 个字没有出现过。可见,这几个错别字应该属于录入错误。 最后,还剩下 5 个字我不确定是错别字还是作者的疏漏:”灸” “糜” “享” “腋” “漫” 。 到此可以小结一下:华版《中华字经》有 5 个错别字,18 个是多音字,16 个是出现在了小标题里,剩下的 5 个字”灸糜享腋漫”有待考证。订正后的重复字有 39 个。
纠正“灸”字
剩下的”灸糜享腋漫” 5 个字里,我考证出了 2 个,先说第 1 个。既然华版有录入错误,那么换用其它的版本。先用马光提供的版本,来自新浪博客,简称浪版。代码跟上文类似。
y = readLines("http://pastebin.com/raw.php?i=R5pc3XBJ", encoding = "UTF-8",
warn = FALSE)
y <- y[c(2, 4, 6, 8)]
y = gsub(",|。", "", y)
y <- paste(y, collapse = "")
y1 <- unlist(strsplit(y, ""))
length(y1)
## [1] 3984
y.tab = table(y1)
y.dup <- names(y.tab[y.tab > 1])
length(y.dup)
## [1] 25
不算小标题,浪版有 25 个字重复。有哪些跟华版不同呢?
y4 <- substring(y, seq(1, nchar(y), by = 4), seq(4, nchar(y), by = 4))
(xy.dif <- setdiff(x.dup, y.dup))
## [1] "灸" "日" "勇"
for (i in xy.dif) print(paste(i, "华版", grep(i, x4, value = TRUE), "浪版",
y4[grep(i, x4)]))
## [1] "灸 华版 针灸疗伤 浪版 针灸疗伤" "灸 华版 糜费羹灸 浪版 糜费羹炙"
## [1] "日 华版 日明月亮 浪版 日明月亮" "日 华版 矗日耸屹 浪版 矗曰耸屹"
## [1] "勇 华版 威严毅勇 浪版 威严毅勇" "勇 华版 唆使怂勇 浪版 唆使怂恿"
浪版纠正了前文我发现的华版”曰”“恿” 2 字的错误。此外,又发现了一个新错误:”糜费羹炙(不是灸)”。“炙”音“制”,“灸”音“九”,华版此处注音也错注成了”九”。这样,又少了 3 个重复字。但仍然有“府弟别墅”“但丁哥德”“函恋私已”里的 3 个错别字没有纠正。
y1[y1 %in% c("第", "歌", "己")] 这三个字没有出现过。
## character(0)
到此再小结一下:浪版《中华字经》有 3 个错别字,依然有 18 个多音字,16 个是出现在了小标题里,剩下的 4 个字“糜享腋漫”有待考证。订正后的重复字有 38 个。
纠正“糜”字
事情钻到这里就有些无趣了:网上这些都是什么烂版本嘛,盗版盗得不专业,还疯传。我强压住不耐烦,再纠正一个“糜”字,剩下的不管了。这次的版本是新浪爱问的注释版。R 代码跟上文类似,就不贴出来了,直接说结论:这个版本里,用“蓖麸荸荠”代替了前两个版本里的“糜黍荸荠”。这样,“糜”字就不重复出现了。看来,网上的字经除了错别字问题,还有版本的差异。正版里什么样我不知道,也许那 18 个重复的多音字也被不重复的字替代了?
总之,4000 字的《中华字经》号称无一字重复,但根据网上流传的版本看,很有可能属于夸大其辞。本文出现的版本经我订正后,仍然有 37 字重复。百里挑一找重复字,这毫无疑问属于吹毛求疵,但既然官网称“《中华字经》是中国教育部、国家教育部语言文字应用研究所承接的教育科学”十五”规化课程的重点研究成果”,那就拿出科研的精神来,避免掺假。人家《千字文》可是实打实的无重字。字经是拿来作为语文和德育教材来教育小孩子的,如果有一天孩子拿着重复的字来问:爸爸,爸爸,这个字经是不是在撒谎?
我只能说:孩儿啊,语文里有一种修辞手法,叫做夸张。