このディレクトリの索引
#  
#  お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム
#  

'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :-
        テキストファイルを読み込み(_テキストファイル,_文),
        'その中で最もよく使われている単語ベスト3を表示する'(_文).

テキストファイルを読み込み(_テキストファイル,_文) :-
        get_lines(_テキストファイル,_行ならび),
        atomic_list_concat(_行ならび,_文).

'その中で最もよく使われている単語ベスト3を表示する'(_文) :-
        形態素解析(文,_文,_形態素ならび),
        最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3),
        表示する(_最もよく使われている単語ベスト3).

その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :-
        setof(A,member(A,_形態素ならび),_単語ならぴ),
        findall([_度数,_単語],(
                    member(_単語,_単語ならび),
                    count(_単語,_形態素ならび,_度数)),
                LL),
        sort(LL,_整列したLL),
        append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL).

表示する([_単語1,_単語2,_単語3]) :-
        writef('%t %t %t\n',[_単語1,_単語2,_単語3]).

count(P,N) :-
        findsum(1,P,F),
        N is truncate(F).

findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        sum_list(_値ならび,_合計値),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

形態素解析サーバー(mecab).

形態素解析([],[]) :-!.
形態素解析([['EOS'|_]|_],[]) :-!.
形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :-
        形態素解析_2(R,R1,R2),
        形態素解析_2_重複削除([A,B|R1],[],R1_1),
        形態素解析(R2,R3),!.
形態素解析([[A|_]|R],[B|R2]) :-
        形態素解析サーバー(mecab),
        make_list(A,['\t'],AL),
        AL = [B|_],
        形態素解析(R,R2),!.
形態素解析([[A|_]|R],[A|R2]) :-
        形態素解析サーバー(juman),
        形態素解析(R,R2),!.

形態素解析_2([],[],[]) :- !.
形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :-
        \+(A = (@)),!.
形態素解析_2([[@,A|_]|R],[A|R2],R3) :-
        形態素解析_2(R,R2,R3),!.

形態素解析_2_重複削除([],L1,L) :-
        reverse(L1,L),!.
形態素解析_2_重複削除([A|R],Y,X) :-
        member(A,Y),
        形態素解析_2_重複削除(R,Y,X),!.
形態素解析_2_重複削除([A|R],Y,X) :-
        \+(member(A,Y)),
        形態素解析_2_重複削除(R,[A|Y],X).


形態素解析(ファイル,_テキストファイル,L) :-
        形態素解析サーバー(_形態素解析サーバー),
        concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S),
        sh(S,L1),
        形態素解析(L1,L2),
        形態素解析_3(L2,L).

形態素解析(文,S,L) :-
        tmpnam(_仮のファイル),
        tell(_仮のファイル),
        wr('%t',[S]),
        told,
        形態素解析(ファイル,_仮のファイル,L) .

形態素解析_3([],[]).
形態素解析_3([A|R],[A|R2]) :-
        \+(list(A)),
        形態素解析_3(R,R2) .
形態素解析_3([A|R],[B|R2]) :-
        list(A),
        member(B,A),
        形態素解析_3(R,R2).

system(Command,X) :-
        shell(Command,X).

system(Command) :-
        shell(Command).

popen(Command,Chars) :-
        open(pipe(Command),read,Instream),
        get_char(Instream,Char),
        popen(Instream,Char,Chars),
        close(Instream),!.

popen(Instream,end_of_file,[]) :- !.
popen(Instream,Char,[Char|R]) :-
        get_char(Instream,Char2),
        popen(Instream,Char2,R).

sh(Command,X) :-
        shs(Command,Y),
        findall(U,(
                    member(V,Y) ,
                    split(V,[' ',','],U)),
                X).

shs(Command,X) :-
        popen(Command,L),
        shs_3(L,X).

shs_3(L,[S|R]) :-
        append(L0,['\n'|R1],L),
        atom_chars(S,L0),
        shs_3(R1,R).
shs_3([],[]) :- !.
shs_3(L,[S]) :-
        atom_chars(S,L).

tmpnam(TMPNAM) :-
        乱数からTMPNAMを得る(TMPNAM),!.
tmpnam(TMPNAM) :-
        tmpnam(TMPNAM).

乱数からTMPNAMを得る(TMPNAM) :-
        アルファベットに変換([_1,_2,_3,_4,_5,_6]),
        atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM),
        \+(exists_file(TMPNAM)).

アルファベットに変換([]).
アルファベットに変換([A|R]) :-
        C is random(62),
        アルファベットに変換の二(C,A),
        アルファベットに変換(R).

アルファベットに変換の二(N,A) :-
        '基数62のコード・アルファベットコード変換表'(S,E,B),
        between(S,E,N),
        C is N - S + B,
        char_code(A,C).

'基数62のコード・アルファベットコード変換表'(0,9,48).
'基数62のコード・アルファベットコード変換表'(10,35,65).
'基数62のコード・アルファベットコード変換表'(36,60,97).