如何计算方案中每个单词的出现次数

时间:2013-05-01 21:00:45

标签: scheme

我正在尝试从文本文件中读取字符串;并使用方案提供关于每个单词出现的“统计数据”,并提供最常用的单词。

EXP:

string = "one two, tree  one two"

得到:

one: 2
two: 2
tree: 1

我可以使用一个简单的函数计数器对每个单词进行计数,并在屏幕上显示结果,但我找不到使用此结果显示例如最多5个用过的单词的方法,例如在巨大的输入文本中 - 例如一本书 - 。

1 个答案:

答案 0 :(得分:1)

以下是另一个StackOverflow问题的提示(我找不到)。

(define (tokenize file)
  (with-input-from-file file
    (lambda ()
      (let reading ((lines '()) (words '()) (chars '()))
        (let ((char (read-char)))
          (if (eof-object? char)
              (reverse lines)
              (case char
                ((#\newline) (reading (cons (reverse (cons (reverse chars) words)) lines) '() '()))
                ((#\space)   (reading lines (cons (reverse chars) words) '()))
                (else        (reading lines words (cons char chars))))))))))

这将返回一个行列表,这是一个单词列表,这是一个字符列表。你可以得到一个字符串列表:

(map list->string (apply append (tokenize <someffile>)))

从那起:

(define (frequency-alist words)
  (let ((alist '()))
    (let scanning ((words words))
      (if (null? words
          alist
          (let ((word (car words)))
            (cond ((assoc word alist)
                   => (lambda (al-item)
                         (set-cdr! al-item (+ 1 (cdr al-item)))))
                  (else (set! alist (cons (cons word 1) alist))))
            (scanning (cdr words)))))))