鉴于文本长度相当长,我需要找出某个单词出现多少次。像谢尔洛克小说,如果我输入Sherlock,给我200次或类似的东西。
到目前为止,我知道如何阅读我实施的这个功能列表,如下所示。我感谢所有的帮助,不知道接下来该做什么或如何做。
read_list(L): - 读(N),N \ = end_of_file - > L = [N | Ns],!,read_list(Ns) ; L = []
谢谢。
答案 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.
请注意,现在我传递字符串,而不是原子。