ScalaでN-gramを一行で
重い腰を上げてScala触ってます。ということでN-gramなる簡単なテキスト処理を書いてみましたの巻。
- おもむろにScalaのREPLを立ち上げて、お気に入りのページから元データを読み込みます。エッセイ巧いなぁ……。
店にねこ入ってきて疲れたしようじょも入ってきた - 24時間残念営業
val source = scala.io.Source.fromURL("http://lkhjkljkljdkljl.hatenablog.com/entry/2013/07/01/190816", "UTF-8")
- 行ごとに読んでList[String]にします。BufferedSourceをcloseしなきゃなので、ここまではノーカン。。。
val lines = try source.getLines.toList finally source.close
- 適当に日本語用の前処理してN-gramします。お、折り返して見えるかもだけど、改行してないから一行ったら一行!
lines.map(_.filter(_.toString.getBytes.length > 1)).flatMap(_.split(Array('、', '。', ' '))).flatMap(_.sliding(5).toList).groupBy(identity).mapValues(_.size).toSeq.sortWith(_._2 < _._2).filter(_._2 > 4).foreach(println)
(ようじょも,5)
(なりました,5)
(入ってきて,5)
(ねこ入って,6)
(女子小学生,6)
(こ入ってき,6)
(入ってきた,10)
∧,,∧ 。・。゚・。 ゚・。゚・ N-gramできたよ〜 ( ´・ω・)つ\_______/