司马光

脍炙《通鉴》

  • Posted on: 23 September 2012
  • By: kzeng

(这是一篇关于很枯燥的技术,很枯燥的历史文本,和不太枯燥的统计的 blog)

看过一篇关于《全宋词》词频统计文章,挺有趣的,想用类似的方法处理一下《资治通鉴》,所以就趁周末花了几个小时作了一下。

词是长短句,统计两个字组成的词频比较合适,《通鉴》是古文,文字结构不同,所以我统计了单字频,两字词词频,三字词词频,四字词词频,和五字词词频。同时也记录各个统计单位(字或词)出现的卷数。《通鉴》294卷,从三家分晋到五代结束共共1362年,所以卷数可以作为时间的度量。

《全宋词》的词频是用 R 作的。R 虽然是不错的统计软件,也是我的最爱之一,但是 R 并不适合作文本分析,更不适合来作数据库操作。所以就用了 C# 和 Kdb +3.0。 C# 用来分析文本,.Net 是懒人的福音,并且多线程运算非常简单,能够大大提升文本处理速度,Kdb+用来储存数据,它差不多是性能最好的 in-memory 数据库了,从它的网站上能下载到免费版本。这个分析里数据库是重头戏,因为需要查询数百万行的数据 row,如果用 MySQL,估计会龟速到死。另外 Kdb + 本身只有 300多K,不用安装,很方便。还有就是 Kdb+ 的 Q 语言也能满足编程需要。

Kdb+ 的网站提供了各种语言 API 的源码,C# 的 API 不支持多线程,所以需要在适当的地方加锁。Kdb 唯一的问题是不支持 UTF-8。它用的是 UTF-7,所以在注入中文文字数据的时候可能会出现乱码,为了省事,从 C# 里 publish 数据的时候,直接 publish 为三字节的 int[] 了。query kdb 时用了一个免费的 GUI QPad。QPad 似乎是用 Java 写的,它的编码默认是 UTF-8,所以在 query  Kdb 的时候直接把三字节的 int vector  cast 成 char,在 QPad 里显示的就是中文了,所以也很方便。

产生数据的 C# 代码非常简单,发布数据的时候自动生成 Kdb 的 schema。使用的《资治通鉴》的文本是网上广为流传的国学网简体版,在生成数据前,先用 C# 作了预处理,主要是用正则表达式替换掉了现代语言的“污染”(譬如:“后一页”,公元xxx年 等)

下表是各个字、词频的数据量:

类别 数据行数
单字            2,586,329
双字            2,102,023
三字            1,633,875
四字            1,221,713
五字                851,403

从上表看,《资治通鉴》应该有近两百六十万字。

单字的字频统计如下:

排名 次数 百分比 累积百分比 
1 66087 2.56% 2.56%
2 39874 1.54% 4.10%
3 35677 1.38% 5.48%
4 34376 1.33% 6.81%
5 21578 0.83% 7.64%
6 21279 0.82% 8.46%
7 20182 0.78% 9.24%
8 20100 0.78% 10.02%
9 19035 0.74% 10.76%
10 18209 0.70% 11.46%
11 18083 0.70% 12.16%
12 使 17160 0.66% 12.82%
13 16116 0.62% 13.45%
14 16031 0.62% 14.07%
15 15600 0.60% 14.67%
16 15558 0.60% 15.27%
17 15252 0.59% 15.86%
18 14746 0.57% 16.43%
19 12826 0.50% 16.93%
20 12536 0.48% 17.41%

“之”字当之无愧的排在了第一位。第一个非虚词是“王”,它包含了姓和爵位,第一个动词是“曰”。“人”的频率也很高,“将”,“军” 在双字词频中也会遇到。“帝”字排名32,“后”字排名33。但是因为是简体字,“后”并不专指皇\王后。

下面是价值观念的排名:

排名 次数 百分比
152 3507 0.14%
181 3004 0.12%
223 2475 0.10%
240 2287 0.09%
253 2190 0.08%
294 1935 0.07%
767 694 0.03%

