统计诗经中最常使用的叠词

晚上整理书籍,《诗经注析》这两本书买来的几年几乎没看过,主要原因是没心情,另一原因是这本书是繁体的,并且是竖排的,不习惯。

随手翻书的时候想到个问题,诗经中哪些叠词的使用频度最高?

本想用shell快速解决,但因为中文的问题,正则表达式没有搞定。改用scala来实现这个统计。

// 把"AABBC"解析为 List["AA","BB","C"]
scala> def parse(x : String) : List[String] = if(x.size == 0) Nil else {
     | val (l,r) = x.span(_ == x(0))
     | l :: parse(r)
     | }

// 定义可变map,记录叠词的频度
scala> val m = scala.collection.mutable.Map[String,Int]()

// 计数
scala> def count(l:List[String]) = l.foreach{e => if(m.get(e) == None) m(e)=1 else m(e)+=1}

// 读取文件,统计
scala> scala.io.Source.fromFile("/tmp/sj.txt").getLines.foreach{ line => count(parse(line).filter(_.size>1))}

// 看结果,top10
scala> m.toList.sortBy(-_._2).take(10)

结果能猜到一两个:

List((悠悠,34), (肅肅,26), (赫赫,24), (翼翼,22), (振振,18), (采采,18), (濟濟,16), (將將,14), (彭彭,14), (烈烈,12))

再看看唐诗的结果,频度要少很多:

List((茫茫,6), (萧萧,5), (纷纷,5), (冥冥,5), (凄凄,4), (处处,4), (悠悠,4), (朝朝,4), (寂寂,3), (年年,3))

总共8行scala代码,第一个parse方法效率不佳,后续可以优化。通过Source读取的那个地方也没有关闭流,不过作为一次性任务无大碍。

Just for fun,诗经的文本文件在这里,唐诗三百首的在这里。注意编码都是utf-8。

统计诗经中最常使用的叠词》上有3条评论

    1. hongjiang 文章作者

      嗯,sliding方法可以更简单,多谢:
      scala> “AABCCD”.sliding(2,1).filter(e=>e(0)==e(1)).foreach(println)
      AA
      CC

      回复
  1. 借鉴了blackzwei和作者的做法,可以将程序写成一行
    groupBy(identity)效率不高, 就当为大家提供另一种解决问题的思路

    scala.io.Source.fromURL(“http://hongjiang.info/wp-content/uploads/2013/05/sj.txt”).mkString
    .sliding(2).filter(str => str(0) == str(1)).toList
    .groupBy(identity).mapValues(_.length).toList
    .sortBy(-_._2).take(10)

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注