用perl实现宋词词频统计——东风何处是人间
最近,发现 yixuan 对全宋词做了个词频分析,结果吸引了广大人民群众的做词热情:“理科宅男们消灭文科生的日子到来了!拿起你的计算器,消灭文艺青年吧!” ^_^ 作为一个perl爱好者,不免想用perl实现试试,毕竟perl在处理文本方面是行家。
代码基本原理还是参照yixuan,但少量地方做了修改,根据维基百科中关于词的介绍:按长短规模分,词大致可分小令(58字以内)、中调(59一90字)和长调(91字以上,最长的词达240字)。所以最长设置为500是合理的,因为一个汉字是2个字节。宋词词牌名典型的长度是3个汉字:比如 永遇乐 阳关曲 江南忆等,但也有长达6个以上的词牌,比如:江南上云乐,潇湘逢故人慢,凤凰台上忆吹箫等,所以为了去掉作者名字和词牌名,设置了最小长度限制20. 同时由于数据源中有些词牌名还加了括号别名,比如:满庭芳(寿黄状元·三月初八),长度已经超过20,所以需要特别去掉这样的词牌名。
所有代码如下:
1 #!/usr/bin/perl -w 2 use strict; 3 4 my $in = "全宋词.txt"; 5 open (IN, "<$in") || die "Cannot open file: $in"; 6 my $out = "freq.list"; 7 open (OUT, ">$out") || die "Cannot open file: $out"; 8 9 my %phrase;10 11 while (<IN>) {12 chomp;13 if (( length($_) > 20 ) && ( length($_) < 500 ) && ($_ !~ /(/)) { #1 chinese = 2 bytes14 my @sentences = split /,|。|?|、|!/;15 foreach (@sentences) {16 s/\s+//g; #delete all SPACES if any17 my @words = split //; #split sentence into char, that is half chinese. 18 my $i = 0;19 while (defined $words[$i+3] ) {20 $phrase{$words[$i] . $words[$i+1] . $words[$i+2] . $words[$i+3]} ++; 21 $i += 2; }22 }23 }24 }25 26 #词频降序排列,若相同,则按照汉字拼音字母排序27 my @words_freq = sort { $phrase{$b} <=> $phrase{$a} or $a cmp $b } keys %phrase;28 foreach (@words_freq) {29 print OUT "$_\t" . "$phrase{$_}\n"; 30 }31 32 close (IN);33 close (OUT);
得出结果和yixuan的相类似,但在个别的词排序上有差别,可能是数据来源有区别,我只是临时从网上下载的。排在第一位的是无效字符□□,这是由于数据源的问题,下载的全宋词里面就有很所这种字符,应该是由于很多古体字打不出来,用□来代替的。如下是perl程序得到的排在出现频率前100的词组。
1 □□ 1492 2 东风 1321 3 何处 1178 4 人间 1147 5 风流 805 6 归去 788 7 春风 770 8 西风 755 9 归来 735 10 相思 725 11 江南 701 12 梅花 681 13 千里 648 14 回首 632 15 明月 622 16 如今 621 17 多少 620 18 阑干 597 19 万里 572 20 年年 566 21 一笑 565 22 天涯 518 23 相逢 516 24 芳草 511 25 当年 501 26 黄昏 493 27 尊前 491 28 风雨 488 29 流水 463 30 风吹 450 31 依旧 449 32 当时 439 33 风月 433 34 多情 432 35 斜阳 429 36 一枝 423 37 故人 421 38 不见 420 39 无人 420 40 不知 415 41 深处 390 42 凄凉 379 43 时节 376 44 匆匆 374 45 平生 374 46 春色 371 47 无限 371 48 功名 359 49 扁舟 350 50 杨柳 347 51 西湖 344 52 天上 342 53 一点 341 54 今日 337 55 桃花 335 56 憔悴 333 57 何事 332 58 芙蓉 322 59 黄花 321 60 心事 315 61 人生 313 62 消息 312 63 一片 312 64 十分 310 65 长安 307 66 神仙 307 67 一声 307 68 十年 305 69 佳人 302 70 桃李 302 71 断肠 300 72 而今 300 73 鸳鸯 299 74 去年 295 75 肠断 294 76 少年 294 77 为谁 293 78 江上 292 79 不是 289 80 今夜 289 81 无情 287 82 往事 286 83 海棠 285 84 何时 284 85 谁知 284 86 不似 283 87 青山 283 88 时候 283 89 悠悠 282 90 寂寞 281 91 蓬莱 281 92 惟有 279 93 行人 279 94 落花 276 95 如何 276 96 燕子 275 97 一曲 275 98 几度 274 99 月明 274100 富贵 273
从这个统计我们可以看出一些有趣的事实:
出现频率最高的是:“东风” "何处" 是 "人间",分列第2,3,4名。
古人对江南的确是情有独钟,不光词牌名有很多,比如:《忆江南》《江南忆》《江南好》《江南春》《江南柳》等,连词中统计出现“江南”的数目也是很庞大,占据了第11名。大部分词都是表达相思之苦(思故人,思情人,思故乡等等),比如占据前列的有:归去(6),归来(9),相思(10),千里(13),阑干(18),万里(19),天涯(22),相逢(23),故人(37)等等,真的是“为赋新词强说愁”啊。
参考:
http://yixuan.cos.name/cn/2011/03/text-mining-of-song-poems/
http://www.cnbeta.com/articles/164096.htm
转载于:https://www.cnblogs.com/yuyan/archive/2011/12/03/2274875.html
用perl实现宋词词频统计——东风何处是人间相关推荐
- [Literature]“东风何处是人间”:网友算出99个宋词常用语 圆周率可填词
你羡慕那些出口就会吟诗的文人吗?现在可以不用再羡慕他们了!因为一位网友"yixuan"闲来无事,把<全宋词>拿出来"捣鼓",算出了其中的99个高频词 ...
- 关于宋词频率统计(R语言)
http://yixuan.cos.name/cn/2011/03/text-mining-of-song-poems/ 看了宋词频率统计的例子,想用php实现一下,php的split中文让我崩溃了. ...
- 学习NLP的第10天——文章关键词提取:词频统计
关键词提取是词语颗粒度的信息抽取的一种重要的需求,即提取文章中重要的词语. 关键词提取的常用方法包括词频统计.TF-IDF和TextRank等. 其中,词频和TextRank属于单文档算法,即只需一篇 ...
- 用R语言做词频统计_R语言 | 词频统计
Python网络爬虫与文本数据分析 本章内容 导入停用词 读数据,分词 剔除停用词 导入停用词表 library(dplyr) ## [1] "?" "." & ...
- 统计csv词频_中文词频统计
中文词频统计 1. 下载一长篇中文小说. <倚天屠龙记> 2. 从文件读取待分析文本. 3. 安装并使用jieba进行中文分词. pip install jieba import jieb ...
- 201671010417 金振兴 词频统计软件项目报告
1.需求分析 按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发. .程序可读入任意英文文本文件,该文件中英文词数大于等于1个. . ...
- 字符串操作、文件操作,英文词频统计预处理
1.字符串操作: 解析身份证号:生日.性别.出生地等 凯撒密码编码与解码 网址观察与批量生成 (1)解析身份证: 编译结果: (2)凯撒密码编码与解码 编译结果: 2.英文词频统计预处理 下载一首英文 ...
- hive进行词频统计
统计文件信息: $ /opt/cdh-5.3.6/hadoop-2.5.0/bin/hdfs dfs -text /user/hadoop/wordcount/input/wc.input hadoo ...
- Python_note6 组合数据类型+jieba库+文本词频统计
集合类型和操作 集合元素不可修改,由不可变数据类型组成,元素不可重复 a = {"python",123,("python",123)}使用{}建立集合 b = ...
最新文章
- 钻石问题(菱形继承问题) 和虚继承
- c# typeof() 和 GetType()的区别
- setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
- c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
- 关于c++的文件编码的研究
- linux命令详解——top
- Test传送门(更新中)
- 徒手实现Spring的IOC
- 关于图片预加载的思考
- java爬虫post 404_POST 后台404错误
- [Andriod设计模式之旅]——Builder模式
- 2.PHP7内核剖析 --- SAPI
- Exchange常见问题大全
- c语言自动计费工作,c语言编程实现话单计费实例
- java学生信息管理系统
- 如何创建一个进度条控件
- latex安装后运行报错:系统找不到指定的文件,试试这样吧
- 使用codelite搭建stm32开发环境
- 直方图均衡化取整怎么计算_玩转直方图处理之直方图均衡化、规定化