BiGram の実装
>これは話を振られたのかな?(笑)
>
>OCaml の場合に、関数的に書くのに拘りがなければ、次のように書くのがたぶん一番速い。
>
>(* bigram : string -> (char * char, int) Hashtbl.t *)
let bigram s =
let h = Hashtbl.create (String.length s) in
for i = 0 to String.length s - 2 do
let c = s.[i], s[i+1] in
if Hashtbl.mem h c then
Hashtbl.replace h c (Hashtbl.find h c + 1)
else
Hashtbl.add h c 1
done;
h
let bigram s =
let h = Hashtbl.create (String.length s) in
for i = 0 to String.length s - 2 do
let c = s.[i], s[i+1] in
if Hashtbl.mem h c then
Hashtbl.replace h c (Hashtbl.find h c + 1)
else
Hashtbl.add h c 1
done;
h
let _ =
let h = bigram Sys.argv.(0) in
Hashtbl.iter (fun (c1, c2) v -> Printf.printf "(%c, %c)\t%d\n" c1 c2 v) h
>
let bigram s =
let h = Hashtbl.create (String.length s) in
snd
(String.fold_left
(function
| (Some c1, h) c2 ->
if Hashtbl.mem h (c1, c2) then
Hashtbl.replace h (c1, c2) (Hashtbl.find h (c1, c2) + 1)
else
Hashtbl.add h (c1, c2) 1;
(Some c2, h)
| (None, h) c2 -> (Some c2, h))
s)
>