义、忠、孝排名在前,智排名最后,倒正印证了司马温公那句话:“凡取人之术,苟不得圣人、君子而与之,与其得小人,不若得愚人。”当然这个数据里噪音很多。

另外还有很多有趣的东西,就不一一叙述了。下面看一下两个字的词频:

排名 最早卷数 次数 百分比
            1 将军 1             6,176 0.29%
            2 刺史 21             4,790 0.23%
            3 州刺 21             4,110 0.20%
            4 节度 29             3,698 0.18%
            5 以为 1             3,479 0.17%
            6 度使 203             3,202 0.15%
            7 天下 1             2,972 0.14%
            8 尚书 20             2,742 0.13%
            9 太子 1             2,584 0.12%
          10 陛下 6             2,492 0.12%
          11 不能 1             2,375 0.11%
          12 不可 1             2,351 0.11%
          13 太后 3             2,165 0.10%
          14 皇帝 6             2,050 0.10%
          15 太守 5             2,010 0.10%
          16 大将 6             1,813 0.09%
          17 遣使 4             1,501 0.07%
          18 司马 1             1,480 0.07%
          19 二月 4             1,477 0.07%
          20 馀人 2             1,463 0.07%

“将军”出现的频率最高,在第一卷里就出现了,“度史”显然是“节度使”里出现的,虽然在203卷才出现,但是它居然出现了3202次,唉,唐朝啊!“节度”一次出现的要比“节度使”早。“皇帝”一次最早在第6卷出现,其实那时还是昭襄王元年,但是因为文本中出现了“秦始皇帝上”。

两字地名出现的最多的是“长安”,排名43,最早出现在第5卷,不过那里的“长安”并不是长安城,而是赵国的长安君。“洛阳”其次,排名81,最早出现在第2卷,三家分晋不久,洛阳附近就成了三晋与秦国的战场。

三个字的词频:

排名 最早卷数 次数 百分比
1 州刺史 21 4102 0.25%
2 节度使 210 3195 0.20%
3 大将军 6 1547 0.09%
4 平章事 203 933 0.06%
5 同平章 203 901 0.06%
6 十二月 4 704 0.04%
7 之子也 13 700 0.04%
8 十一月 7 686 0.04%
9 部尚书 70 655 0.04%
10 指挥使 254 578 0.04%

比较有趣的是“之子也”,老子英雄儿好汉。

四字字频:

排名 最早卷数 次数 百分比
1 同平章事 203 900 0.07%
2 仪同三司 49 403 0.03%
3 都指挥使 254 374 0.03%
4 日有食之 1 368 0.03%
5 中书侍郎 73 325 0.03%
6 节度使李 217 312 0.03%
7 散骑常侍 69 308 0.03%
8 开府仪同 79 300 0.02%
9 府仪同三 79 283 0.02%
10 御史大夫 9 281 0.02%

鉴于“州刺史”在三字字频中频繁出现,所以频率出现比较高的各个州刺史的频率单列出来:

排名 最早卷数 次数 百分比
15 豫州刺史 58 220 0.02%
19 荆州刺史 49 195 0.02%
26 兗州刺史 37 172 0.01%
32 徐州刺史 30 167 0.01%
38 扬州刺史 24 152 0.01%
42 雍州刺史 65 147 0.01%
52 江州刺史 86 122 0.01%
64 益州刺史 39 113 0.01%
68 二州刺史 49 111 0.01%
74 秦州刺史 79 109 0.01%
101 青州刺史 21 91 0.01%
105 梁州刺史 84 90 0.01%
107 冀州刺史 27 88 0.01%
114 并州刺史 52 84 0.01%
135 凉州刺史 31 71 0.01%
165 幽州刺史 50 62 0.01%
196 广州刺史 80 55 0.00%

豫州刺史第58卷时才登场,但是雄踞第一,而豫、荆、兖、徐、扬也勾勒出了中国政治地理的热点。顺便提一句,最早登场的豫州刺史是王允,而最早登场的荆州刺史是杨震。

五字词已经没有太大的意义:

