再次神经短路,突然想看看宋词里面什么样的意象是最常见的,比如可以做个频率分析什么的。当然文本挖掘需要分词,我没法在其中花太多时间,于是想出了一个土办法。宋词的句子都很短,如果穷举可能的字的组合的话并不是太多,况且最常见的词语一般是两三个字,这样可能的组合就更少了。比如“犹解嫁东风”这句话,可能的二字组合是“犹解”“解嫁”“嫁东”“东风”,三字组合是“犹解嫁”“解嫁东”“嫁东风”,词的字数越多,可能的组合就越少。如果把每句话可能的字的组合都列举出来,就可以整体统计频率了。
当然里面会有很多无意义的字的组合,不过这类“词语”本身的出现就是一个偶然,所以可以预期的是它们整体的频数会很低,是入不了“大雅之堂”的。话不多说,直接上代码和结果。
数据:《全宋词》文本
代码:
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
不知各位看官看到上面这些既熟悉又悠远的话语又将作何感想?或许,她们就是我们千百年来的精神寄托吧。