红楼梦的作者是谁?
开谈不说《红楼梦》,读尽诗书也枉然。一曲红楼多少梦,情天情海幻情深。
春梦随云散,飞花逐水流
寄言众儿女,何必觅闲愁
我们国内的红学研究界一直以来也在为谁是红楼梦的作者争论不已。每个人的论点不一,各有各个的论点与论据。其中比较靠谱的有两种说法,一种是红楼梦全书为曹雪芹所著,另一种说法是红楼梦前八十回为曹雪芹著,后四十回为程伟元与高鹗著。
但追究根源,目前没有一种说法是十全十美、毫无瑕疵的,仅目前,红学界公认的普遍观点是《红楼梦》的原作者是曹雪芹,高鄂只是续写者。
《红楼梦》第一回正文中提到,此书经“曹雪芹于悼红轩中披阅十载,增删五次,纂成目录,分出章回”。
然由于早期抄本中脂批透露作批者与曹雪芹及其家族关系紧密,也熟知甚至部分地参与了《红楼梦》的创作,因此脂批可以说是曹雪芹作为《红楼梦》作者的最直接证据,但有些派别认为脂批纯属后来者杜撰,不能作为研究证据。
而在这些证明《红楼梦》作者的方法中,有一种是比较新颖的,就是统计小说的用词频率,即一般人写作总有自己的风格、习惯用语。所以有人通过对比《红楼梦》前八十回与后四十回的用词频率,看是否相同,词频类似于文章的指纹。
无独有偶,1983年到1987年,贝尔实验室的Jon Bentley发表了写有趣的系列专栏《Programming Pearls》,Jon在专栏中提出了一个问题:
(写一个程序,找出n个出现最频繁的单词,并在输出结果中显示这些单词出现的次数,最后按次数排序)。
很多人花费了大量的时间解决该问题,但花费的时间与程序效率尚需考虑,同时贝尔实验室的Doug McIlroy提供了一个6步解决方案,
几分钟就可完成编写,效率相当之高,该程序使用Shell脚本编写,以下为脚本全文。
- #! /bin/sh
- # Read a text stream on standard input, and output a list of
- # the n (default: 25) most frequently occurring words and
- # their frequency counts, in order of descending counts, on
- # standard output.
- #
- # Usage:
- # wf [n]
- tr -cs A-Za-z\' '\n' | Replace nonletters with newlines
- tr A-Z a-z | Map uppercase to lowercase
- sort | Sort the words in ascending order
- uniq -c | Eliminate duplicates, showing their counts
- sort -k1,1nr -k2 | Sort by descending count, and then by ascending word
- sed ${1:-25}q Print only the first n (default: 25) lines
脚本说明:
第一步tr -cs A-Za-z\' '\n' 的作用将文档中的非字母转换为换行符,这里'被认为是字符,因为英文中有I'm这样的单词。这步完成后原文将变以一行一个单词的形式显示出来;
第二步tr A-Z a-z 的作用将文档的大写字符全部转换为小写字符;
第三步sort 对处理后的文档排序;
第四步uniq -c 去除重复的单词且显示单词出现的个数;
第五步sort -k1,1nr -k2 按第一列排序(按词频排序),n表示以数字格式排序,r表示求倒序,如果第一列的词频相同则按后面的单词继续排序;
第六步sed ${1:-25}q 显示前25行,q表示看完25后退出sed程序。
但以上脚本并不适合于中文文档的处理,因为英文单词与单词之间总是存在空格,这样脚本第一步才可以将整篇文档处理为一行一个单词继而通过排序
求词频,这是前提。但中文我们知道汉字与汉字之间是不存在空格的,所以我将以上脚本改写了一下,用以处理中文:
- #!/bin/bash
- for i in {1..80}
- do
- cut -c$i $1 >>one.txt
- cut -c$i $2 >>two.txt
- done
- grep "[[:alnum:]]" one.txt > onebak.txt
- grep "[[:alnum:]]" two.txt > twobak.txt
- sort onebak.txt |uniq -c |sort -k1,1n -k2,2n |tail -30 > oneresult
- sort twobak.txt |uniq -c |sort -k1,1n -k2,2n |tail -30 > tworesult
- rm -rf one.txt two.txt onebak.txt twobak.txt
- vimdiff oneresult tworesult
脚本说明:
第一步通过循环分别取出两个文件的80列(一般屏幕显示字符为80个字符)字符,将文档变为一行一个汉字输出至one.txt与two.txt;
第二步由于有些行可能不会80个汉字,则通过grep去除空白行,并导出文档;
第三步通过sort对汉字排序、取出重复行,显示词频,在通过sort按词频排序,这样通篇文档所有汉字的词频都将显示,tail的目的为显示词频最高的30个汉字;
第四步通过diff对比两个文档的词频文件。
运行结果如下:
注意事项:
由于是处理中文文档,所以需要将文档编码保存为UTF-8编码,以上脚本在CentOS5.5中运行正常。 |
结论:
通过以上运行结果的统计信息可以看出,《红楼梦》前八十回使用最多的30个汉字与后四十回使用最多的30个汉字有很大的重叠性与类似性。足可以从一个侧面证明《红楼梦》全书确是出自同一人之手。
程伟元在120回本《红楼梦序》中说,后40回中有20余回是他自“藏书家甚至故纸堆”中找到,剩余10数回则得之于“鼓担”,他和高鹗只是“细加厘剔,截长补短”。
从这一记录层面上也可说明,就算后四十回不是作者亲自编排,那么也应该是高鹗等人根据原稿编录而成后四十回,
所以红楼梦前八十回与后四十回语言用词的词频未改,而风格有所变化。
满纸荒唐言,一把辛酸泪!
都云作者痴,谁解其中味?
假作真时真亦假,无为有处有还无。
本文转自丁丁历险51CTO博客,原文链接:http://blog.51cto.com/manual/939415 ,如需转载请自行联系原作者