中华字经里的重复字

按:本文可以供 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 字重复。百里挑一找重复字,这毫无疑问属于吹毛求疵,但既然官网称“《中华字经》是中国教育部、国家教育部语言文字应用研究所承接的教育科学”十五”规化课程的重点研究成果”,那就拿出科研的精神来,避免掺假。人家《千字文》可是实打实的无重字。字经是拿来作为语文和德育教材来教育小孩子的,如果有一天孩子拿着重复的字来问:爸爸,爸爸,这个字经是不是在撒谎?

我只能说:孩儿啊,语文里有一种修辞手法,叫做夸张。

中华字经里的重复字》上有10条评论

  1. acheng99

    在坛子的博客里,有人感叹世界无法阻止英语了

    在你这,我想感叹,世界无法阻止理科生折腾了

    作为益辉的另一个粉丝,他折腾这个的博客我也读过,读完就拉倒了

    另外,我坚定的使用等号,这也是长期以来的习惯,不知道为什么还是有很多人喜欢使用箭头,输入的时候多麻烦啊?有快捷键吗?

    回复
    1. dapeng 文章作者

      我是箭头党,哈哈。原因有三:首先我从刚接触R就用,先入为主,习惯了。然后,我是google的粉丝,google建议用箭头(参见我博客里 r代码风格 一文)。最后,德语键盘输入等号需要按shift+0键,而在Rstudio里输入箭头要按alt+_键,同样麻烦,但后者附送两个空格,而且箭头更酷!

      回复
  2. 马光

    这种字经,估计也没人去用啊。
    反正我没听过说是通过这种字经来认字的。
    字只有放在语境中才是活的。

    回复
    1. dapeng 文章作者

      看他们的官网,好像做得挺大,有各种配套产品。

      回复
    1. dapeng 文章作者

      作为营销手段,哗众取宠是很常见的,只要符合事实就行。

      回复
  3. zngsai

    既然是为了认字,字同音不同,肯定算两个字,要不那不是经常闹笑话吗?

    看了你筛选,觉得没错,剩下三个字 “享“、”腋“、”漫”,小弟给你纠正。

    鉴于录入错误趋势很明显,我严重怀疑是录入错误。

    第一个字“享”,看了原文,瞬间就想到该不会是大亨的亨字吧,直接Ctrl+F,发现文中并没有“亨”字,故应为“亨”!

    第二个字“腋”,原文是“瘁疟腋胺”、“胳膊腋弛”两句话紧挨着,我想人家大师肯定不会犯这个低级错误吧,就凭你理科生就敢教人家大师小学一年级的数学?省省吧,我打开输入法,选用了其中的手写输入,经过字形对比试验了几个字并查重,发现第二个“腋”应该为臃肿的”臃”字,与松弛的“弛”字正好连接,让人不禁想到人到中年,身体发福的景象,挺好!

    第三个字“漫”,用第二种方法,此处疑为“濞”字。有人说是生僻字,非也,我就很熟识此字,但只记得有《吴王濞列传》。经查,发现古赋常用此字,中学时候自学了不少古文,大概由此认得。

    此书很早就有了,估计差不多20年了吧,我上小学时候就见过,父亲是老师,家里有一本。掐指一算,小学毕业整20年了。

    写这些,我作为一个理科生,作为一个程序员,只是想告诉作者这个理科生,千万不要小瞧文科生,数学考零分的他们,治学的严谨性,远超你通过迭代计算出黎曼猜想的有限非平凡零点位于1/2轴线上的工作。

    回复
    1. 大鹏 文章作者

      非常感谢!有了你的补充,这篇帖子从内容上就完整了。需要澄清的是,本帖文风上虽多有调侃,但并没有小瞧文科生、冒犯大师的意思。其实原帖里写得清楚,找这些重复字一是为了纠正网上的盗版之误,二是对夸大的广告宣传表示无法苟同,三是展示一个用R简单处理文本的例子。要说文理科谁更严谨,就像关公战秦琼,没有意义。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax