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.

编辑而不是 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.

请注意,现在我传递的是字符串,而不是原子。

于 2012-11-27T20:48:55.997 回答