Hatena::ブログ(Diary)

趣味的にっき このページをアンテナに追加 RSSフィード

2006-12-05

[] 単語の頻度を調べる 19:48  単語の頻度を調べるを含むブックマーク  単語の頻度を調べるのブックマークコメント

単語の頻度を調べる - rubyco(るびこ)の日記を見て、僕もHaskellで書いてみました。id:rubycoさんのと違って、頻度の高い順に出力するようにしています。

Haskell標準のwordsを使うと記号も含まれてしまうので、自前でwordsぽい関数を用意してみました。Parsec使って書こうかなとも思ったのですが、普通正規表現で実装しました(Rubyでいうところのscanが見付からなかったのでsplitRegexを使っています)。

うーん、HaskellでHashTableは面倒です。Ruby便利すぎ。

module Main (main) where

import Data.HashTable as H (HashTable, new, hashString, lookup, update, toList)
import Data.List (sortBy)
import Text.Printf (printf)
import Text.Regex (mkRegexWithOpts, splitRegex)

newWordTable :: IO (HashTable String Int)
newWordTable = new (==) hashString

incWordTable :: HashTable String Int -> String -> IO ()
incWordTable table w =
  (const . return) () =<< update table w . maybe 1 (+ 1) =<< H.lookup table w

words' :: String -> [String]
words' = filter (not . null) . splitRegex re
  where
    re = mkRegexWithOpts "[^a-z0-9_]+" False False

main :: IO ()
main = do
  table <- newWordTable
  mapM_ (incWordTable table) . words' =<< getContents
  mapM_ dump . sortBy comp =<< toList table
  where
    dump (w, n) = printf "%8d  %s\n" n w
    comp (_, n1) (_, n2) = compare n2 n1

実行例:

$ cat a.txt
We wish you a Merry Christmas,
We wish you a Merry Christmas,
We wish you a Merry Christmas,
and A Happy New Year!
$ cat a.txt | ./freq.exe
       3  Christmas
       3  a
       3  Merry
       3  We
       3  you
       3  wish
       1  and
       1  A
       1  Happy
       1  New
       1  Year

[] つじあやのさんNEW SINGLE 20:00  つじあやのさんNEW SINGLEを含むブックマーク  つじあやのさんNEW SINGLEのブックマークコメント

via: id:M-Ohta:20061204#1165232091

12/6発売みたい。僕も買おうと思います。楽譜が付くのはとてもうれしい。

さよなら愛してる

さよなら愛してる

参照: つじあやの「つじギフト?10th Anniversary BEST?」

[][] 18:22 を含むブックマーク のブックマークコメント

今から帰ります。