《水浒传》一百零八将名字在原著中的出现频率
这两天偶然发现斗鱼的电视剧频道在放 2011 版的《水浒传》电视剧,刚好是三打祝家庄的那几集,拼命三郎石秀和锦豹子杨林在祝家庄做细作探路。我很早就知道拼命三郎石秀是作者施耐庵的亲儿子之一,突然萌生了统计一百零八将的名字在《水浒传》书里的具体出现次数的想法。这个可以反映出一百零八将中哪些角色是作者施耐庵着重用笔墨描写的,哪些角色是可有可无的。
我在 Gutenberg 上找到了《水浒传》繁体版的电子书,然后写了一个简单的 Python 脚本进行统计,以下是统计结果。
1 | 001 天魁星 呼保義 宋江 : 1868 |
这个统计结果有令我感到意外的地方,但是绝大多数将领的统计及排名是符合我的预期的。
在高顺位里,梁山泊大哥呼保义宋江肯定是名字出现次数最多,笔墨用的最多的人物。豹子头林冲名字出现次数居然不是第二,我是比较惊讶的。但是看到第二是行者武松,我觉得又很合理。宋江的铁跟班黑旋风李逵名字出现次数第三没啥争议,毕竟宋江在哪他就在哪。神行太保戴宗的名字出现次数居然高居第五,这个也是没想到的。座次第三十三名的施耐庵亲儿子拼命三郎石秀,因为做事是真的拼命,深得作者和大家喜欢,在名字出现次数的排名高居第八位。甚至天天跟石秀混在一起的病关索杨雄的名字出现次数排名也高居第十一位。大家比较熟知和喜欢的花和尚鲁智深,即便在原著中出场很早,他的名字出现次数也只有在第十七位,其可能原因在后面会提到。
在低顺位里,什么神算子蒋敬,轰天雷凌振,紫髯伯皇甫端,独角龙邹润,的确是可有可无毫无存在感的。另外,大家比较熟悉的矮脚虎王英和一丈青扈三娘夫妇居然也是倒数的,这个也比较令人诧异。
接着我们再看看三十六天罡里谁是低顺位的。阮氏三兄弟,船火儿张横,都是水军相关的将领,也可以理解。还有一个不知道怎么能混上天罡的地痞恶霸没遮拦穆弘,这个也没毛病。
最后再看看七十二地煞里谁是高顺位的。神偷鼓上蚤时迁实至名归。但是旱地忽律朱贵,金眼彪施恩这两个开酒店的居然顺位也很高,我就想不明白了。
要注意的一点是,名字出现次数并不能毫无误差的反映作者对该角色的用笔墨的程度。比如说,豹子头林冲在书中也可能以林教头的称呼出现,鲁智深出家之前的名字鲁达就没有被统计,黑旋风李逵在书中也可能以铁牛的称呼出现。但相对来说,名字出现次数和作者对该角色的用笔墨的程度是正相关的。
下面是可以用来重复上述结果的 Python 脚本。
1 | import urllib.request |
如果要克服上述提到的一些统计的问题,可能就要用到对《水浒传》的 tokenization,对每个 token 进行单独统计,然后对人物名称的 token 进行归类,这样,像鲁智深,鲁提辖,鲁达之类的称呼都会归到一个人物下。
具体做起来的话,可能可以用一个 pre-trained 的 Language 模型,对《水浒传》进行 finetune,允许更新 token 的 embedding,然后对所有 token 的 embedding 进行 clustering,找出一百零八将每个将领对应的 cluster 的所有 tokens,然后进行统计。但是这个是理想情况下的,实际可能一个人物称呼由多个 tokens 组成,而且单一 token 并不特指某一个人物,比如“林 教头”,那上述的做法就不 work 了。
另外一种做法可以是利用网上的 pre-trained 的模型先做 Named Entity Recognition(NER),找出所有人物名称的 string,然后把每个人物名称的 string 单独作为一个 token,再用一个 pre-trained 的 Language 模型,对《水浒传》进行 finetune,允许更新 token 的 embedding(新的人物名称的 string 是没有 embedding 的,需要通过学习得到),然后对人物名称 token 的 embedding 进行 clustering,找出一百零八将每个将领对应的 cluster 的所有 tokens,然后进行统计,这样效果应该就会非常好了,而且自动化程度会比较高。有兴趣的朋友可以尝试一下。
《水浒传》一百零八将名字在原著中的出现频率