View difference between Paste ID: bGaW7CkK and
SHOW: | | - or go back to the newest paste.
1-
1+
-module(markov).
2
-compile(export_all).
3
-author({jha, abhinav}).
4
-define(INITPOINT, 50).
5
-define(ARITY, 3).
6
start() -> start("corpus.txt").
7
start(Corpus) -> 
8
    {ok, Bin} = file:read_file(Corpus),
9
    Words = string:tokens(binary_to_list(Bin), "\n "),
10
    Tab = ets:new(words, [bag]),
11
    form_dictionary(Words, Tab, ?ARITY),
12
    Start = mrandom(?INITPOINT),
13
    State0 = lists:sublist(Words, Start, ?ARITY - 1),
14
    Sentence = spew(Tab, State0, []),
15
    ets:delete(Tab),
16
    io:format("~p~n", [string:join(Sentence, " ")]).
17
18
19
spew(Tab, [_|L]=State, Acc)->
20
    case (length(Acc) >= 20) and (string:rchr(lists:last(L), $.) =:= length(lists:last(L))) of 
21
        true -> lists:reverse(Acc);
22
        false -> 
23
            Objects = ets:lookup(Tab, list_to_tuple(State)),
24
            {_,Snew} = lists:nth(mrandom(length(Objects)), Objects),
25
            spew(Tab, L ++ [Snew], [Snew | Acc])
26
    end.
27
28
29
mrandom(Max) ->
30
    {A, B, C} = now(),
31
    random:seed(A,B,C),
32
    random:uniform(Max).
33
34
35
form_dictionary([], _, _) -> void;
36
form_dictionary([H|T], Tab, N)->
37
    ngrams([H|T], Tab, N, []),
38
    form_dictionary(T, Tab, N).
39
40
ngrams([], _, _, _) -> void;
41
ngrams([H|_], Tab, 1, Acc)-> ets:insert(Tab, {list_to_tuple(lists:reverse(Acc)), H});
42
ngrams([H|T], Tab, X, Acc)-> ngrams(T, Tab, X-1, [H|Acc]).