排名 最早卷数 次数 百分比
               1 府仪同三司 79 283 0.03%
               2 开府仪同三 79 283 0.03%
               3 尚书左仆射 77 167 0.02%
               4 皇帝上之下 10 140 0.02%
               5 为中书侍郎 84 118 0.01%
               6 尚书右仆射 81 115 0.01%
               7 军都指挥使 256 111 0.01%
               8 骠骑大将军 39 107 0.01%
               9 河东节度使 214 101 0.01%
            10 督中外诸军 74 97 0.01%

最后看看慕容家的英杰们谁的全名被提到的次数最多:

次数
慕容彦超 27
慕容垂 26
慕容廆 24
慕容绍宗 15
慕容恪 18
慕容评 18
慕容皝 17
慕容农 15
慕容翰 15
慕容仁 12
慕容白曜 10

似乎是慕容彦超险胜慕容垂……慢着!慕容垂最初的名字是慕容霸,而慕容霸被提及了10次,所以慕容垂以 36 次远远胜出 (慕容缺这个全名并没有出现在《通鉴》中:))。

Blog分类: 

旧相识

  • Posted on: 30 May 2010
  • By: kzeng

IMG_3247

长周末,找了一处宁静的海滩。快到目的地的时候,途径一小片湖泊,很多天鹅在里面游弋,把车停在路边,和 LD 坐在长椅上看了一会儿天鹅,第一次见到这么多的天鹅。

走回车里,路过一户临水人家,芳草绿树,突然望到草地上一丛繁花,是牡丹!离家以后多少年都没有见过牡丹了,没想到在新泽西一处僻静小城的海岸边上看到了牡丹。如果没认错,应该是牡丹四大名品之一的赵粉(更喜欢它另外一个名字:冰凌罩红石)。

按家乡的节气,牡丹在谷雨前就该谢了,所以司马光老先生听说谷雨后仍有牡丹花开才会冒着雨乐此不疲的戴着蓑衣去看。现在即便是费尽力气延长花期,牡丹花会通常也在五月初就结束了,但是在美国竟然在小满之后还有牡丹花开,夏历四月的牡丹。这大概白乐天四月时看到山寺桃花也是一样的惊喜吧。也不单单是惊喜,牡丹,司马光,白居易,每一个符号都和家乡有着莫大的关系,好久没有回家了 ……

心里胡乱改了欧阳修的一句诗:“异乡物态与人殊,惟有牡丹旧相识。”又一想,《洛阳牡丹记》正是欧阳文忠公的手笔。

Blog分类: 

牡丹花·牡丹诗

  • Posted on: 16 April 2009
  • By: kzeng

mudan4mudan1 mudan2mudan3

又是家乡牡丹开时,又不能回家看花。老妈发来了楼下花坛里盛开的牡丹,原原本本的贴来:)

想起前阵子提及司马光一首雨中上牡丹的诗:

小雨留春春未归,花好虽有恐行稀。
劝君披取渔蓑去,走看姚黄拼湿衣。

有人问,说这诗的最后一句不合平仄,五个字一平到底。其实“湿”字是入声,是仄音,只是现代汉语转为平声了,倒是“拼”字是个蹊跷,按理,“拼”这个字的地方也该用仄声字,可是“拼”本身却是平声;可是司马光老先生肯定不会用错平仄的,仔细的想了想,大约这个“拼”字本来应该是“拚”字,pan 4,后来因为“拼”与“拚”俗用的时候相同,司马光老先生的这首诗里,“拚”字就被转抄为”拼“字, 或者他本来写的就是“拼”字,但是仍然需要按照“拚”的读音来念。

当时只是猜想,刚才有想起来,Google 了一下,虽然网上几乎所有的版本都是“拼湿衣”,但是一个《全宋诗》上给出的版本是“判湿衣”,这其实证明了我的猜测,如果写作“判”,那其本字就一定是“拚”了。想起元稹的一首乐府诗中的一句“海波无底珠沉海,采珠之人判死采”,这个“判”其实就是“拚”,“不顾、舍弃”的意思,就像现在写作“拼命”的“拚命”里的拚字一样,司马光的诗中也是这个意思,为了看花,不顾雨打衣湿。所以,司马光的诗是合格律的(哈哈,这句话是废话)

