-1

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

经验:

string = "one two, tree  one two"

并得到:

one: 2
two: 2
tree: 1

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

更新 :

这是我的问题的解决方案,但输入应该排序,像这样(aaaabbbbbmmm)

 (define frequency (lambda(ls) 
           (if (null? ls) '() (freq_aux (car ls) 1 (cdr ls) '() ))))
           (define freq_aux (lambda(l n ls tmp ) ( if(null? ls)
           (cons (cons n l) tmp) (if(equal? l (car ls)) 
           (freq_aux l (+ 1 n) (cdr ls) tmp) 
           (freq_aux (car ls) 1 (cdr ls) (cons (cons n l) tmp))))))
4

1 回答 1

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)))))))
于 2013-05-02T02:20:07.063 回答