最近,发现 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实现宋词词频统计——东风何处是人间相关推荐

  1. [Literature]“东风何处是人间”:网友算出99个宋词常用语 圆周率可填词

    你羡慕那些出口就会吟诗的文人吗?现在可以不用再羡慕他们了!因为一位网友"yixuan"闲来无事,把<全宋词>拿出来"捣鼓",算出了其中的99个高频词 ...

  2. 关于宋词频率统计(R语言)

    http://yixuan.cos.name/cn/2011/03/text-mining-of-song-poems/ 看了宋词频率统计的例子,想用php实现一下,php的split中文让我崩溃了. ...

  3. 学习NLP的第10天——文章关键词提取:词频统计

    关键词提取是词语颗粒度的信息抽取的一种重要的需求,即提取文章中重要的词语. 关键词提取的常用方法包括词频统计.TF-IDF和TextRank等. 其中,词频和TextRank属于单文档算法,即只需一篇 ...

  4. 用R语言做词频统计_R语言 | 词频统计

    Python网络爬虫与文本数据分析 本章内容 导入停用词 读数据,分词 剔除停用词 导入停用词表 library(dplyr) ## [1] "?" "." & ...

  5. 统计csv词频_中文词频统计

    中文词频统计 1. 下载一长篇中文小说. <倚天屠龙记> 2. 从文件读取待分析文本. 3. 安装并使用jieba进行中文分词. pip install jieba import jieb ...

  6. 201671010417 金振兴 词频统计软件项目报告

    1.需求分析 按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发. .程序可读入任意英文文本文件,该文件中英文词数大于等于1个. . ...

  7. 字符串操作、文件操作,英文词频统计预处理

    1.字符串操作: 解析身份证号:生日.性别.出生地等 凯撒密码编码与解码 网址观察与批量生成 (1)解析身份证: 编译结果: (2)凯撒密码编码与解码 编译结果: 2.英文词频统计预处理 下载一首英文 ...

  8. hive进行词频统计

    统计文件信息: $ /opt/cdh-5.3.6/hadoop-2.5.0/bin/hdfs dfs -text /user/hadoop/wordcount/input/wc.input hadoo ...

  9. Python_note6 组合数据类型+jieba库+文本词频统计

    集合类型和操作 集合元素不可修改,由不可变数据类型组成,元素不可重复 a = {"python",123,("python",123)}使用{}建立集合 b = ...

最新文章

  1. 钻石问题(菱形继承问题) 和虚继承
  2. c# typeof() 和 GetType()的区别
  3. setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
  4. c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...
  5. Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
  6. 关于c++的文件编码的研究
  7. linux命令详解——top
  8. Test传送门(更新中)
  9. 徒手实现Spring的IOC
  10. 关于图片预加载的思考
  11. java爬虫post 404_POST 后台404错误
  12. [Andriod设计模式之旅]——Builder模式
  13. 2.PHP7内核剖析 --- SAPI
  14. Exchange常见问题大全
  15. c语言自动计费工作,c语言编程实现话单计费实例
  16. java学生信息管理系统
  17. 如何创建一个进度条控件
  18. latex安装后运行报错:系统找不到指定的文件,试试这样吧
  19. 使用codelite搭建stm32开发环境
  20. 直方图均衡化取整怎么计算_玩转直方图处理之直方图均衡化、规定化

热门文章

  1. 如何做好用户生命周期价值分析(LTV)
  2. [Famous Awards in Different Fields]01:Hugo Awards
  3. 文件application.yml不显示叶子形状解决办法
  4. 【英语演讲】Persuasive Speech
  5. IaaS Paas Saasy以及IOT EOT AIoT分别是什么意思
  6. win10徽标键常用快捷键
  7. react history路由跳转
  8. 支付宝沙箱模拟支付,退款等
  9. LLVM中几个重要的Passes子类
  10. 解决SPSS中can not create java virtual machine问题