东风何处是人间

再次神经短路,突然想看看宋词里面什么样的意象是最常见的,比如可以做个频率分析什么的。当然文本挖掘需要分词,我没法在其中花太多时间,于是想出了一个土办法。宋词的句子都很短,如果穷举可能的字的组合的话并不是太多,况且最常见的词语一般是两三个字,这样可能的组合就更少了。比如“犹解嫁东风”这句话,可能的二字组合是“犹解”“解嫁”“嫁东”“东风”,三字组合是“犹解嫁”“解嫁东”“嫁东风”,词的字数越多,可能的组合就越少。如果把每句话可能的字的组合都列举出来,就可以整体统计频率了。

当然里面会有很多无意义的字的组合,不过这类“词语”本身的出现就是一个偶然,所以可以预期的是它们整体的频数会很低,是入不了“大雅之堂”的。话不多说,直接上代码和结果。

数据:《全宋词》文本

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
l = scan("Ci.txt", "character", sep = "\n");
l.len = nchar(l);
 
# 某些行是作者和标题,所以选取长度大于10的行;
# 另外这个文本文件不太规整,有些网址什么的,
# 所以也要排除那些长度太长的。
ci = l[l.len > 10 & l.len < 500];
 
# 句子用标点符号分割。
sentences = strsplit(ci, ",|。|!|?|、");
sentences = unlist(sentences);
sentences = sentences[sentences != ""];
s.len = nchar(sentences);
 
# 单句太长了说明有可能是错误的字符,去除掉。
sentences = sentences[s.len <= 10];
s.len = nchar(sentences);
 
# 暴力挨个拆分,比如“犹解嫁东风”的所有二字组合为
# “犹解”“解嫁”“嫁东”“东风”,
# 无意义的词其频数自然就落在后面了。
splitwords = function(x, x.len) substring(x, 1:(x.len - 1), 2:x.len);
 
words = mapply(splitwords, sentences, s.len, SIMPLIFY = TRUE, USE.NAMES = FALSE);
words = unlist(words);
words.freq = table(words);
words.freq = sort(words.freq, decreasing = TRUE);
data.frame(Word = names(words.freq[1:100]), Freq = as.integer(words.freq[1:100]));

结果(排在第一的是无效字符,这跟数据源有关):

   Word Freq           Word Freq
1       1485        51  天上  368
2   东风 1382        52  杨柳  362
3   何处 1230        53  西湖  356
4   人间 1202        54  桃花  354
5   风流  857        55  扁舟  353
6   归去  812        56  消息  351
7   春风  802        57  憔悴  344
8   西风  779        58  何事  339
9   归来  771        59  芙蓉  338
10  江南  765        60  神仙  334
11  相思  753        61  一片  334
12  梅花  732        62  桃李  333
13  千里  676        63  人生  332
14  回首  656        64  十分  331
15  明月  651        65  心事  329
16  多少  648        66  黄花  328
17  如今  642        67  一声  325
18  阑干  630        68  佳人  324
19  年年  613        69  长安  321
20  万里  590        70  东君  319
21  一笑  582        71  断肠  316
22  黄昏  550        72  而今  315
23  当年  542        73  鸳鸯  314
24  天涯  537        74  为谁  313
25  相逢  528        75  十年  310
26  芳草  527        76  去年  309
27  尊前  516        77  少年  308
28  一枝  512        78  海棠  307
29  风雨  505        79  寂寞  306
30  流水  472        80  无情  306
31  依旧  472        81  不是  305
32  风吹  471        82  时候  304
33  风月  461        83  肠断  303
34  多情  457        84  富贵  303
35  故人  451        85  蓬莱  303
36  当时  450        86  昨夜  303
37  无人  445        87  行人  302
38  斜阳  438        88  今夜  301
39  不知  430        89  谁知  300
40  不见  429        90  不似  299
41  深处  422        91  江上  298
42  时节  403        92  悠悠  296
43  平生  398        93  几度  295
44  凄凉  398        94  青山  295
45  春色  394        95  何时  294
46  匆匆  383        96  天气  293
47  功名  383        97  惟有  293
48  一点  378        98  一曲  291
49  无限  377        99  月明  291
50  今日  369        100 往事  290