Blog分类: 

牡丹芳

  • Posted on: 9 April 2006
  • By: kzeng

mudan 刚才打电话回家,老妈说正要和老爸、外婆、表姐、小外甥女等一大家子出门,问去那里,说是要一起去看牡丹。放下电话算算日子也差不多,现在正当牡丹刚刚盛开的时候,是看花的好时节,过了这几日就是正式的牡丹花会了,小时候对牡丹花会比较深恶痛绝,一时间从四面八方来的游人几乎要把我们这个千年小城给撑破了,现在想想,众乐应该比独乐更乐吧。一年当中,牡丹花开得最好的也就只有四月初到四月底这二十多天的时间,虽然现在通过人工栽培,牡丹一年四季都可以开花,但是摆在春节晚会现场的牡丹总让人想起韩国MM----人力之所成,非天之自然而有。牡丹的花期通常到了谷雨就结束了,古时的同乡称谷雨为"牡丹厄",今年的谷雨是4月20日,所以现在正是赏花的季节。呵呵,想起司马光的一首诗:

谷雨后来花更浓,前时已见玉玲珑。
客来更说姚黄发,只在街西相第东。

因为通常牡丹在谷雨前就开始凋谢,所以当司马老先生看到谷雨之后名花尚开时乐得喜不自胜(呵呵,幸好古人不会去怀疑这是不是全球气候变暖的征兆),这组诗的第二首写的就是老先生高兴得不得了,虽然还下着雨,但是还喜滋滋的认为这是"小雨留春春未归",高高兴兴的找来蓑衣斗笠,和朋友一起去看花。

原来的一个大胡子教授说过,特别憧憬19世纪末20世纪初的维也纳,因为或许在街边一个小咖啡馆里就能看到马克思·韦伯与熊彼特激烈的辩论着问题,而一旁施特劳斯兄弟正在悠闲的演奏者音乐(呵呵,当时有些怀疑,这样的场景是否真的可能出现,但是看到他一脸陶醉的样子不忍去刨根问底,反正辛弃疾的词中也说和青山赤壁一起摘下北斗酌酒喝),那时的维也纳是欧洲乃至世界的文化中心(与此同时柏林的一干人等正在挥汗如雨的构建现代物理学)。而在司马光那个时代,洛阳可比20世纪初的维也纳,虽然并非中国的政治中心,但是却绝对是中国的文化中心,不仅于一时汇集了司马光、邵雍、文彦博、富弼、二程以及吕公著等著名文人学者,还有著名的"洛社耆英"这样Club(不知道《此间的少年》"洛阳俱乐部"是不是源自于此的(:)。因为北宋几乎所有的名人都在洛阳短住或是长居过,所以吟咏牡丹的篇章数目不算少,不过我觉得写牡丹写得最好的还是唐朝白居易《新乐府》中的《牡丹芳》。尽管白居易说他的《新乐府》"其辞质而径",但是在这首《牡丹芳》中却是异常的文彩艳丽,全诗很长,不一一引述,摘取其中拟人写牡丹的几句:

映叶多情隐羞面,卧丛无力含醉妆。
低娇笑容疑掩口,凝思怨人如断肠。

觉得这几句写得惟妙惟肖,牡丹花盛叶繁但是植株又不是很高,所以白居易把她比作醉卧在花丛中半掩娇羞的美女,似乎正式受白乐天的影响,后来的诗人才把牡丹与洛阳的两位奇女子--绿珠和洛神联系起来,譬如北宋梅尧臣的"红栖金谷妓,黄值洛川神"。这样一来,牡丹似乎同时拥有了不同的面容,一边是白乐天笔下的娇媚;一边是刘禹锡笔下的雍容("惟有牡丹真国色,花开时节动京城");还有就是传说中的不屈(武则天下诏令群花于冬日绽开,惟有牡丹抗旨),这样形象,要比梅花,菊花,荷花更为丰美立体,所以我积极支持把牡丹选为国花!

Blog分类: