0

かなり長いテキストが与えられた場合、特定の単語がその中に何回出現するかを調べる必要があります。シャーロックの小説のように、シャーロックと入力すると、200 回またはそれに類するものが返ってきます。

これまでのところ、実装したこの関数を使用してリストを読み取る方法を知っています。以下に投稿します。私はすべての助けに感謝します.次に何をすべきか、どのようにすべきかわかりません.

read_list(L) :- read(N), N \= end_of_file -> L = [N|Ns], !, read_list(Ns) ; L = [] .

ありがとうございました。

4

1 に答える 1

0

read/1用語をフェッチし、その後に . しかし議論のために、この事実は無視しましょう。

単語の頻度に興味があるだけなら、なぜリストを作成するのでしょうか? 単語と一致を数えるだけで、ファイルの最後で頻度を計算します。

word_freq(W, Freq) :-
  word_count(W, 0, Total, 0, Match),
  Total > 0 -> Freq is Match / Total.

word_count(W, TotSoFar, Tot, MatchSoFar, Match) :-
  (  read(N),
     N \= end_of_file
  -> T1 is TotSoFar + 1,
     (  N == W
     -> M1 is MatchSoFar+1
     ;  M1 is MatchSoFar
     ),
     word_count(W, T1, Tot, M1, Match)
   ; TotSoFar = Tot,
     MatchSoFar = Match
   ).

テスト:

?- word_freq(a,F).
|: a.
|: b.
|: c.
|: a.
|: F = 0.5.

edit read/1 の代わりに、read_word(W) を定義しましょう。ここで、単語は単に一連の英数字です。

read_word(SoFar, W) :-
    get_code(C),
    (   C == -1
    ->  ( SoFar == [] -> W = end_of_file ; reverse(SoFar, W) )
    ;   code_type(C, alnum)
    ->  read_word([C|SoFar], W)
    ;   reverse(SoFar, W)
    ).

そのような醜いコードを装備し、read/1 を read_word/1 に置き換えると、次のようになります。

?- word_freq("ab",F).
|: a ab abc
|: F = 0.3333333333333333.

ここで、アトムではなくstringを渡していることに注意してください。

于 2012-11-27T20:48:55.997 に答える