34 lines
957 B
Prolog
34 lines
957 B
Prolog
print_top_words(File, N):-
|
|
read_file_to_string(File, String, [encoding(utf8)]),
|
|
re_split("\\w+", String, Words),
|
|
lower_case(Words, Lower),
|
|
sort(1, @=<, Lower, Sorted),
|
|
merge_words(Sorted, Counted),
|
|
sort(2, @>, Counted, Top_words),
|
|
writef("Top %w words:\nRank\tCount\tWord\n", [N]),
|
|
print_top_words(Top_words, N, 1).
|
|
|
|
lower_case([_], []):-!.
|
|
lower_case([_, Word|Words], [Lower - 1|Rest]):-
|
|
string_lower(Word, Lower),
|
|
lower_case(Words, Rest).
|
|
|
|
merge_words([], []):-!.
|
|
merge_words([Word - C1, Word - C2|Words], Result):-
|
|
!,
|
|
C is C1 + C2,
|
|
merge_words([Word - C|Words], Result).
|
|
merge_words([W|Words], [W|Rest]):-
|
|
merge_words(Words, Rest).
|
|
|
|
print_top_words([], _, _):-!.
|
|
print_top_words(_, 0, _):-!.
|
|
print_top_words([Word - Count|Rest], N, R):-
|
|
writef("%w\t%w\t%w\n", [R, Count, Word]),
|
|
N1 is N - 1,
|
|
R1 is R + 1,
|
|
print_top_words(Rest, N1, R1).
|
|
|
|
main:-
|
|
print_top_words("135-0.txt", 10).
|