Prolog,一个单词在大文本中的频率

时间:2012-11-27 20:27:00

标签: prolog word-frequency

  

鉴于文本长度相当长,我需要找出某个单词出现多少次。像谢尔洛克小说,如果我输入Sherlock,给我200次或类似的东西。

到目前为止,我知道如何阅读我实施的这个功能列表,如下所示。我感谢所有的帮助,不知道接下来该做什么或如何做。

  

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

谢谢。

1 个答案:

答案 0 :(得分:0)

读取/ 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_word(W),而不是read / 1,其中一个单词只是一个字母数字序列

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_word / 1替换了read / 1,我们得到了

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

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