よく使う単語 TOP100を取り出してみる
30分プログラム、その594。よく使う単語 TOP100を取り出してみる。
http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_067にインスパアされました。元のやつではmanページについて調べているけど、gz圧縮を展開するのが面倒だったので手元にあったソースコードでやってみました。
せっかくのErlangなので、シングルコアマシンなのにmapreduceを使いました。mapreduceのコードは、Source Code | The Pragmatic Bookshelfからとってきました。
使い方
$ escript wc.erl *
[{["="],252},
{["->"],147},
{["it"],66},
{["x"],38},
{["is"],37},
{["by"],37},
{["n"],36},
{["you"],35},
{["/"],35},
{["#!"],34},
{["coding:utf-8"],34},
{["Author:"],34},
{["MIZUNO"],34},
{["-*-"],34},
{["Copyright(C)"],34},
{["redistribute"],33},
{["Timestamp:"],33},
{["under"],33},
{["my"],33},
{["Hiroki"],33},
{["modify"],33},
{["software;"],33},
{["program"],33},
{["This"],33},
{["can"],33},
{["free"],33},
{["mzpppp"],31},
{["at"],31},
{["dot"],31},
ソースコード
-module(wc). -compile([export_all]). scan_words(Io,Words) -> case io:fread(Io,"","~s") of {ok,Word} -> scan_words(Io,[Word|Words]); {error,_} -> io:get_chars(Io,"",1), scan_words(Io,Words); eof -> file:close(Io), Words end. map(Pid,Path) -> {ok,F} = file:open(Path,[read]), lists:foreach(fun (W)-> Pid ! {W,1} end, scan_words(F,[])). %% F2(Key, [Val], AccIn) -> AccOut reduce(Word,Count, Counts) -> [{Word,lists:sum(Count)} | Counts]. main(Files)-> L = phofs:mapreduce(fun wc:map/2,fun wc:reduce/3,[],Files), io:format("~p~n", [lists:sublist(lists:sort(fun({_,X},{_,Y})-> Y < X end,L),100)]).