不知各位看官看到上面这些既熟悉又悠远的话语又将作何感想?或许,她们就是我们千百年来的精神寄托吧。

发表评论?

61 条评论。

  1. 流行语:东风何处在人间...

  2. 台湾有些作者做过这个事情,他们是通过中文分词,然后统计的频率。其中包括了单个字的意向,比如月、花等。

    非常非常赞你的这种方法,化繁为简啊;我当初还找人要分词后的宋词,结果别人不给;你这个方法倒是绕过去了啊。

    我觉得可以抽出李清照、柳永、苏轼、辛弃疾等人的诗词,看看个人的风格!

    赞~

  3. 真给力,把这些词用到文章里一定非常出彩~ 排名第一的怎么是框框?

    • 因为那个txt里面很多字没有正确显示,因此是框框,这个和我小时候一直觉得佚名这个人真厉害,写了很多文章是一个道理:)

  4. 呵呵,还有三个字的词,也不错:)

          Word Freq           Word  Freq
    1          893       51  在何处   40
    2          204       52  断人肠   39
    3   倚阑干  125       53  水晶宫   39
    4          108       54  月清风   39
    5   知何处  107       55  落花飞   38
    6   广寒宫   94       56  如归去   38
    7   到如今   89       57  无消息   38
    8   东风吹   85       58  花无数   37
    9   留不住   76       59  人间天   37
    10  人何处   76       60  随流水   37
    11  有谁知   74       61    TXT   36
    12  三十六   70       62  杜鹃啼   36
    13  西风吹   66       63  歌金缕   36
    14  云深处   63       64  个人人   36
    15  不知何   62       65  故人相   36
    16  人间世   61       66  间天上   36
    17  人不见   60       67  明月清   36
    18  君知否   58       68  送春归   36
    19  人千里   58       69  影横斜   36
    20  与谁同   57       70  春消息   35
    21  不如归   54       71  人间何   35
    22  春归去   54       72  一番新   35
    23  年今日   53       73  一年春   35
    24  何处是   52       74  一枝春   35
    25    凝伫   52       75  二十年   34
    26  归去来   51       76  寄相思   34
    27    归去   48       77  去来兮   34
    28  二十四   47       78  去年今   34
    29  归何处   47       79  人如玉   34
    30  花深处   47       80  是人间   34
    31  江南春   46       81  寿阳妆   34
    32  向尊前   46       82  无觅处   34
    33    知否   46       83  有个人   34
    34  花飞絮   45       84  此时情   33
    35  花流水   45       85  江南路   33
    36  记当年   44       86  留春住   33
    37  长安道   43       87  然一笑   33
    38  雨初晴   43       88      噫   33
    39          42       89  唱阳关   32
    40  倚东风   42       90  分付与   32
    41  功名事   41       91  何处去   32
    42  海棠开   41       92  江南岸   32
    43  谁知道   41       93  人憔悴   32
    44  知多少   41       94  人去后   32
    45  东风里   40       95  十年前   32
    46  海棠花   40       96  天如水   32
    47  老人星   40       97    无绪   32
    48  那堪更   40       98    休休   32
    49  桥流水   40       99  须信道   32
    50  山无数   40       100 一枝斜   32
    

    第二和第四个也有点小问题……

    • 求高手解释“三十六”“二十四”。:)

      • 二十四难道不是二十四桥明月夜吗?三十六不懂。

      • 三十六计- -

      • 二十四是出现的比较多的了,单拿姜夔的词为例,就有“二十四桥明月夜”、“二十四桥仍在”、“红桥二十四”等,另又有二十四节气、二十四番花信等,算是高频词了;三十六也多次在姜夔的词中出现,如“一叶凌波缥缈,过三十六离宫,遣游人回首”、“问甚时同赋,三十六陂秋色”、“三十六陂人未到,水佩风裳无数”,王安石词中也有用到三十六陂句“三十六陂烟水,白头想见江南”,至于三十六计,是否在宋词中被引用过,就不清楚了

    • 最讨厌的就是倚阑干,每次读到这些地方就发怵,以及类似的拍栏杆、莫凭栏、不忍登高等等,典型的毫无个性之闷骚+不爱护公物嘛~

      有时候觉得很多词实在是过于雕琢堆砌了,很多都是陈词滥调、缺乏新意、言之无物、情感苍白。话别离,必古道长亭、灞桥杨柳;叹不遇,必登高临远、拍遍阑干;弄凄凉,必风雨黄昏、残灯孤雁;说相思,必伤春凝眸、肠断天涯。此外再辅之以风花雪月酒色烟尘鸟兽草树等熟透了的意象,时不时还故作深沉地发问:几处、谁家、何处、多少、不知等等。比如柳永的词初读还蛮有意思的,多读几篇发现格调总是如此,离不开宋玉、鸿雁、斜阳等字眼,慢慢地也就审美疲劳了。

      个人觉得宋词本身就是娱乐的东西,算不上正式文学作品;宋词之所以表现力不强除了很多意象被用庸人玩烂了之外,更重要的原因是宋词的自由度太小,格调音韵字数限制的很死,要写篇词很是费劲,因此一般的词人不得不堆砌拼凑。当然,也有极少数词音韵和谐、感情真挚、语言新雅,比如我最喜欢的词人易安居士之许多作品。

      借地发牢骚,原谅~

  5. 哈哈,叹服太云兄之博学多才啊!发个牢骚都写的跟诗一样,佩服,佩服:)

  6. 百无聊赖看到此文~瞬时神清气爽之~
    突然想起上次去京竟然没有向你索要墨宝, 啊, 失误失误,哈哈

  7. 建议这篇文章上COS主站,结果如何无所谓,这想法很好,很有新意。文章不必再刻意扩展,就这样发出来就可以了。

  8. 非常有意思,这些大概就是中华文化的文字密码了。

    人间、江南、相思、梅花、千里、回首、明月、黄昏、当年、天涯、相逢、芳草、尊前、流水、多情、故人、杨柳、桃花、佳人、长安——这些词默念出来感觉意向万千——

    希望您能把全唐诗也做一次同样的解析O(∩_∩)O~

    • 之前整理出来这些词语后一直不知道该怎么形容,看到你的回复后觉得“文字密码”这个词非常贴切。:D

  9. 看完统计的数据,突然有一种幸福感,古人活的真不容易,100个词中,没有一个是明显带着快乐,幸福的感情色彩的,宋代的人活的很憋屈啊……

  10. 请问博主用的什么语言,看着像python,但又不是。

  11. 披个斗篷来围观~

    天涯……!!对这个词特别有感情,你懂的~

  12. 有意思,西湖排名这么高

  13. 人人网最流行的那些日志都用什么词 | 优哉·幽斋 - pingback on 2011年05月13日 在 22:41
  14. 我觉得你应该给你的这个分词手法取个名字。比如冒泡分词法或者沉淀分词法,抑或 冒泡沉淀分词法

  15. 請問是什麼語言?

  16. 你好,方便联系下嘛?想就这个事采访你一下,哈哈

  17. 太牛了!我写穿越小说的,正好是程序员穿越,可以引用你这篇文里的内容吗?

  18. 穿越必备,比医学院的姐妹们轻松多了

  19. 冒味问一下,我是计算机盲,由于你的文章让我对计算机的神奇很向往,问一下:你的编译器是什么?不知如何操作可得到这美妙的结果

  20. 前来膜拜

  21. :wink: 楼主帅气,佩服~原来中国民族五千年文化的复兴和崛起在程序员手里..

  22. 呵呵,过往的精神寄托原来只是一些能够数字化的堆叠游戏,人类的每一个创作,也不过是一次稍有不同的重复。或者今日沉迷在愤怒的小鸟上的人们也就并非有多么的不可理喻了。。。字韵文心,曾经都是些说不清道不明的意境,能生在在数字化的今日清晰看到根本的我们真的很幸福。

  23. 请谁把好事做下去:
    1)把这100个词注上平仄
    2)把一些词牌的平仄模块列出。
    这样人人都能填词了,一定会百花争艳。

  24. 原来宋词的统计是源自这里呀,佩服。

    我按照这份统计编了个小工具软件“宋词傻瓜机”,它不但可以把任意一串数字转换为词,还提供了八个常用词牌格式及名家范例做参考,用起来轻松又有趣 。

    http://mrsunli.com/2011/songci/

  25. 程序神马的完全看不懂啊……
    但是觉得古人好憋屈,几千年了,怎么高频词竟然比英语四六级还少?!
    真是好创意,但是,文科生的鸭梨也越来越大了……

  26. 东风何处是人间__作词捷径 | 好奇のHaoQi.de - pingback on 2011年12月31日 在 17:18
  27. 有错误:
    > l.len = nchar(l)
    Error in nchar(l) : invalid multibyte string 1

  28. l.len>500的都去掉是不对的,博主应该查一下l[l.len>500]都是什么内容--我看了一下,有27行符合这个条件,全部是宋词正文,并非网址。另外网址可以用regex去掉:l = grep('txt', l, ignore.case=True)

  29. 报告一下我的结果,稍微有一些不同:

    Word Freq Rank
    1 □□ 1485 0
    2 东风 1382 1
    3 何处 1230 2
    4 人间 1202 3
    5 风流 857 4
    6 归去 812 5
    7 春风 802 6
    8 西风 779 7
    9 归来 771 8
    10 江南 765 9
    11 相思 753 10
    12 梅花 732 11
    13 千里 676 12
    14 回首 656 13
    15 明月 651 14
    16 多少 648 15
    17 如今 642 16
    18 阑干 630 17
    19 年年 613 18
    20 万里 590 19
    21 一笑 582 20
    22 黄昏 550 21
    23 当年 542 22
    24 天涯 537 23
    25 相逢 528 24
    26 芳草 527 25
    27 尊前 516 26
    28 一枝 512 27
    29 风雨 505 28
    30 依旧 472 29
    31 流水 472 30
    32 风吹 471 31
    33 风月 461 32
    34 多情 457 33
    35 故人 451 34
    36 当时 450 35
    37 无人 445 36
    38 斜阳 438 37
    39 不知 430 38
    40 不见 429 39
    41 深处 422 40
    42 时节 403 41
    43 凄凉 398 42
    44 平生 398 43
    45 春色 394 44
    46 功名 383 45
    47 匆匆 383 46
    48 一点 378 47
    49 无限 378 48
    50 今日 369 49
    51 天上 368 50
    52 杨柳 362 51
    53 西湖 356 52
    54 桃花 354 53
    55 扁舟 353 54
    56 消息 351 55
    57 憔悴 344 56
    58 何事 339 57
    59 芙蓉 338 58
    60 一片 334 59
    61 神仙 334 60
    62 桃李 333 61
    63 人生 332 62
    64 十分 331 63
    65 心事 329 64
    66 黄花 328 65
    67 一声 325 66
    68 佳人 324 67
    69 长安 321 68
    70 东君 319 69
    71 断肠 316 70
    72 而今 315 71
    73 鸳鸯 314 72
    74 为谁 313 73
    75 十年 310 74
    76 去年 309 75
    77 少年 308 76
    78 海棠 307 77
    79 寂寞 306 78
    80 无情 306 79
    81 不是 305 80
    82 时候 304 81
    83 富贵 303 82
    84 昨夜 303 83
    85 肠断 303 84
    86 蓬莱 303 85
    87 行人 302 86
    88 今夜 301 87
    89 谁知 300 88
    90 不似 299 89
    91 江上 298 90
    92 悠悠 296 91
    93 几度 295 92
    94 青山 295 93
    95 何时 294 94
    96 天气 293 95
    97 惟有 293 96
    98 一曲 291 97
    99 月明 291 98
    100 往事 290 99

  30. 东风何处是人间之宋词高频词汇 – 贱笑 – 贱笑 - pingback on 2012年01月21日 在 00:48
  31. 博主这个R语言貌似很强大呀 :smile:
    不知道用java能不能写出来呢,好像那个高频词用java挺难统计出来的哈 :sad:

  32. 请问作者是用什么语言写的?如用C++该怎么写。。求指导 :shock:

  33. 第一段:词的字数越多,可能的组合就越少?

    组合越多否?

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>